cuda - 如何在 CUDA 中同时执行子内核 256 次
问题描述
我是 CUDA 编程的新手,但我需要在一个复杂的项目中使用它。我真的需要一些帮助。
我的问题是,如果我想同时执行子内核 256 次,我可以用动态并行做什么?
我读了一篇 NVIDIA博客,上面写着:
默认情况下,在线程块中启动的网格按顺序执行:下一个网格只有在前一个网格完成后才开始执行。即使网格是由块内的不同线程启动的,也会发生这种情况。
所以,我的想法是为父内核设置块大小(1,1)和网格大小(256,1),我可以在不同的块中使用 256 个线程同时启动子内核。会不会非常低效?什么是更好的解决方案?
解决方案
那句话继续
然而,通常需要更多的并发性。与主机端内核启动一样,我们可以使用 CUDA 流来实现这一点。在设备上创建的所有流都是非阻塞的;也就是说,它们不支持与默认NULL 流的隐式同步。因此,以下是在设备代码中创建流的唯一方法。
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);
然后为每个 CUDA 线程使用不同的(设备端)流应该使它们独立运行,而不是默认运行。
此外,您可以使用父块中父线程之间的某种缩减算法将多个启动合并为一个大型启动。增加子内核的线程总数及其从线程 id 到问题空间的映射。这应该可以克服小内核的性能问题以及硬件支持的每个设备的最大并发内核执行数(4 到 128,具体取决于 Cuda 计算能力)。
推荐阅读
- javascript - VSCode 输出无法为 Node 正确打印
- python - Python Pandas - 从数据框查找 Excel 文档
- python - 尝试在python中按顺序划分列表中的每个数字,但是如何?
- microsoft-graph-api - 图形 API:在单个查询中获取所有 OneDrive 项目的所有版本
- c++ - 如何创建调用成员函数的类似 stl 的迭代器
- powershell - Get-WmiObject -Filter 或不使用 NULL
- android - 安全应用程序声称我的应用程序在启动时启动,并且可以在使用时安装其他应用程序
- css - 如何在不重置 CSS 中的旋转旋转的情况下停止动画(示例解释得最好)
- mpi - 如何将可执行文件链接到 HPC/集群中的计算节点?
- java - CDI 范围和生产者