斑竹你好!
在cuda中的stream有几个问题咨询一下。
(1)在用流的时候,流的多少是无限的吗?还是说可以通过cudagetpro获取属性的方式得到一个设备上最大可以设置的流数?
(2)以前在C++中创建一个数组如下:
int size = 3;
float M[size];是错误的,但是现在在cuda下
如此定义:
int size = 3;
cudaStream_t streams[size]就是正确的为什么?
谢谢!
斑竹你好!
在cuda中的stream有几个问题咨询一下。
(1)在用流的时候,流的多少是无限的吗?还是说可以通过cudagetpro获取属性的方式得到一个设备上最大可以设置的流数?
(2)以前在C++中创建一个数组如下:
int size = 3;
float M[size];是错误的,但是现在在cuda下
如此定义:
int size = 3;
cudaStream_t streams[size]就是正确的为什么?
谢谢!
LZ您好:
1:手册和其他官方资料中并没有提到最多可以建立多少个stream,我曾经测试过,连续建立10000个stream是无问题的。
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=7082
以及,一般来说建立这么多的stream是无意义的,stream只是用来区分开多个逻辑依赖链,这只需要少数的几个或者几十个stream就足足够用了。
2:刚才实机测试了您的第二种写法:int size = 3; cudaStream_t streams[size];
编译器报错,error:expression must have a constant value
未能重现您说的现象。
祝您周末愉快~
您说的“逻辑依赖”值得是不是可以并行实现的,流与流之间的数据是无相互影响(即一个流数据的产生需要另一个流的数据完成),只是逻辑上的依赖。对吗?
我也实地弄了一下的确是错的,不知道那本书上为什么那么写!还以为自己搞错了
该书可能是伪码,用来示意的。
请领会精神即可。
祝您好运~
谢谢斑竹
差点把这一楼看漏了。
逻辑依赖链指的是一个流程中后面需要前面的结果这样一个顺序的有因果关系约束的过程。
比如您需要运行kenrel A,之后将A的结果作为输入运行kernel B,这就是一个逻辑依赖链。
而同时,如果您还需要独立地运行kernel C,并将C的结果传回host,这是另外一个逻辑依赖链。
两个逻辑依赖链之间是无依赖关系的。
此时您可以将这两个依赖链分别放入不同的stream中。
大致如此,祝您晚安~
明白了,谢谢