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

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

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

(针对混合应用程序的 Score-P 工具基础架构)

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

Score-P 是一个开源的性能测量基础架构,它支持多种分析工具,例如 Vampir 和 CUBE(Cube Uniform Behavioral Encoding)1。Score-P 拥有庞大的社区用户群,支持包含 MPI、OpenMP、SHMEM2、CUDA、OpenCL 和 OpenACC 在内的多种编程模型,以及硬件计数器和 IO 信息3。Score-P 可以生成 CUBE4 格式的性能数据和 OTF24格式的跟踪数据。

1 Pavel Saviankou, Michael Knobloch, Anke Visser, and Bernd Mohr,“ Cube v4: From Performance Report Explorer to Performance Analysis Tool, ” Procedia Computer Science 51(2015): 1343-1352.

2 http://www.openshmem.org/site/ .

3 docs.cray.com/books/004-2178-002/06chap3.pdf .

4 Dominic Eschweiler et al.,“ Open Trace Format 2: The Next Generation of Scalable Trace Formats and Support Libraries, ” Applications, Tools and Techniques on the Road to Exascale Computing 22 (2012): 481-490.

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

图 3.2 二维雅可比求解器中 OpenACC 活动的 nvvp 可视化分析示例

与 NVIDIA 性能分析工具相比,Score-P 工具更加关注所有并行层面上程序并行化的全局优化。因此,Score-P 工具可以处理成百上千个进程、线程和加速器流(accelerator stream)。VI-HPS workshop material5和 Score-P documentation6提供了与 Score-P 分析工作流程有关的详细信息,可总结为以下步骤:

5 http://www.vi-hps.org/training/material/ .

6 https://silc.zih.tu-dresden.de/scorep-current/html/ .

1. 准备测量。

2. 生成性能数据。

a. 使用 CUBE 对性能数据进行可视化显示。

b. 评估跟踪文件尺寸。

c. 创建过滤文件。

3. 生成跟踪文件。

a.(可选地)自动分析跟踪文件。

b. 使用 Vampir 对跟踪文件进行可视化显示。

在测量开始前,必须准备好可执行文件。对 OpenACC 程序来说,最简单的方式是将 scorep --cuda --openacc 添加到编译器命令前,并重新编译应用程序。添加选项 cuda 和 openacc 的目的是将相应的 CUDA 和 OpenACC 测量组件链接到二进制文件中。执行 scorep --help 可以打印出所有可用选项的概要信息。

测量本身会受到一些环境变量的影响。变量 scorep-info config-vars 可以显示所有测量配置变量的列表,并带有简短描述。专用于 OpenACC 的是变量 SCOREP_OPENACC_ENABLE,可以赋值为使用逗号分隔的特性列表。

  • regions:记录 OpenACC 区域或导语。
  • wait:记录 OpenACC 等待操作。
  • enqueue:记录 OpenACC 入列 kernel、上传和下载操作。
  • device_alloc:记录 OpenACC 设备内存分配或释放次数。
  • kernel_properties:记录 kernel 启动操作的 kernel 名,以及 gang、worker 和 vector 尺寸。
  • variable_names:记录 OpenACC 数据分配和入列上传或下载的变量名。

正如在 OpenACC 2.5 规范中定义的那样,你必须将性能分析库静态链接到应用程序中,或者通过设置 ACC_PROFLIB=/path/to/shared/library 或 LD_PRELOAD=/path/to/shared/library 来指定共享库的路径。Score-P 的 OpenACC 性能分析库 libscorep_adapter_openacc_events.so 位于 Score-P 的 lib 目录下。

针对 CUDA 设备会有一些额外的信息可以记录,可以通过环境变量 SCOREP_CUDA_ENABLE 来指定记录哪些信息。相关选项如下:

  • driver:记录调用 CUDA 驱动 API 的运行时间。
  • kernel:记录 CUDA kernel。
  • memcpy:记录 CUDA 内存拷贝。
  • gpumemusage:记录 CUDA 内存分配或释放次数。
  • flushatexit:在程序退出时刷 CUDA 活动缓冲区。

如果需要的话,可以通过环境变量 SCOREP_CUDA_BUFFER(取值以字节为单位)来设置用于存储设备活动的设备内存大小。

为了避免不必要的测量开销,应该仔细选择要记录的事件。例如,OpenACC 的 enqueue 操作通常是非常短的区域,CUDA driver 特性通过跟踪 API 函数(如 cuLaunchKernel)包含类似的信息。在 OpenACC 和 CUDA 特性中都有跟踪设备内存分配或释放的选项。推荐使用这种低开销设置方法:OpenACC 的 regions 和 wait 特性,CUDA 的 kernel 和 memcpy 特性,这种设置方法可以提供足够的信息以关联 OpenACC 导语和 CUDA 设备活动。

如图 3.3 所示,使用 CUBE GUI 对混合了 MPI/OpenMP/OpenACC 的程序(来自印第安纳大学的 molecular dynamics code1)的性能数据进行可视化显示。在图左侧的 Metric tree 中选择独占运行时间(exclusive runtime),从中间 Flat view 中可以看出,CUDA kernel accel_296_gpu 在 GPU 上花费的时间最多(共计 73.63 秒)。kernel 启动后,主机立即开始等待它完成(代码位置在 int_ion_mix_acc.f 的第 296 行)。右侧的 System tree 显示进程、线程和 GPU 流的执行时间分布。

1 http://hgpu.org/?p=11116 .

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

图 3.3 使用 CUBE 对性能数据进行可视化显示示例

注:图中阴影反映了度量值的高低。

如图 3.4 所示,使用 Vampir 对 OTF2 跟踪数据(由 SPEC ACCEL2 363.swim 基准测试生成)进行可视化显示。所选的时间间隔说明了研究的详细程度。顶部的时间轴显示了一个主机流(标注为 Master thread),它触发了 CUDA 设备流(标注为 CUDA[0:13])上的活动。这两个执行流之间的黑线就是数据传输。所选数据传输的详细信息在右下角的 Context View 中显示。时间轴的每个区域都可以被选择以查看更多信息。右上角的 Function Summary 提供了程序执行过程所选时间间隔的性能数据信息。花费时间最多的区域是 swim.f 文件第 92 行的 OpenACC 启动操作,以及第 124 行 OpenACC 等待操作。CUDA 流显示了一些 CUDA kernel,但是 GPU 大多数时间是空闲的。下面的时间轴突出显示了处于关键路径上的区域,这是在程序执行中最长的路径,不包含任何等待状态。优化非关键路径上的区域,对整个程序运行时间没有任何影响。

2 Guido Juckeland et al.,“ SPEC ACCEL: A Standard Application Suite for Measuring Hardware Accelerator Performance, ” 5th International Workshop on Performance Modeling, Benchmarking and Simulation of High Performance Computer Systems (2014): 46-67.

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

图 3.4 使用 Vampir 对 SPEC ACCEL 363.swim 基准测试的跟踪数据进行可视化显示示例

注:GUI 提供了多种时间轴视图和统计显示。所有的 CUDA kernel 都在关键路径上(下面的时间轴),因此是理想的优化对象。

OTF2 跟踪数据可以提供 CUBE 性能数据无法提供的额外的 OpenACC 运行时信息。如果已经设置了 kernel_properties 特性,kernel 启动参数如 gang、worker 和 vector 尺寸会添加到跟踪数据中。variable_names 特性包括 OpenACC 数据分配和 OpenACC 数据移动的变量名。此外,还注释了隐式 OpenACC 操作。Vampir 将这些信息显示在 Context View 中,或者通过从这些属性中生成度量值,并以计数器的方式显示在 Counter Data Timeline 或 Performance Radar 中。所有 Vampir 视图都可以通过图 3.4 顶部的菜单或图标打开。

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

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

评论

发布