如何在CUDA中同时执行256次子内核

问题描述 投票:1回答:1

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

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

我读了NVIDIA blog,它说:

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

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

cuda gpu-programming
1个回答
2
投票

这句话继续说

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

cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);

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

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

© www.soinside.com 2019 - 2024. All rights reserved.