请大大帮看一下,我这个例子程序有神马问题?

照着网上的例子运行了一下,想计算一下GPU的运行时间。用了cudaEventElapsedTime()来算时间,可是最后costtime的值似乎没有存上,还是初始值0.
请问大大这是咋回事?

#include <stdio.h>
#include <stdlib.h>
#include “cuda_runtime_api.h”
#define DATA_SIZE 1048576

int data[DATA_SIZE];

//this function is to generate 0-9 digital number randomly.
void GenerateNumber(int* number, int size) {
for (int i=0; i<size;i++)
{
number[i]=rand()%10;
}
}

global static void sumOfSquares(int *num, int *result)
{
int sum = 0;
int i;
//clock_t start = clock();//
for (i=0; i<DATA_SIZE; i++)
{
sum+=num[i]*num[i];
}
*result = sum;
//*time = clock()-start;
}

int main() {
GenerateNumber(data,DATA_SIZE);
int *gpudata, *result;

cudaMalloc((void**)&gpudata,sizeof(int)*DATA_SIZE);
cudaMalloc((void**)&result,sizeof(int));
cudaMemcpy(gpudata,data,sizeof(int)*DATA_SIZE,cudaMemcpyHostToDevice);

cudaEvent_t start,stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start,0);

sumOfSquares<<<1,1,0>>>(gpudata,result);//input and output and time-return

cudaEventRecord(stop,0);
float costtime = 0;
cudaEventElapsedTime(&costtime,start,stop);
printf("time: %3.1f",costtime);
cudaEventDestroy(start);
cudaEventDestroy(stop);


int sum;
cudaMemcpy(&sum,result,sizeof(int),cudaMemcpyDeviceToHost);

cudaFree(gpudata);
cudaFree(result);

printf("sum=%d\n", sum);

//verify the result of GPU and CPU
sum = 0;
for(int i=0; i<DATA_SIZE; i++)
	sum +=data[i]*data[i];
printf("sum(CPU):%d\n",sum);

}

[attach]3370[/attach]

缺少cudaEventSynchronize

多谢大大,我在cudaEventRecord(stop,0);后面加了一个cudaEventSynchronize(stop);然后出时间了!thx::handshake
我想请问一下原因,是不是因为主程序(CPU)程序执行到kernel<<<>>>的时候,相当于分出去一个线程去执行kernel<<<>>>,然后不等device程序(GPU)结束返回,主程序就接着往下走了?
如果是这样的话,那cudaMemcpy会不会block住主程序呢?(即等待device运行完毕)

LZ您好:

kernel执行是异步的,是立即返回的,并不等于kernel执行完毕。

cudaMemcpy()是同步的,在执行完之后才返回。
以及有异步版本cudaMemcpyAsync(),异步版本是不等实际执行完就返回的。

祝您好运~

cudaEventSynchronize(stop); 是为了防止cudaEventElapsedTime(&costtime,start,stop);
执行时,cudaEventRecord(stop,0); 还没执行完。