gpt4 book ai didi

c - 关于 GPU (CUDA) 并行性的问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:53 24 4
gpt4 key购买 nike

在提问之前,我需要详细说明我在做什么。我希望我的英语和解释足够清晰和简洁。

我目前正在对最初编写的 C 代码进行大规模并行化。我对 CUDA 感兴趣的原因是我正在处理的数组很大:代码是流体力学的模拟,我需要启动一个“时间循环”,对 3.10 大小的数组进行五到六次连续操作^ 9 或 19.10^9 双变量。我浏览了各种教程和文档,最终设法编写了一个还不错的 CUDA 代码。

在不查看代码细节的情况下,我使用了相对较小的 2D block 。线程数是 18 或 57(这很笨拙,因为我的包裹没有被完全占用)。

内核称为“大”3D 网格,它描述了我的物理几何形状(最大所需大小是每个维度 1000 个值,这意味着我想处理具有 10 亿个 block 的 3D 网格)。

现在,我的 5 到 6 个正确执行工作的内核充分利用了共享内存的优势,因为每个内核的全局内存读取盎司和写入盎司(我的 block 的大小实际上是在根据所需的足够共享内存量)。

我的一些内核是并发启动的,异步调用的,但大部分都需要连续启动。从设备到主机有多个 memcpy,但 memcpy 与内核调用的比率非常低。我主要对我的数组值执行操作。

这是我的问题:

如果我没理解错的话,我的所有 block 都同时在阵列上完成工作。那么这意味着处理一个 10 block 网格、一个 100 block 网格或 10 亿 block 网格将花费相同的时间?答案显然是否定的,因为当我处理大型网格时,计算时间要重要得多。这是为什么?

我使用的是相对适中的 NVIDIA 设备 (NVS 5200M)。在获得更大/更高效的设备之前,我试图习惯 CUDA。

由于我自己完成了所有优化和 CUDA 编程建议/指南,我可能完全误解了一些要点。我希望我的问题不是太天真......

谢谢!

最佳答案

如果我没理解错的话,我所有的 block 都同时在数组上完成工作。

不,它们不会同时运行!有多少线程 block 可以同时运行取决于几件事,所有这些都会影响您设备的计算能力 - NVS 5200M 应该是 cc2.1。支持 CUDA 的 gpu 有一个内部调度程序,它管理哪个线程 block 和 block 的 warp 将在何时何地运行。 Where 表示 block 将在哪个流式多处理器 (SM) 上启动。

每个 SM 都有有限的资源——例如共享内存和寄存器。这些限制的一个很好的概述给出了 Programming GuideOccupancy Calculator .第一个限制是,对于 cc2.1,一个 SM 最多可以同时运行 8 个线程 block 。根据您对寄存器、共享内存的使用……数量可能会减少。

如果我没记错的话,cc2.1 的 SM 存在 96 个 cuda 内核,因此您的 NVS 5200M 应该有一个 SM。让我们假设您的内核设置 N (N<=8) 线程 block 同时适合 SM。内部调度程序将启动前 N 个 block 并将所有其他线程 block 排队。如果一个线程 block 完成了他的工作,队列中的下一个线程 block 将被启动。因此,如果您将总共启动 1 到 N 个 block ,则内核的使用时间将非常相等。如果您使用 N+1 block 运行内核,那么使用的时间将会增加。

关于c - 关于 GPU (CUDA) 并行性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22246449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com