计算CUDA编程的设备和主机的时间执行

时间:2015-05-25 13:08:38

标签: c++ time cuda

我需要计算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,计时器)来计算主机?

1 个答案:

答案 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 的浮点运行时间(以毫秒为单位):

  1. kernel1执行时间
  2. host_code_routine
  3. 相关联的(主持人)执行时间
  4. kernel2执行时间
  5. 如果你希望产生上面只有1和3的总和,你需要用cudaEvent定时序列括起每个内核(仅),然后在主机代码中手动求和这两个值。

    回答你的问题,然后:

      

    1-是我的方式我把上面显示的事件调用显示:将仅记录内核而忽略主机功能?

    不,您描述的录音将捕获序列中的主机和设备已用时间。

      

    2-主机循环调用会影响cuda事件的时间吗?

      

    3-我的目标是仅计算GPU,同时还计算GPU + CPU,上面会实现它还是应该使用clock_gettime(CLOCK_REALTIME,计时器)来计算主机?

    如果您想要个人时间和各种总和,我建议您独立计算内核时间,并使用一些基于主机的方法来计算主机代码,然后以您希望的方式组合各种组件。