如何在CUDA中并发执行256次子内核

如何在CUDA中并发执行256次子内核,cuda,gpu,Cuda,Gpu,我是CUDA编程的新手,但我需要在复杂的项目中使用它。我真的需要一些帮助 我的问题是,如果我想同时执行256次子内核,那么使用动态并行性可以做什么 我读了一本NVIDIA,上面写着: 默认情况下,将执行在线程块中启动的网格 顺序:下一个网格仅在上一个网格之后开始执行 一个已经完成了。即使网格由不同的用户启动,也会发生这种情况 块中的线程 因此,我的想法是为父内核设置块大小(1,1)和网格大小(256,1),我可以在不同的块中同时启动子内核和256个线程。效率会很低吗?有什么更好的解决方案吗?这句

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

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

我读了一本NVIDIA,上面写着:

默认情况下,将执行在线程块中启动的网格 顺序:下一个网格仅在上一个网格之后开始执行 一个已经完成了。即使网格由不同的用户启动,也会发生这种情况 块中的线程


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

这句话接着说

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

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


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

不太清楚,为什么要同时启动它们。正如您所描述的,只启动一个包含256个线程的块就足够了……在一个块中启动单个线程是非常低效的,如果可能的话应该避免。若可能的话,你们应该以翘曲尺寸的倍数(当前硬件为32)发布。@DanielBauer抱歉,这是我第一次在这个论坛上提问。让我更具体一点,我有一个数据矩阵,大小是(5121024)。我需要对每个行对执行一个操作,我希望这个操作并发执行256次以节省时间。此操作包括计算FFT(或卷积),获取FFT结果中最大值的索引,并将数据移动到其原始位置。(实际上,此过程称为逆合成孔径雷达成像中的距离对准)。尝试制作一个一次使用尽可能多的资源的内核,然后在一个大网格中运行这个内核。CUDA应自动同时处理尽可能多的块。通常,如果只重复运行一个任务,则不必对并发性进行任何处理。如果要计算不同的任务,其中一个任务是否需要另一个任务的数据尚不清楚,则需要更多地考虑这一点。当前网格的最大数量在4-128之间。这取决于计算能力。请参阅“每个设备的最大驻留网格数”。32是从GK110开始的最大通信信道数。
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);