测量C ++和CUDA代码的运行时间

时间:2013-04-30 16:23:29

标签: c++ time cuda cross-platform

我的功能如下:

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

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

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

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

2 个答案:

答案 0 :(得分: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似乎建议在the answer here中使用start(tic)和stop(toc)点的高精度CPU计时方法。也是由talonmies指出。如果您不喜欢使用CLOCK_MONOTONIC返回的结果,您也可以尝试指定CLOCK_REALTIME_HR。在linux框中,请man clock_gettime获取更多信息。

答案 1 :(得分:0)

对于Windows:

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) ); }