【问题标题】:How to view CUDA library function calls in profiler?如何在分析器中查看 CUDA 库函数调用?
【发布时间】:2015-07-13 15:48:39
【问题描述】:

我正在使用 cuFFT 库。如何修改我的代码以在 NVIDIA Visual Profiler NVVP 中查看来自该库(或任何其他 CUDA 库)的函数调用?我正在使用 Windows 和 Visual Studio 2013。

下面是我的代码。我将图像和过滤器转换为傅立叶域,然后在我编写的自定义 CUDA 内核中执行逐点复矩阵乘法,然后简单地对过滤后的图像频谱执行逆 DFT。结果是准确的,但我无法弄清楚如何在分析器中查看 cuFFT 函数。

// Execute FFT Plans
cufftExecR2C(fftPlanFwd, (cufftReal *)d_in, (cufftComplex *)d_img_Spectrum);
cufftExecR2C(fftPlanFwd, (cufftReal *)d_filter, (cufftComplex *)d_filter_Spectrum);

// Perform complex pointwise muliplication on filter spectrum and image spectrum
pointWise_complex_matrix_mult_kernel << <grid, block >> >(d_img_Spectrum, d_filter_Spectrum, d_filtered_Spectrum, ROWS, COLS);

// Execute FFT^-1 Plan                  
cufftExecC2R(fftPlanInv, (cufftComplex *)d_filtered_Spectrum, (cufftReal *)d_out);

【问题讨论】:

    标签: cuda cufft nvvp


    【解决方案1】:

    在库的入口点,库调用与对 C 或 C++ 库的任何其他调用一样:它在主机上执行。在该库调用中,可能会调用 CUDA 内核或其他 CUDA API 函数,用于支持 CUDA GPU 的库,例如 CUFFT。

    分析器(至少在 CUDA 7.0 之前 - 请参阅下面关于 CUDA 7.5 nvprof 的说明)本身不支持对主机代码进行分析。他们主要关注内核调用和CUDA API 调用。对像 CUFFT 这样的库的调用本身不被视为 CUDA API 调用。

    您尚未显示完整的分析器输出,但您应该看到 CUFFT 库进行 CUDA 内核调用;这些将显示在分析器输出中。 pointWise_complex_matrix_mult_kernel 之前的前两个 CUFFT 调用应该有一个或多个内核调用,每个调用都显示在该内核的左侧,最后一个 CUFFT 调用应该有一个或多个内核调用显示在该内核的右侧.

    让主机代码的特定部分显示在分析器中的一种可能方法是使用NVTX(NVIDIA 工具扩展)库来注释您的源代码,这将导致这些注释显示在分析器输出中.您可能希望在您希望在探查器输出中识别的库调用周围放置一个NVTX range event

    另一种方法是在 CUDA 7.5 中试用 nvprof 中的新 CPU 分析功能。您可以参考 CUDA 7.5RC 随附的 Profiler 指南的第 3.4 节。

    最后,普通主机分析器应该能够分析您的 CUDA 应用程序,包括 CUFFT 库调用,但它们无法了解 GPU 上发生的情况。

    编辑:根据下面 cmets 中的讨论,您的代码似乎类似于 simpleCUFFT sample code。当我在 Win7 x64、VS 2013 Community 和 CUDA 7 上编译和分析该代码时,我得到以下输出(放大以描绘时间线中有趣的部分):

    您可以看到,在该代码中出现的复杂逐点乘法和缩放内核之前和之后都调用了 CUFFT 内核。我的建议是首先使用 simpleCUFFT 示例代码而不是您自己的代码做一些类似的事情,然后看看您是否可以复制上面的输出。如果是这样,问题出在您的代码中(可能您的 CUFFT 调用失败,可能您需要添加适当的错误检查等)

    【讨论】:

    • 对于 nvToolsExt,您可能希望将 nvtxRangePush 和 nvtxRangePop 用于线程级别范围,将 nvtxRangeStart 和 nvtxRangeEnd 用于进程级别范围。
    • 你说我没有显示完整的分析器输出,因为它没有显示 cuFFT 函数进行的内核调用。如何显示完整的分析器输出以显示这些内核调用?
    • 缩小时间线。
    • 这里是缩小的时间线。我没有看到 cuFFT 函数的内核调用。我做错了吗?
    • 链接中的图像是完全缩小的分析器。 postimg.org/image/6bz1sc2nn 我没有看到与 cuFFt 函数调用相关的内核启动。我做错了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多