我对使用它有点困惑cudaEvent_t.目前,我正在使用这样的clock()调用来查找内核调用的持续时间:
cudaThreadSynchronize();
clock_t begin = clock();
fooKernel<<< x, y >>>( z, w );
cudaThreadSynchronize();
clock_t end = clock();
// Print time difference: ( end - begin )
Run Code Online (Sandbox Code Playgroud)
寻找更高分辨率的计时器我正在考虑使用cudaEvent_t.cudaThreadSynchronize()在记下使用时间之前是否需要拨打电话cudaEventRecord()还是多余的?
我问的原因是因为有另一个电话cudaEventSynchronize(),似乎要等到事件被记录下来.如果录制延迟,计算出的时差是否会在内核完成执行后显示一些额外的时间?
Lum*_*mpN 14
实际上还有更多的同步函数(cudaStreamSynchronize).编程指南详细描述了每个人的作用.使用事件作为计时器基本上归结为:
//create events
cudaEvent_t event1, event2;
cudaEventCreate(&event1);
cudaEventCreate(&event2);
//record events around kernel launch
cudaEventRecord(event1, 0); //where 0 is the default stream
kernel<<<grid,block>>>(...); //also using the default stream
cudaEventRecord(event2, 0);
//synchronize
cudaEventSynchronize(event1); //optional
cudaEventSynchronize(event2); //wait for the event to be executed!
//calculate time
float dt_ms;
cudaEventElapsedTime(&dt_ms, event1, event2);
Run Code Online (Sandbox Code Playgroud)
同步很重要event2因为你想在计算时间之前确保所有内容都已执行.因为事件和内核都在同一个流上(保留了顺序)event1并且kernel也被执行了.
你可以打电话cudaStreamSynchronize,甚至可以打电话,cudaThreadSynchronize但在这种情况下两者都是矫枉过正.
| 归档时间: |
|
| 查看次数: |
11592 次 |
| 最近记录: |