并发CUDA内核执行的优先级

use*_*436 4 concurrency cuda gpu

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

但是,内核 A 的线程块很少,因此如果我顺序运行 A 和 B,则在 A 运行时 GPU 不会得到充分利用。

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

即,我希望仅当内核A 中没有未启动的块时,内核 B 中的线程块才开始执行。

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

sol*_*les 5

NVIDIA 现在提供了一种确定 CUDA 内核优先级的方法。这是一项相当新的功能,因此您需要升级到 CUDA 5.5 才能使用。

kernel A对于您的情况,您将在高优先级 CUDA 流中启动,并kernel B在低优先级 CUDA 流中启动。您可能需要的功能是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.
Run Code Online (Sandbox Code Playgroud)