GPU高性能计算CUDA编程:完成时间戳
声明:本文不做商用
我们将GPU→CPU传输结束时的时间戳存放在time4中,准备好计算每个事件所需的时间,如下所示:
cudaEventSynchronize(time1);
cudaEventSynchronize(time2);
cudaEventSynchronize(time3);
cudaEventSynchronize(time4);
cudaEventElapsedTime(&totalTime,time1,time4);
cudaEventElapsedTime(&tfrCPUtoGPU,time1,time2);
cudaEventElapsedTime(&kernelExecutionTime,time2,time3);
cudaEventElapsedTime(&tfrGPUtoCPU,time3,time4);
变量 time1、time2、time3 和 time4 都是 CPU端变量,存储了CPU 和 GPU 之间进行数据传输时的时间戳,以及GPU代码在设备端执行过程中的时间戳。上面代码中一个奇怪的地方是,我们只用Nvidia的API为与GPU相关的事件添加时间戳。任何涉及GPU的东西都必须用Nvidia的API来得到时间戳,此处是cudaEventRecord()。参见【0voice C++】但为什么?为什么我们不能简单地使用表现优异的gettimeofday()函数?我们在CPU代码清单中看到过它。
cudaEventSynchronize()告诉Nvidia运行时引擎对给定的事件执行同步操作,以确保变量 timel、…、time4具有正确的时间值。因为它们不是简单的数据类型,所以需要使用cudaEventElapsedTime()来计算它们之间的差值。例如,time1 和time4之间的差值表示数据离开CPU并到达GPU,以及GPU处理这些数据并返回给CPU内存这个过程所需要的所有时间。其余的很容易理解。