我的功能如下:
int doSomething() {
<C++ host code>
<CUDA device code>
<C++ host code>
<...>
}
我想在Linux和Windows上以高精度(至少毫秒)测量此函数的运行时间。
我知道如何用事件测量CUDA程序的运行时间,我发现了非常准确的库来测量我的进程使用的CPU时间,但我想测量整个运行时间。我无法以不同的方式测量两次并将它们加在一起,因为设备代码和主机代码可以并行运行。
我想尽可能少使用外部库,但我对任何好的解决方案感兴趣。
答案 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) ); }