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 中的线程块实际上不会首先执行?
NVIDIA 现在提供了一种确定 CUDA 内核优先级的方法。这是一项相当新的功能,因此您需要升级到 CUDA 5.5 才能使用。
kernel A
对于您的情况,您将在高优先级 CUDA 流中启动,并kernel B
在低优先级 CUDA 流中启动。您可能需要的功能是cudaStreamCreateWithPriority(..., priority)
.
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)