2012-08-08 104 views
4

我有一个从for循环中调用的CUDA内核。类似于CUDA内核调用来自内循环

for(i=0; i<10; i++) { 
    myKernel<<<1000,256>>>(A,i); 
} 

现在假设我有一个带有15个流式多处理器(SM)的NVIDIA卡。 为简单起见,我们还假定只有一个块可以映射到SM上,基本上说大多数时候我会在设备上执行15个块。 由于内核执行是异步的,基本上在i = 1的调用在第一个内核启动后立即执行(i = 0的调用)。

我的问题是:在某一点,当第一内核(其中i = 0)被执行时,将只有14个SM的忙,则只有13,那么只有12,那么只有11等

当一个SM可用时,i = 1的内核是否会在设备上发送执行,或者第二个内核的启动是否等待所有SM完成处理第一个内核(i = 0的内核) ?

假设我正在一个CUDA流中工作。

回答

4

在同一个流中启动的内核被序列化。在给定足够资源(SM,共享内存等)的情况下,来自不同流的内核调用可能会重叠

+0

对同一个流上的操作进行序列化。在流中的先前工作完成之前,GPU不能读取pushbuffer中的下一个条目。 CC2.x-3.0可以支持16个并发内核(如果从不同的流发布,并且没有错误的依赖性或显着的状态改变)。 GPU将按照内核通过驱动程序提交的顺序将工作分配给SM。这意味着并发工作可能无序完成,但总是按顺序进行分配。有关更多信息,请参阅http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf – 2012-08-09 04:57:40