我可以在 C 源代码级别分析 OpenACC 内核吗?

Can I profile OpenACC kernel in C source code level?

我正在尝试使用带有 PGI 15.7 编译器的 openacc 加速我的代码。

我想在 C 源代码级别分析我的代码。 我正在使用来自 CUDA 7.0 的 'nvvp' 分析器 当我 运行 nvvp 时,我可以使用 'analysis tap' 并且可以得到哪个延迟是我的代码变慢的原因。 (数据依赖、条件分支和带宽...等)

但是,我无法进行基于行的分析,只能进行'kernel'级别的分析。 (例如 main_300_gpu 内核使用了 10 秒)。 所以我很难知道我必须在哪里修复代码。

有什么方法可以在源代码级别分析我的代码

我正在使用

PGI 15.7(使用 pgcc)

CUDA 7.0

英伟达 GTX 960

Ubuntu 14.04 LTS x86_64

[我的 nvvp 报告截图]

目前(在 CUDA 7.5 或更高版本上,使用 cc5.2 或更高版本的 GPU),nvvp 分析器 can associate 各种采样执行 activity 和 CUDA C/C++ 行源代码。

但是,目前,此功能并未扩展到 OpenACC C/C++(或 Fortran)源代码行。

不过,应该仍然可以将 activity 与反汇编关联起来,并且可以将 PGI nollvm option 生成的中间 C 源文件关联起来。然而,这些都与您的 OpenACC 源代码没有太多相似之处。

使用 PGI 工具分析 OpenACC 代码的另一个选项是在执行代码之前设置 PGI_ACC_TIME=1 环境变量。这将使运行时内置的轻量级分析器能够对 OpenACC 代码的执行特征进行一些分析,特别是那些与加速器区域相关的部分。输出带有注释,因此您可以参考源代码行。

您也可以尝试添加标志“-ta=tesla:lineinfo”,让编译器为探查器添加源代码关联(它与 nvcc --lineinfo 的标志相同)。尽管正如 Bob 所指出的那样,代码可能已经过大量转换,因此行信息很多不会直接对应回您的原始来源。