CUDA:cudaEvent_t和cudaThreadSynchronize用法

Ash*_*ppa 6 cuda timer

我对使用它有点困惑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但在这种情况下两者都是矫枉过正.

  • @Ashwin:事件在到达流的顶部时被记录,它就像一个FIFO.当您调用cudaEventRecord时,您正在将事件推送到流中.如果事件之前的流中有工作,则事件在流FIFO中未经处理,直到它前面的每个操作都完成.所有这些调用都与调用主机线程异步. (6认同)