我有两个内核(A和B),可以并发执行。 我需要尽快完成内核A(进行MPI结果交换)。 因此,我可以在一个流中执行它们:A然后是B。
但是,内核A只有少量线程块,因此,如果我按顺序运行A和B,则GPU在A正在运行时不会被充分利用。
是否可能同时执行A和B,且A具有更高的优先级?
也就是说,只有在来自内核A的没有未启动的块时,我希望从内核B开始执行线程块。
据我所知,如果我在一个流中启动内核A,并在主机代码中的下一行中启动另一个流中的内核B,我不能保证实际上不会首先执行来自B的线程块?
我有两个内核(A和B),可以并发执行。 我需要尽快完成内核A(进行MPI结果交换)。 因此,我可以在一个流中执行它们:A然后是B。
但是,内核A只有少量线程块,因此,如果我按顺序运行A和B,则GPU在A正在运行时不会被充分利用。
是否可能同时执行A和B,且A具有更高的优先级?
也就是说,只有在来自内核A的没有未启动的块时,我希望从内核B开始执行线程块。
据我所知,如果我在一个流中启动内核A,并在主机代码中的下一行中启动另一个流中的内核B,我不能保证实际上不会首先执行来自B的线程块?
kernel A
,并在低优先级CUDA流中启动kernel B
。您可能需要的函数是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.