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

CUDA事件是否计时cudaMalloc和cudaMemcpy执行?,cuda,gpu,cpu-usage,nvidia,timing,Cuda,Gpu,Cpu Usage,Nvidia,Timing,我使用以下代码来计时对cudamaloc()的调用。我很好奇:CUDA事件是只对我们的内核计时,还是也对“内置内核”计时。换句话说,以下计时方法是否有效 cudaEvent_t start, stop; cudaEventCreate(&start); cudaEventCreate(&stop); cudaEventRecord(start, 0); for(int t =0 ; t < 100 ; t++){ float* test; cudaMallo

我使用以下代码来计时对
cudamaloc()
的调用。我很好奇:CUDA事件是只对我们的内核计时,还是也对“内置内核”计时。换句话说,以下计时方法是否有效

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);
cudaEvent\u t启动、停止;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(开始,0);
对于(int t=0;t<100;t++){
浮动*试验;
Cudamaloc((无效**)和测试,3000000*sizeof(浮动));
cudaFree(测试);
}
cudaEventRecord(停止,0);
CUDAEVENTS同步(停止);
浮动时间;
cudaeventlassedtime(&elapsedTime、start、stop);
printf(“在GPU上经过的时间:%f ms”,elapsedTime/100);
cu(da)EventRecord()只不过是向GPU提交一个命令,告诉GPU在GPU处理该命令时写入一个时间戳。时间戳只是一个机载高分辨率计数器。因此,CUDA事件在用作GPU事件计时的异步机制时最有用,比如特定内核运行所需的时间。CUDA内存管理主要发生在CPU上,因此CUDA事件对于CUDA分配和空闲操作的计时并不理想


简言之:最好使用基于CPU的计时,比如gettimeofday()。

但是它会计时Cudamaloc吗?换句话说,当只需要内核执行的时间时,是否应该确保在第一个CUDAVENTRECORD和第二个CUDAVENTRECORD之间不调用任何其他函数,如cudaMalloc、cudaMemcpy或cudaFree?异步CUDA memcpy是公平的,但cudaMalloc()/cudaFree()可能会在驱动程序处理页表时暂停GPU。CUDA事件仍将愉快地记录答案中所述的计时,但它们的计时信息将没有那么有用。