我目前正在使用 LLVM/clang-16(从 github 存储库构建)处理 OpenMP 卸载。使用 clang 中的内置分析工具(使用环境变量,如
LIBOMPTARGET_PROFILE=profile.json
和 LIBOMPTARGET_INFO
),我能够确认我的代码在我的 GPU 上执行,但是当我尝试使用 nvprof
或 分析代码时ncu
(来自 NVIDIA Nsight 工具套件)我收到一条错误/警告,指出分析器未检测到任何内核启动:
> ncu ./saxpy
Time of kernel: 0.000004
==WARNING== No kernels were profiled.
==WARNING== Profiling kernels launched by child processes requires the --target-processes all option.
这是我的测试代码:
#include <iostream>
#include <omp.h>
#include <cstdlib>
void saxpy(float a, float* x, float* y, int sz) {
double t = 0.0;
double tb, te;
tb = omp_get_wtime();
#pragma omp target teams distribute parallel for map(to:x[0:sz]) map(tofrom:y[0:sz])
{
for (int i = 0; i < sz; i++) {
y[i] = a * x[i] + y[i];
}
}
te = omp_get_wtime();
t = te - tb;
printf("Time of kernel: %lf\n", t);
}
int main() {
auto x = (float*) malloc(1000 * sizeof(float));
auto y = (float*) calloc(1000, sizeof(float));
for (int i = 0; i < 1000; i++) {
x[i] = i;
}
saxpy(42, x, y, 1000);
return 0;
}
使用以下命令编译:
> clang++ -fopenmp -fopenmp-targets=nvptx64-nvidia-cuda main.cpp -o saxpy --cuda-path=/opt/nvidia/hpc_sdk/Linux_x86_64/22.11/cuda/10.2 --offload-arch=sm_61 -fopenmp-offload-mandatory
我需要做什么才能启用分析?我见过其他人使用
ncu
进行 clang 编译的 OpenMP 卸载代码,无需额外的步骤,但也许我完全遗漏了一些东西。
通过查看使用
LIBOMPTARGET_DEBUG=1
执行程序时生成的调试输出,并在收到其他论坛的帮助后,我能够解决此问题。每当通过ncu
(或nsys
)启动程序时,都找不到OpenMP CUDA运行时库所需的文件。
解决方法是将这些库的路径添加到
LD_LIBRARY_PATH
环境变量(例如 export LD_LIBRARY_PATH=/opt/llvm/lib:$LD_LIBRARY_PATH
)。
NVIDIA 现在意识到了这个问题,并且正在“调查为什么会出现这种情况”。
通过 nsys 配置文件,我发现以下作品
nsys 配置文件 --stats=true --trace=openmp,cuda ./application [args]
这将生成可导入到 Nsight Systems profiler 的 nsys-rep 文件。