如何在Profiler中查看CUDA库函数调用?

时间:2015-07-13 15:48:39

标签: cuda cufft nvvp

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

enter image description here

1 个答案:

答案 0 :(得分:3)

在库的入口点,库调用就像对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上发生的事情。

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

nvvp profiler timeline for simpleCUFFT sample code

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