使用CUDA时如何测量每个块的执行时间?

时间:2010-08-24 05:50:18

标签: cuda gpu parallel-processing

clock()不够准确。

3 个答案:

答案 0 :(得分:12)

使用CUDA事件测量内核或CUDA操作的时间(memcpy等):

// Prepare
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
// Start record
cudaEventRecord(start, 0);
// Do something on GPU
MyKernel<<<dimGrid, dimBlock>>>(input_data, output_data);
// Stop event
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime;
cudaEventElapsedTime(&elapsedTime, start, stop); // that's our time!
// Clean up:
cudaEventDestroy(start);
cudaEventDestroy(stop);

参见CUDA编程指南,第3.2.7.6节

答案 1 :(得分:0)

如何在每个CUDA线程中使用clock()函数来计算开始和结束时间。并将其存储在一个数组中,以便您可以根据以下数组索引确定哪个线程在哪个时间开始/停止:

__global__ void kclock(unsigned int *ts) {
    unsigned int start_time = 0, stop_time = 0;

    start_time = clock();

    // Code we need to measure should go here.

    stop_time = clock();

    ts[(blockIdx.x * blockDim.x + threadIdx.x) * 2] = start_time;
    ts[(blockIdx.x * blockDim.x + threadIdx.x) * 2 + 1] = stop_time; 
} 

然后使用此数组计算出您正在考虑的块的最小开始时间和最长停止时间。例如,您可以计算与CUDA中的(0,0)块对应的时间数组的索引范围,并使用min / max来计算执行时间。

答案 2 :(得分:0)

我认为long long int clock64()正是你要找的?

参见Cuda编程指南,C语言扩展,B。11。