CUDA核函数的并发执行优先级

4

我有两个内核(A和B),可以并发执行。 我需要尽快完成内核A(进行MPI结果交换)。 因此,我可以在一个流中执行它们:A然后是B。

但是,内核A只有少量线程块,因此,如果我按顺序运行A和B,则GPU在A正在运行时不会被充分利用。

是否可能同时执行A和B,且A具有更高的优先级?

也就是说,只有在来自内核A的没有未启动的块时,我希望从内核B开始执行线程块。

据我所知,如果我在一个流中启动内核A,并在主机代码中的下一行中启动另一个流中的内核B,我不能保证实际上不会首先执行来自B的线程块?


1
CUDA编程模型版本5.0及早期不支持流优先级。在计算能力2.0-3.0上的当前CUDA 5.0驱动程序将按照在CPU上提交工作的顺序向GPU分派命令。这在未来的驱动程序中可能不成立。计算能力3.5设备可以无序执行工作。 - Greg Smith
1个回答

5
NVIDIA现在提供了一种优先处理CUDA内核的方法。这是一个相当新的功能,所以您需要升级到CUDA 5.5才能使用此功能。
对于您的情况,您将在高优先级CUDA流中启动kernel A,并在低优先级CUDA流中启动kernel B。您可能需要的函数是cudaStreamCreateWithPriority(..., priority)
  • 要使用此功能,您需要具有计算能力为3.5或更高的GPU。要检查您的GPU是否支持优先级,请查看cudaDeviceProp :: streamPrioritiesSupported
  • cudaDeviceGetStreamPriorityRange应告诉您GPU上可用的优先级级别。 cudaDeviceGetStreamPriorityRange 的语法有点奇怪; 值得在CUDA手册中查看这个工作原理。

来自 CUDA Runtime API 手册 的优先级设置的更详细说明:
cudaError_t cudaStreamCreateWithPriority(cudaStream_t *pStream, 
                                         unsigned int flags, int priority)
Create an asynchronous stream with the specified priority.

Parameters
pStream  = Pointer to new stream identifier 
flags    = Flags for stream creation. See cudaStreamCreateWithFlags for a list of 
           valid flags that can be passed 
priority = Priority of the stream. Lower numbers represent higher priorities. See  
           cudaDeviceGetStreamPriorityRange for more information about the 
           meaningful stream priorities that can be passed.

谢谢,解决难题 - user2052436
请注意,这需要计算能力>=3.5,因此Quadro和Tesla单元支持它,但不是每个其他类型的单元都支持。 - PetrV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接