3.10 使用Score-P和Vampir记录OpenACC运行时事件
编译器和运行时在实现OpenACC指令时有一定的自由度。因此,检查编译器和运行时对OpenACC指令转换和最终程序执行非常重要。例如,kernels指令触发设备初始化、设备内存分配和没有明确指定相应操作的数据传输。OpenACC 2.5引入的分析接口定义了一组事件,这些事件揭示了OpenACC指令的实现和执行细节。这使得Score-P之类的工具能够测量OpenACC区域的持续时间、在主机上的等待时间和任务提交开销,以及跟踪加速器上的内存分配。例如GPU内核开始和结束时间、CPU和GPU数据传输等更多的GPU事件可以使用CUDA的CUPTI接口或OpenCL库包装(Dietrich & Tschüter, 2015)。OpenACC事件将低级别加速器事件与应用程序的源代码相关联。OpenACC事件被标记为隐式或显式的,并且根据它们的类型,还可以提供有关数据传输的变量名或内核启动操作的内核名称的信息。
图3-12展示了Vampir可视化使用MPI、OpenMP和OpenACC的应用程序的执行间隔。在所选间隔中,两个MPI进程执行相同的程序区域,每个运行两个OpenMP线程和带有两个CUDA流的一个GPU。加速器活动是异步的,但是主机大部分时间在等待加速器活动的完成。例如,右边的调用树显示更新构件触发加速器向CPU的数据拷贝和等待操作。OpenACC和OpenMP区域使用文件名和行号注释以便于源代码相对应。