【问题标题】:do CUDA events time cudaMalloc and cudaMemcpy executions?CUDA 事件时间 cudaMalloc 和 cudaMemcpy 执行?
【发布时间】:2012-01-21 07:14:51
【问题描述】:

我正在使用以下代码来计时对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);

【问题讨论】:

    标签: cuda gpu cpu-usage nvidia timing


    【解决方案1】:

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

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

    【讨论】:

    • 但是 cudaMalloc 是否计时?换句话说,当只需要内核执行时间时,是否应该确保在第一个 cudaEventRecord 和第二个 cudaEventRecord 之间不调用其他任何东西,例如 cudaMalloc、cudaMemcpy 或 cudaFree?
    • 异步 CUDA memcpy 是公平的游戏,但 cudaMalloc()/cudaFree() 可能会在驱动程序弄乱页表时停止 GPU。 CUDA 事件仍然会按照答案中的描述愉快地记录时间,但它们的时间信息不会那么有用。
    猜你喜欢
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2020-03-07
    • 2016-06-03
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多