首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA: cudaEvent_t和cudaThreadSynchronize的使用

问CUDA: cudaEvent_t和cudaThreadSynchronize的使用
EN

Stack Overflow用户
提问于 2011-04-27 17:08:43
回答 1查看 12.5K关注 0票数 6

我对cudaEvent_t的用法有点困惑。目前,我正在使用这样的clock()调用来查找内核调用的持续时间:

代码语言:javascript
复制
cudaThreadSynchronize();
clock_t begin = clock();

fooKernel<<< x, y >>>( z, w );

cudaThreadSynchronize();
clock_t end = clock();

// Print time difference: ( end - begin )

寻找一个更高分辨率的计时器,我正在考虑使用cudaEvent_t。在使用cudaEventRecord()记下时间之前,我需要调用cudaThreadSynchronize()吗?还是这是多余的?

我询问的原因是因为有另一个调用cudaEventSynchronize(),它似乎在等待事件被记录下来。如果记录被延迟,那么计算出的时间差不是会在内核完成执行后显示一些额外的时间吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-27 17:22:53

实际上,还有更多的同步功能(cudaStreamSynchronize)。编程指南对每一种方法都有详细的描述。使用事件作为计时器基本上归结为:

代码语言:javascript
复制
//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);

在event2上进行同步很重要,因为您希望在计算时间之前确保所有操作都已执行。因为两个事件和内核都在同一个流上(顺序保持不变),所以event1和kernel也会被执行。

您可以调用cudaStreamSynchronize,甚至cudaThreadSynchronize,但在这种情况下,这两种方法都过度了。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5801717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档