3.4 通过代码插装准备性能测量
为了获得非常详细的性能数据,需要修改测试应用程序源代码,以便将事件推送到性能监视器。这个过程称为插装。Score-P使用编译器插装,这意味着使用编译器额外选项来生成所有函数入口和出口,Score-P处理这些出/入口的回调。这些回调是之前介绍的事件。这当然需要编译器支持回调注入,而当前大多数编译器都会这么做。
可以使用提供的性能工具接口、包装库或源码转换来自动插装到所有的并行范例(MPI、OpenMP、Pthreads、OpenACC、CUDA、OpenCL、OpenSHMEM或任何组合)中。因此Score-P可以直接记录所有活动,而不需要手动修改测试应用程序的源代码。
为了调用编译器插装,Score-P为大多数常见编译器提供了编译器包装器。这些包装器通过编译器插装必要的回调来添加正确的标志。称为scorep的包装器脚本提供对这些包装器的访问,如图3-4所示。
在链接步骤中,可能有必要在Score-P包装器未正确检测到加速器的情况下显示指定加速器。对于PIConGPU,必须告知链接整个应用程序的Score-P MPI编译器包装器目标是CUDA应用程序,以便将相应的CUDA监视器插件链接到应用程序中来记录CUDA活动。即将发布的Score-P 3.0版本还将包括OpenACC事件记录,这要通过OpenACC性能工具API来实现。这需要编译器支持这些API,同时可能还要传递--penacc参数给Score-P编译器包装器。
上面的例子说明了代码插装的一般原理。对于PIConGPU,代码装入稍微复杂一些。首先,由于不想记录诸如构造和析构函数,因此编译这些函数时不会插装。此外,为编译器插装提供过滤列表,插装时将排除这些过滤函数。一般来说,根据需求添加底层细节代码,以尽可能少的运行时开销来捕获每个周期里的四个阶段。
Score-P 2.0通过采样来获得应用程序活动的数据。为了使用这个特性,需要插装应用程序以便使用事件来记录并行库活动,并且需要外部工具来获取调用堆栈。