首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同步两个CUDA流

同步两个CUDA流
EN

Stack Overflow用户
提问于 2013-07-19 21:02:13
回答 1查看 4.5K关注 0票数 1

我使用CUDA流来启用异步数据传输和隐藏内存复制延迟。我有两个CPU线程和两个CUDA流:一个是“数据”流,本质上是由第一个CPU线程发起的cudaMemcpyAsync调用序列,另一个是执行计算内核的“计算”流。数据流正在为计算流准备批处理,因此对于计算流来说,确保要处理的批处理完全加载到内存中是至关重要的。

我应该使用CUDA事件来实现这样的同步或其他机制吗?

更新:让我解释为什么不能在每个流中使用单独的流和数据副本/计算。问题是,必须对批处理进行处理,也就是说,我不能并行执行它们(当然,多个流也可以这样做)。但是,在处理每个批处理时,我可以为下一批预加载数据,从而隐藏数据传输。以Robert为例:

代码语言:javascript
运行
复制
cudaMemcpyAsync( <data for batch1>, dataStream);
cudaMemcpyAsync( <data for batch2>, dataStream);
kernelForBatch1<<<..., opsStream>>>(...);
kernelForBatch2<<<..., opsStream>>>(...);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-19 21:40:43

当然,您可以使用cuda事件来同步流,例如使用cudaStreamWaitEvent API函数。但是,将所有数据副本放在一个流中,将所有内核调用放在另一个流中的想法可能并不是对流的合理使用。

在单个流中发出的cuda函数(API调用、内核调用)保证按顺序执行,该流中的任何cuda函数都不会在该流中所有以前的cuda活动完成后才开始(即使您正在使用诸如cudaMemcpyAsync.等调用)。

因此,流已经为您提供了一种机制,以确保在复制必要的数据之前不会启动内核调用。只需将内核调用放在相同的流中,在数据副本之后。

像这样的东西应该负责您的同步:

代码语言:javascript
运行
复制
cudaMemcpyAsync( <data for kernel1>, stream1);
cudaMemcpyAsync( <data for kernel2>, stream2);
kernel1<<<..., stream1>>>(...);
kernel2<<<..., stream2>>>(...);
cudaMemcpyAsync( <data from kernel1>, stream1);
cudaMemcpyAsync( <data from kernel2>, stream2);

上述所有调用都是异步的,因此假设您满足了异步执行的其他要求(例如使用固定内存),上述所有调用都应该“排队”并立即返回。但是,kernel1保证不会在前面发布给stream1cudaMemcpyAsync完成之前开始,对于kernel2stream2中的数据传输也是如此。

我也不认为有任何理由将上述活动分解为单独的CPU线程。这不必要地使事情复杂化了。管理单个设备的最无问题的方法是从单个CPU线程中进行管理。

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

https://stackoverflow.com/questions/17755438

复制
相关文章

相似问题

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