控制cuda中一个流多处理器的工作

问题描述:

我正在使用一个cuda程序,我设法将一个工作分配给一个流多处理器。例如,我有作品A和B,我的GPU有2个SM(SM0和SM1)。是否有办法将工作A正好分配给SM0,将工作B分配给SM1?控制cuda中一个流多处理器的工作

你能告诉我一些方法吗?

感谢您的帮助。

+1

考虑加入一些代码样本 –

+2

你不想编写工作分配给各个SMS程序。让GPU做到这一点。这是一个坏主意。创建无论你有多少工作,将其组织成块,并让块由GPU处理。今天你正在开发一款带有2个SM的GPU。明天它可能是一个带有8个SM的GPU。 GPU将为您处理调度。 –

+0

谢谢M Afifi和Robert Crovella。但是我不知道有什么方法可以手动将作品分割到SM上? – sunway

一种方法是将kernelA和workB中的工作A实现为kernelB,并将它们作为1 * 1网格在不同的流中启动,因为在Fermi和Kepler GPU上,这些内核可以同时运行。 1 * 1网格启动的原因是,如果你有多个块,那么这些块可以在不同的SM上执行,并且在这种情况下,这两个内核不能同时执行(即,只有一个内核/ SM)

cudaStream_t stream1, stream2; 
cudaStreamCreate (&stream1); 
cudaStreamCreate (&stream2); 
kernelA<<<1, 512, 0, stream1>>>(...); 
kernelB<<<1, 512, 0, stream2>>>(...); 
... 

有关详细信息,请参阅this NVIDIA presentation

+0

谢谢Reguj。那是一个好主意。如果每个流都使用它自己的纹理内存,你认为这是可行的吗?例如,我们为stream1创建texture1,为stream2创建texture2?我想知道在使用2个纹理的2个流和2个纹理的2个流之间哪个更快。 – sunway

+0

是的,这应该工作(虽然纹理槽数量有限) – Reguj