我需要计算GPU运行时代码,以及总运行代码(主机和设备)。 在我的代码中我运行了两个gpu内核,并在主机之间循环复制数据,下面的例子可以显示我的代码是什么样的
cuda event start
//FIRST kernel code call <<...>>
// cuda memory copy result back from device to host
CudadeviceSyncronize()
// copy host data to host array (CPU funtion loop)
// cuda memory copy from host to device
// SECOND Kernel call <<...>>
cuda event stop
//memory copy back from device to host
我所知道的是我使用事件来计算内核,事件精确地测量GPU在内核上的实际时间。所以我的问题&amp;目标是:
1-是我的方式我把上面显示的事件调用显示:将仅记录内核而忽略主机功能?
2-主机循环调用会影响cuda事件的时间吗?
3-我的目标是仅计算GPU,同时还计算GPU + CPU,上面会实现它还是应该使用clock_gettime(CLOCK_REALTIME,计时器)来计算主机?
答案 0 :(得分:2)
这样的序列:
float et;
cudaEvent_t start, stop;
cudaEventCreate(&start); cudaEventCreate(&stop);
cudaEventRecord(start);
kernel1<<<...>>>(...);
cudaDeviceSynchronize();
host_code_routine(...);
kernel2<<<...>>>(...);
cudaEventRecord(stop);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&et, start, stop);
将在et
中返回(大约) sum 的浮点运行时间(以毫秒为单位):
kernel1
执行时间host_code_routine
kernel2
执行时间如果你希望产生上面只有1和3的总和,你需要用cudaEvent定时序列括起每个内核(仅),然后在主机代码中手动求和这两个值。
回答你的问题,然后:
1-是我的方式我把上面显示的事件调用显示:将仅记录内核而忽略主机功能?
不,您描述的录音将捕获序列中的主机和设备已用时间。
2-主机循环调用会影响cuda事件的时间吗?
是
3-我的目标是仅计算GPU,同时还计算GPU + CPU,上面会实现它还是应该使用clock_gettime(CLOCK_REALTIME,计时器)来计算主机?
如果您想要个人时间和各种总和,我建议您独立计算内核时间,并使用一些基于主机的方法来计算主机代码,然后以您希望的方式组合各种组件。