C语言 nvprof 不接收任何 API 调用或内核



我正在尝试使用 nvprof 在我的 CUDA 程序中获取一些基准时间,但不幸的是,它似乎没有分析任何 API 调用或内核。我寻找一个简单的初学者示例以确保我做得正确,并在 Nvidia 开发博客上找到了一个:

https://devblogs.nvidia.com/parallelforall/how-optimize-data-transfers-cuda-cc/

法典:

int main()
{
    const unsigned int N = 1048576;
    const unsigned int bytes = N * sizeof(int);
    int *h_a = (int*)malloc(bytes);
    int *d_a;
    cudaMalloc((int**)&d_a, bytes);
    memset(h_a, 0, bytes);
    cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);
    cudaMemcpy(h_a, d_a, bytes, cudaMemcpyDeviceToHost);
    return 0;
}

命令行:

-bash-4.2$ nvcc profile.cu -o profile_test
-bash-4.2$ nvprof ./profile_test

所以我逐字逐句地复制它,并运行相同的命令行参数。不幸的是,我的结果是一样的:

-bash-4.2$ nvprof ./profile_test
==85454== NVPROF is profiling process 85454, command: ./profile_test
==85454== Profiling application: ./profile_test
==85454== Profiling result:
No kernels were profiled.
==85454== API calls:
No API activities were profiled. 

我正在运行 Nvidia 工具包 7.5

如果有人知道我做错了什么,我将不胜感激知道答案。

-----编辑-----

所以我将代码修改为

#include<cuda_profiler_api.h>
int main()
{
    cudaProfilerStart();
    const unsigned int N = 1048576;
    const unsigned int bytes = N * sizeof(int);
    int *h_a = (int*)malloc(bytes);
    int *d_a;
    cudaMalloc((int**)&d_a, bytes);
    memset(h_a, 0, bytes);
    cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);
    cudaMemcpy(h_a, d_a, bytes, cudaMemcpyDeviceToHost);
    cudaProfilerStop();
    return 0;
}

不幸的是,它并没有改变事情。

这是一个具有统一内存分析的错误,标志

--unified-memory-profiling off  ./profile_test

为我解决了所有问题。

您需要

在退出线程之前调用cudaProfilerStop()(对于运行时 API(。这允许nvprof收集所有必要的数据。

根据CUDA文档:

为避免丢失尚未刷新的配置文件信息,将 正在分析的应用程序应在退出之前确保所有 GPU 工作已完成(使用 CUDA 同步调用(,然后调用 cudaProfilerStop()cuProfilerStop() .这样做会强制缓冲 要刷新的相应上下文的配置文件信息。

相关内容

  • 没有找到相关文章

最新更新