CUDA事件是否计时cudaMalloc和cudaMemcpy执行时间?

3

我正在使用以下代码计时对cudaMalloc()的调用。我很好奇:CUDA事件是否只计时我们自己创建的内核,还是也会计时“内部内核”?换句话说,以下计时cudaMalloc()的方法是否有效?

cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
for(int t =0 ; t < 100 ; t++){
    float* test;
    cudaMalloc((void**)&test, 3000000 * sizeof(float));
    cudaFree(test);
}
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime; 
cudaEventElapsedTime(&elapsedTime , start, stop);
printf("time elapsed on the GPU: %f ms", elapsedTime/100);
1个回答

2

cu(da)EventRecord()仅仅是向GPU提交一个命令,告诉GPU在处理该命令时写入一个时间戳。时间戳只是一个内置的高分辨率计数器。因此,当用于异步机制来计时GPU事件时,CUDA事件最为有用,例如特定内核运行的时间。CUDA内存管理主要发生在CPU上,因此CUDA事件不适合计时CUDA分配和释放操作。

简而言之:最好使用基于CPU的时间函数,例如gettimeofday()。


但是它是否计时cudaMalloc呢? 换句话说,当只需要内核执行的时间时,是否应该确保在第一个cudaEventRecord和第二个之间不调用任何其他函数,如cudaMemcpy、cudaFree等? - user2023370
异步CUDA memcpy是可以使用的,但是cudaMalloc()/cudaFree()可能会导致GPU停顿,因为驱动程序正在处理页表。 CUDA事件仍然可以愉快地记录时间,就像答案中描述的那样,但它们的时间信息可能不太有用。 - ArchaeaSoftware

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接