所以我将 cuFFT 与 CUDA 流功能结合使用。我遇到的问题是我似乎无法让 cuFFT 内核完全并发运行。以下是我从 nvvp 得到的结果。每个流都在 128 个大小为 128x128 的图像上运行 2D 批量 FFT 内核。我设置了 3 个流来运行 3 个独立的 FFT 批处理计划。
从图中可以看出,一些内存副本(黄色条)与一些内核计算(紫色、棕色和粉色条)同时进行。但是内核运行根本不是并发的。正如您所注意到的,每个内核都严格遵循彼此。以下是我用于将内存复制到设备和内核启动的代码。
for (unsigned int j = 0; j < NUM_IMAGES; j++ ) {
gpuErrchk( cudaMemcpyAsync( dev_pointers_in[j],
image_vector[j],
NX*NY*NZ*sizeof(SimPixelType),
cudaMemcpyHostToDevice,
streams_fft[j]) );
gpuErrchk( cudaMemcpyAsync( dev_pointers_out[j],
out,
NX*NY*NZ*sizeof(cufftDoubleComplex),
cudaMemcpyHostToDevice,
streams_fft[j] ) );
cufftExecD2Z( planr2c[j],
(SimPixelType*)dev_pointers_in[j],
(cufftDoubleComplex*)dev_pointers_out[j]);
}
然后我更改了我的代码,以便我完成所有内存副本(同步)并将所有内核一次发送到流,我得到了以下分析结果:
然后我被确认内核没有以并发方式运行。
我查看了一个链接,该链接详细解释了如何通过在#include 或代码中传递“–default-stream per-thread”命令行参数或#define CUDA_API_PER_THREAD_DEFAULT_STREAM 来设置利用完全并发。这是 CUDA 7 中引入的一个功能。我在我的 MacBook Pro Retina 15' 上使用 GeForce GT750M(与上面链接中使用的机器相同)运行了上面链接中的示例代码,并且我能够获得并发内核运行。但是我无法让我的 cuFFT 内核并行运行。
然后我发现这个链接有人说 cuFFT 内核将占用整个 GPU,因此没有两个 cuFFT 内核并行运行。然后我被卡住了。因为我没有找到任何正式的文档来说明 CUFFT 是否启用并发内核。这是真的吗?有没有办法解决这个问题?