如何分析由 clang 编译的 OpenMP 卸载代码

问题描述 投票:0回答:2

我目前正在使用 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 卸载代码,无需额外的步骤,但也许我完全遗漏了一些东西。

c++ clang openmp nsight
2个回答
1
投票

通过查看使用

LIBOMPTARGET_DEBUG=1
执行程序时生成的调试输出,并在收到其他论坛的帮助后,我能够解决此问题。每当通过
ncu
(或
nsys
)启动程序时,都找不到OpenMP CUDA运行时库所需的文件。

解决方法是将这些库的路径添加到

LD_LIBRARY_PATH
环境变量(例如
export LD_LIBRARY_PATH=/opt/llvm/lib:$LD_LIBRARY_PATH
)。

NVIDIA 现在意识到了这个问题,并且正在“调查为什么会出现这种情况”。


0
投票

通过 nsys 配置文件,我发现以下作品

nsys 配置文件 --stats=true --trace=openmp,cuda ./application [args]

这将生成可导入到 Nsight Systems profiler 的 nsys-rep 文件。

© www.soinside.com 2019 - 2024. All rights reserved.