关于cuda里面的stream的疑问

  • 5 replies
  • 285 views
*

sisiy

  • *****
  • 214
    • 查看个人资料
关于cuda里面的stream的疑问
« 于: 八月 13, 2020, 12:39:33 pm »
cuda里面的stream,一般情况下每个stream任务各自独立执行,相互之间是并行的。但是如果我创建了两个kernel任务且使用了不同的stream,且其中一个任务要读取的数据是另一个任务输出的数据,这种情况两个任务是如何调度的

Re: 关于cuda里面的stream的疑问
« 回复 #1 于: 八月 13, 2020, 12:57:36 pm »
cuda里面的stream,一般情况下每个stream任务各自独立执行,相互之间是并行的。但是如果我创建了两个kernel任务且使用了不同的stream,且其中一个任务要读取的数据是另一个任务输出的数据,这种情况两个任务是如何调度的

(1)正常你能看到的, 2个kernel具有前后数据依赖关系的, 都是在同1个流中前后一次启动, 这样自然可以确保.
(2)如果你非要使用2个流的话, 可以考虑在第1个流中的生成数据的kernel后面, 立刻加上一个event; 然后在第2个流的消费数据的kernel启动前, 立刻加上一个cudaStreamWaitEvent. 即用Event来实现跨流同步.

但一般人都是用第一种的, 直接在1个流中前后启动即可,

结论:即使用了2个流, 也不会并行2个kernel,因为他是有前后数据依赖关系的, 必须一个跑出来数据, 另外一个才能接着跑.所以用2个流真心是没用.
« 最后编辑时间: 八月 13, 2020, 02:30:42 pm 作者 sisiy »

Re: 关于cuda里面的stream的疑问
« 回复 #2 于: 八月 13, 2020, 02:56:06 pm »
那请问,如果是不去添加event用于同步,那运行之后出现什么情况呢?

*

sisiy

  • *****
  • 214
    • 查看个人资料
Re: 关于cuda里面的stream的疑问
« 回复 #3 于: 八月 13, 2020, 03:02:29 pm »
如果你不想按照上面的提示操作(即在同一个流中前后依次启动, 或者跨流但是用Event保持同步), 则结果无法预测, 什么结果都有可能. 很可能前一个生成数据的kernel没有执行完, 后一个使用数据的kernel就开始执行了, 此时最终结果将无法预测.

Re: 关于cuda里面的stream的疑问
« 回复 #4 于: 八月 13, 2020, 03:18:34 pm »
明白了,谢谢

Re: 关于cuda里面的stream的疑问
« 回复 #5 于: 八月 13, 2020, 03:38:08 pm »
对了,再跟您咨询一下,您刚才提到的两种同步方式,第二种是加event。那如果我是这样操作的,创建kernel1<<<...stream1>>>,然后调用cudaStreamSynchronize(stream1),然后再创建kernel2<<<...stream2>>>,这样能保证我kernel2访问kernel1输出的数据是有效的么。