最近使用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]