了解袖口分析 - 执行暂停?

Understanding cufft profiling - Execution pause?

我目前正在考虑分析包含 cufft 调用的应用程序。我正在使用 nvidia 可视化分析器。目前 mcpy 操作和 cufft 的执行之间存在差距,我不太了解。由于某种原因,memcpy 和 cufft 之间存在大约 0.75+ 秒的间隔。 "instrumentation" 在某些点上有红线?我不确定这意味着什么。我怀疑这个区域是袖带的规划部分。我是 运行 300 批次的 2d cufft 并使用 cufftplanmany。我有所怀疑,但不确定。如果有人能启发我或指出来源以找到有关该领域的更多信息,我会很高兴。

我附上了它的外观图片。 右边的模糊部分是 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);

此致

在主袖套呼叫之前进行初始袖套呼叫后,间隙移动了。因此,图像中看到的间隙很可能来自袖带初始化时间。