控制cuda中一个流多处理器的工作
问题描述:
我正在使用一个cuda程序,我设法将一个工作分配给一个流多处理器。例如,我有作品A和B,我的GPU有2个SM(SM0和SM1)。是否有办法将工作A正好分配给SM0,将工作B分配给SM1?控制cuda中一个流多处理器的工作
你能告诉我一些方法吗?
感谢您的帮助。
答
一种方法是将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
考虑加入一些代码样本 –
你不想编写工作分配给各个SMS程序。让GPU做到这一点。这是一个坏主意。创建无论你有多少工作,将其组织成块,并让块由GPU处理。今天你正在开发一款带有2个SM的GPU。明天它可能是一个带有8个SM的GPU。 GPU将为您处理调度。 –
谢谢M Afifi和Robert Crovella。但是我不知道有什么方法可以手动将作品分割到SM上? – sunway