假设有如下几个核函数,stream0和stream1代表两个流:
kernel1<<>>();
kernel2<<>>();
kernel3<<<默认流>>>();
在kernel3计算时需要用到kernel1和kernel2计算的值,那么在kernel3之前需要加cudaThreadSynchronize()吗?经过自己测试加与不加都不影响,按理说应该是要加cudaThreadSynchronize();,这是为什么呢?
假设有如下几个核函数,stream0和stream1代表两个流:
kernel1<<>>();
kernel2<<>>();
kernel3<<<默认流>>>();
在kernel3计算时需要用到kernel1和kernel2计算的值,那么在kernel3之前需要加cudaThreadSynchronize()吗?经过自己测试加与不加都不影响,按理说应该是要加cudaThreadSynchronize();,这是为什么呢?
LZ您好,因为您kernel3是默认流里面的,默认流中的命令具有隐含同步的属性,所以您默认流中的kernel实际上不会和前面的各个流里面的kernel同时执行,所以您是否显性地添加同步都是无影响的。
此外,您可以将kernel3所在的 “默认流”改为某个指定的流,此时检查一下有无显性同步时,结果是否相同。以及建议您用nvvp看,那个很直观。
最后,提供一个链接,该链接讲述了默认流和普通流的一些行为,以及介绍了CUDA 5引入的一些新用法。
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6233
祝您编码顺利~