【发布时间】:2016-09-20 21:46:59
【问题描述】:
我目前正在研究分析一个包含 cufft 调用的应用程序。我正在使用 nvidia 视觉分析器。目前在 mcpy 操作和 cufft 执行之间存在差距,我不太了解。由于某种原因,memcpy 和 cufft 之间存在大约 0.75+ 秒的间隙。在某些时候,“仪表”有红线?我不确定这意味着什么。我怀疑这个区域是袖口的规划部分。我正在运行 300 批次的 2d cufft 并使用 cufftplanmany。我有我的怀疑,但不确定。如果有人可以启发我或将我指向一个来源以找到有关该领域的更多信息,我会很高兴。
我附上了它的外观图片。 右边的 blut 部分是 cufft 执行,左边的棕色是 memcpy 和 malloc。我也想知道为什么在整个过程中它只是在顶部说cudafree。
编辑:这是代码。第一部分是memcpy和malloc,第二部分是规划和fft执行
int TotalSearchSize = TempSearchArea*loadsize;
int mem_size = sizeof(Complex)* TotalSearchSize;
cufftComplex *d_signal;
checkCudaErrors(cudaMalloc((void **)&d_signal, mem_size));
checkCudaErrors(cudaMemcpy(d_signal, imageNew, mem_size, cudaMemcpyHostToDevice));
cufftComplex *d_signal_result;
checkCudaErrors(cudaMalloc((void **)&d_signal_result, mem_size));
cufftComplex *d_filter_kernel;
checkCudaErrors(cudaMalloc((void **)&d_filter_kernel, mem_size));
checkCudaErrors(cudaMemcpy(d_filter_kernel, tempNew, mem_size, cudaMemcpyHostToDevice));
int rankSize = 2;
int rank[2];
rank[0] = TempSearchSizeY; rank[1] = TempSearchSizeX;
cufftHandle plan;
cufftPlanMany(&plan, rankSize, rank, NULL, 1, 0, NULL, 1, 0, CUFFT_C2C, loadsize);
printf("Transforming signal cufftExecR2C\n");
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_FORWARD);
cufftExecC2C(plan, (cufftComplex *)d_filter_kernel, (cufftComplex *)d_filter_kernel, CUFFT_FORWARD);
最好的问候
【问题讨论】:
-
这可能是 cufft 库的初始化时间。如果不显示相应的代码,很难说。
-
好的,我将编辑这部分代码。
-
这些是您代码中的第一个此类调用吗?或者在这些之前你还有其他的 CUFFT 和 CUDA 操作吗?
-
这是第一个袖口电话。在此之前我有 cuda 调用,但它运行正常。
-
差距可能是 cufft 库初始化时间。尝试在此代码之前放置一个包含 exec 调用的 cufft 序列。我想你会看到差距移动到那个序列并从这个序列中消失。