OpenACC 高性能并行编程:概念与策略 (36):OpenACC 编程工具 3.3.8

阅读数:1 2020 年 1 月 8 日 19:24

OpenACC高性能并行编程:概念与策略(36):OpenACC编程工具 3.3.8

(TAU 性能系统)

内容简介
本书是介绍大规模并行编程 OpenACC 的综合实践性书籍之一。书中前 3 章介绍了 OpenACC 背后的概念和 OpenACC 开发工具;第 4 章至第 7 章带你了解第 1 个真实世界的 OpenACC 程序,并揭示 OpenACC 程序编译背后的魔力,从而引入更多概念;第 8 章至第 10 章涵盖高级主题,例如 OpenACC 的替代方案、底层设备交互、多设备编程和任务并行性;第 11 章和第 12 章探讨了 OpenACC 实现潜在新语言特性的各种研究领域。

TAU 是一个多功能的性能分析工具套件,支持所有的并行编程范例与并行执行平台。它支持混合并行应用程序的性能测量(性能分析和跟踪),并可以捕获 OpenACC 程序的内部工作方式以识别主机和设备的性能问题。集成的 TAU 性能系统是开源的,包含如下工具:源码分析(PDT)、并行性能分析(ParaProf),性能数据挖掘(PerfExplorer)和性能数据管理(TAUdb)。

为了观察并行执行程序并生成例程级和语句级的性能数据,TAU 提供基于探测(probe-based)的检测和基于事件(event-based)的采样。基于探测的检测依赖于一对括号内开始和结束的间隔事件,基于事件的采样依赖于在检查程序状态时生成的周期性中断。TAU 具备在多个级别(源码、库、编译器和二进制)公开代码区域(例如例程和循环)的强大机制,TAU 的检测是基于此机制实现的。这些特性始终如一地协同工作,并与观察运行时库中的并行性能事件的机制集成在一起。这里所说的运行时库包括 MPI、pthread、OpenMP(经由 OMPT)、CUDA(经由 CUPTI)和 OpenACC。

TAU 完全支持 OpenACC 2.5 性能分析接口。TAU 中基于检测的性能测量可以使用诸如 PAPI 的库来测量硬件性能计数,也可以使用 Score-P、VampirTrace、OTF2 生成性能数据和跟踪数据。另外,TAU 提供了特殊的测量选项,可以捕捉用户自定义事件、上下文事件、调用参数、执行阶段等性能数据。

TAU 也支持基于事件的采样(EBS),以便在程序执行被中断时捕获性能数据。中断既可以使用周期性的间隔定时器触发,也可以在硬件计数器溢出时发生。通过采样,可以实现语句级的细粒度性能测量,就如同在一个例程中聚合所有语句级的性能。TAU 是为数不多的同时支持基于探测的检测和基于事件的采样的系统之一。它是唯一可以将运行时的性能数据集成到一个混合性能数据的工具1

1 Alan Morris, Allen D. Malony, Sameer Shende, and Kevin Huck,“ Design and Implementation of a Hybrid Parallel Performance Measurement System, ” Proc. International Conference on Parallel Processing (ICPP '10) (2010).

为了自动激活 TAU 并行性能测量,开发了命令 tau_exec。提供给 tau_exec 的命令行选项用于确定启用了哪些检测功能。例如,若要获得使用 OpenACC 的 MPI 应用程序的并行性能数据,可以使用以下命令启动应用程序:

OpenACC高性能并行编程:概念与策略(36):OpenACC编程工具 3.3.8

这个命令会从基于检测的 OpenACC 性能分析接口(-openacc)中收集性能数据,也会从基于事件的采样(-ebs)中收集性能数据。在本例中,每一个 MPI 进程都会生成单独的性能数据。注意,如果 OpenACC 卸载到使用多线程的 CPU“设备”,每个执行线程都有它自己的性能数据。

当应用程序被 tau_exec 启动时,TAU 的并行性能分析浏览器(ParaProf)可对生成的性能数据进行分析。图 3.5 展示了 ParaProf 的线程统计窗口,该窗口显示的是针对 Cactus BenchADM 基准测试2(在 OpenACC 的 PGI 教程中提到过)的性能数据分析。因为这个性能实验启用了基于事件的采样,因此 ParaProf 展示了一个混合性能的视图,在视图中 [SAMPLE] 显示的是 EBS 采样测量,[SUMMARY] 显示的是例程中所有事件的汇总;“[CONTEXT]”显示的是父节点的 EBS 采样聚合的“上下文”。所有其他标识符都是基于检测的测量。

2 PGI,“ Building Cactus BenchADM with PGI Accelerator Compilers, ” PGI Insider, 2017, http://www.pgroup.com/lit/articles/insider/v1n2a4.htm .

在图 3.5 中,你可以看到 bench_staggeredleapfrog2 例程(可在文件 StaggeredLeapfrog2_acc2.F 中找到)的 openacc_enter_data 事件所调用的底层例程。

OpenACC高性能并行编程:概念与策略(36):OpenACC编程工具 3.3.8

图 3.5 TAU ParaProf 线程统计窗口示例,以树形结构显示花费在 OpenACC 和主机代码段的时间

注意:该例程在文件的第 369 行(就在 enter data 事件下面)调用 openacc_enqueue_upload 事件。如独占时间(exclusive)和包含时间(inclusive time)列中所示,这个操作花费了 5.725 秒。你还可以看到在例程 __c_mcopy8(来自 libpgc.so 的底层例程)中生成的采样信息。推测该例程大概是在拷贝数据。如 EBS 测量中报告的那样,这个例程执行了 6.03 秒3

3 注意:TAU 生成的调用路径性能数据可以将事件嵌套显示到一个具体的调用路径深度。可以使用一对环境变量来启用调用路径性能分析(TAU_CALLPATH)和设置深度(TAU_CALLPATH_DEPTH)。在本例中,这两个变量分别设置为 1 和 1000。

阴影表示性能强度。例如,采样到的第 344 行 bench_staggeredleapfrog2_ 例程花费 17.817 秒之多,而最顶层的总包含时间(inclusive time)为 35.853 秒(标识为 TAU Application 例程)。正如你在图 3.5 中看到的,通过点击右键并选择一行代码,你可以选择“Show Source Code”选项以启动源码浏览器。结果如图 3.6 所示。看来这是一个高密度的计算循环,可以通过 OpenACC 构件迁移到 GPU 上。你可以轻易地打开额外的测量,例如硬件计数器,来进一步研究性能行为。

OpenACC高性能并行编程:概念与策略(36):OpenACC编程工具 3.3.8

图 3.6 TAU ParaProf 源码浏览器窗口示例,显示第 344 行最内层的循环,在这里应用程序花费了 17.817 秒

OpenACC高性能并行编程:概念与策略(36):OpenACC编程工具 3.3.8

购书地址 https://item.jd.com/12596484.html?dist=jd

评论

发布