如何在分析器中查看 CUDA 库函数调用?

How to view CUDA library function calls in profiler?

我正在使用 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);

在库的入口点,库调用就像对 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 Tools Extension) library to annotate your source code, which will cause those annotations to show up in the profiler output. You might want to put an NVTX range event

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

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

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

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