我是CUDA编程的新手,但是我需要在复杂的项目中使用它。我真的需要一些帮助。
我的问题是,如果我想同时执行256次子内核,那么动态并行可以做什么?
我读了一个NVIDIA blog,上面写着:
默认情况下,执行在线程块内启动的网格 按顺序:下一个网格仅在上一个网格之后开始执行 一个已经完成。即使网格是由其他人启动的,也会发生这种情况 线程内的线程。
因此,我的想法是为父内核设置块大小(1,1)和网格大小(256,1),然后可以在不同块中与256个线程同时启动子内核。效率会很低吗?有什么更好的解决方案?
答案 0 :(得分:2)
该报价继续
但是,通常需要更多的并发性。与主机端内核启动一样,我们可以使用CUDA流来实现这一目标。设备上创建的所有流均为非阻塞;也就是说,它们不支持与默认 NULL流进行隐式同步。因此,以下是在设备代码中创建流的唯一方法。
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);
然后,每个CUDA线程使用不同的(设备端)流将使它们独立运行,而不是默认运行。
此外,您可以使用父块中父线程之间的某种归约算法,将多个启动合并为一个大启动。增加子内核的线程总数以及它们从线程ID到问题空间的映射。这应该可以克服小内核的性能问题,以及硬件支持的每个设备的最大并发内核执行次数(4到128,具体取决于Cuda计算能力)。