1

我有一个看起来像这样的函数:

int doSomething() {
    <C++ host code>
    <CUDA device code>
    <C++ host code>
    <...>
}

我也想在 Linux 和 Windows 上以高精度(至少毫秒)测量此函数的运行时间。

我知道如何使用事件测量 CUDA 程序的运行时间,并且我找到了非常准确的库来测量我的进程使用的 CPU 时间,但我想测量整体运行时间。我无法以不同的方式测量这两个时间并将它们加在一起,因为设备代码和主机代码可以并行运行。

我想使用尽可能少的外部库,但我对任何好的解决方案都感兴趣。

4

2 回答 2

2

根据您显示的顺序,我建议您执行以下操作:

int doSomething() {
  <C++ host code>
  <CUDA device code>
  <C++ host code>
  <...>
  cudaDeviceSynchronize();  // add this
}

和:

<use your preferred CPU high precision measurement start function>
doSomething();
<use your preferred CPU high precision measurement stop function>

cudaDeviceSynchronize()如果您有一些先前的隐式同步,则不需要添加的调用,例如cudaMemcpy()在该<CUDA device code>部分中最后一个内核之后的调用。

在回答下面评论中的问题时,@JackOLantern 似乎在此处的答案中建议了一种高精度的 CPU 计时方法,其中包含 start (tic) 和 stop (toc) 点。talonmies 也指出了这一点。如果您不喜欢使用返回的结果,CLOCK_MONOTONIC 也可以尝试指定CLOCK_REALTIME_HR。在 linux 盒子上做man clock_gettime更多信息。

于 2013-04-30T18:43:03.010 回答
0

对于窗户:

LARGE_INTEGER perfCntStart, perfCntStop, proc_freq; 
::memset( &proc_freq, 0x00, sizeof(proc_freq) );
::memset( &perfCntStart, 0x00, sizeof(perfCntStart) ); 
::memset( &perfCntStop, 0x00, sizeof(perfCntStop) );
::QueryPerformanceCounter( &perfCntStart ); 
::QueryPerformanceFrequency( &proc_freq );

.. 做一点事

::QueryPerformanceCounter( &perfCntStop ); 
printf( ": %f\n", float( perfCntStop.QuadPart - perfCntStart.QuadPart ) / float(proc_freq.QuadPart) ); }
于 2013-05-03T15:20:23.553 回答