留着以后备用
是一种在N卡上,哪怕使用了多个stream, 却取不到并行的效果(或者能取到,但有限)。
这在某些N卡和N卡架构,以及驱动版本配合上,常见的。
您在具有计算能力3.5或者更高的Tesla显卡上,不应当能容易观察到这种现象的。
(除非你限定了CUDA_DEVICE_MAX_CONNECTIONS)
这个问题的产生是因为某些N卡的硬件,发现独立无关的并行任务(包括复制传输,包括kernel计算)的能力有限。需要你采用一定的策略才能尽量让它们充分利用。
常见的手册上有两种:一种是广度优先,一种是深度优先(其实这两种名字无所谓的)。
例如对于这么一个kernel场景:
复制到设备->启动kernel->回传
如果在多个流中同时执行这个场景,有多种方式,
(1)对每个流,先都压入1个传输任务。继续循环,对每个流,再压入kernel。再继续循环,再对每个流,压入回传传输。
(2)而第二种方式,则可以:对每个流,执行进行复制到设备, 启动kernel,回传。然后对下个流继续这样循环。
其中第一种叫广度优先。第二种叫深度有限。(其实其他的各种组合方式)
在不同的卡上,可以观察到这两种方式具有不同的效果。
为何会这样,长期以来一直是个谜,直到Kepler时代,NV公布了技术细节。
因为它们虽然支持多流,但只有1个硬件队列,所有的流根据创建顺序的不同,按照不同的规则都映射到这一个硬件队列上。此在此单个硬件队列内,GPU发现可并行无关的任务的能力有限。此时导致的不能有效的并行的
现象,被称为假依赖(或者假串行)。
只要您手中具有一张具有Hyper-Q技术的卡(您已经有了,从您之前的帖子中可以看到的),它们具有多个队列,只要您不特意限定CUDA_DEVICE_MAX_CONNECTIONS为很小的数。您应当不容易观察到现象的。
因此您可以忘记它。
转载于http://bbs.gpuworld.cn/forum.php?mod=viewthread&tid=10233&extra=page%3D1 gpu世界论坛