使用NVIDIA Compute Visual Profiler的疑惑?

最近使用NVIDIA Compute Visual Profiler來評估cuda程式的效能,但是發現一個不知道怎麼解釋的現象,要來請教大家。


請看下圖:

我想問的問題是,

上面可以看到我的程式做了3件事,分別是
memcpyHtoD
fft
memcpyDtoH

為什麼GPU time跟CPU time以及GPU timestamp三個數字會對不起來呢?

以memcpyHtoD為例,GPU time + CPU time=160.835 us

但是接下來的GPU timestame卻顯示560.128 us

請問問甚麼會這樣呢?



補充一下…
我的程式大約是:

[Quote]#include <stdio.h>
#include <math.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cufft.h>

#define NX      256
#define BATCH   10

int main(int argc, char argv[])
{
        cufftHandle plan;
        cufftComplex devPtr;
        cufftComplex data[NXBATCH];
        int i;


<span =“apple-tab-span”="" style=“white-space:pre”> / source data creation /
        for(i=  0 ; i < NXBATCH ; i++){
                data【i】.x = 1.0f;
                data【i】.y = 1.0f;
        }

<span =“apple-tab-span”="" style=“white-space:pre”> /* GPU memory allocation /
        cudaMalloc((void*)&devPtr, sizeof(cufftComplex)NXBATCH);

<span =“apple-tab-span”="" style=“white-space:pre”> /* transfer to GPU memory /
        cudaMemcpy(devPtr, data, sizeof(cufftComplex)NXBATCH, cudaMemcpyHostToDevice);

        / creates 1D FFT plan /
        cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);

        / executes FFT processes /
        cufftExecC2C(plan, devPtr, devPtr, CUFFT_FORWARD);

        / executes FFT processes (inverse transformation) /
        cufftExecC2C(plan, devPtr, devPtr, CUFFT_INVERSE);

<span =“apple-tab-span”="" style=“white-space:pre”> / transfer results from GPU memory /
        cudaMemcpy(data, devPtr, sizeof(cufftComplex)NXBATCH, cudaMemcpyDeviceToHost);

        / deletes CUFFT plan /
        cufftDestroy(plan);

<span =“apple-tab-span”="" style=“white-space:pre”> / frees GPU memory /
        cudaFree(devPtr);

        for(i = 0 ; i < NXBATCH ; i++){
                printf(“data[%d] %f %f\n”, i, data【i】.x, data【i】.y);
        }

        return 0;
}[/Quote]