首页 > 解决方案 > 如何在 CUDA 中同时执行子内核 256 次

问题描述

我是 CUDA 编程的新手,但我需要在一个复杂的项目中使用它。我真的需要一些帮助。

我的问题是,如果我想同时执行子内核 256 次,我可以用动态并行做什么?

我读了一篇 NVIDIA博客,上面写着:

默认情况下,在线程块中启动的网格按顺序执行:下一个网格只有在前一个网格完成后才开始执行。即使网格是由块内的不同线程启动的,也会发生这种情况。

所以,我的想法是为父内核设置块大小(1,1)和网格大小(256,1),我可以在不同的块中使用 256 个线程同时启动子内核。会不会非常低效?什么是更好的解决方案?

标签: cudagpu

解决方案


那句话继续

然而,通常需要更多的并发性。与主机端内核启动一样,我们可以使用 CUDA 流来实现这一点。在设备上创建的所有流都是非阻塞的;也就是说,它们不支持与默认NULL 流的隐式同步。因此,以下是在设备代码中创建流的唯一方法。

cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);

然后为每个 CUDA 线程使用不同的(设备端)流应该使它们独立运行,而不是默认运行。

此外,您可以使用父块中父线程之间的某种缩减算法将多个启动合并为一个大型启动。增加子内核的线程总数及其从线程 id 到问题空间的映射。这应该可以克服小内核的性能问题以及硬件支持的每个设备的最大并发内核执行数(4 到 128,具体取决于 Cuda 计算能力)。


推荐阅读