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

时间:2014-03-07 09:39:21

标签: c arrays cuda parallel-processing nvidia

在提出问题之前,我需要提供一些有关我正在做的事情的详细信息。我希望我的英语和我的解释清晰简洁。

我目前正致力于最初编写的C代码的大规模并行化。我对CUDA感兴趣的原因是我正在处理的阵列的大尺寸:代码是流体力学的模拟,我需要在阵列上进行五到六次连续操作的“时间循环”,大到3.10 ^ 9或19.10 ^ 9双变量。我经历了各种教程和文档,最后我设法编写了一个不太糟糕的CUDA代码。

在没有详细介绍代码的情况下,我使用了相对较小的2D块。线程数是18或57(由于我的包裹未被完全占用,因此很难完成)。

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

好的,现在,正确执行这项工作的五到六个内核正在充分利用共享内存的优势,因为每个内核的全局内存读取盎司并写入盎司(我的块的大小实际上是在按照足够的共享内存量)。

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

这是我的问题:

如果我理解正确的话,我的所有块都在同时在阵列上完成工作。那么这意味着处理10块网格,100块网格或10亿块网格需要相同的时间吗?答案显然是否定的,因为当我处理大网格时,编译时间显得更为重要。那是为什么?

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

If I understood correctly, all of my blocks are doing the job on the arrays at the same time.

不,他们不同时跑!可以同时运行多少个线程块取决于几个因素,这些都会影响设备的计算能力 - NVS 5200M应该是cc2.1。 启用CUDA的gpu有一个内部调度程序,用于管理块的哪些线程块和warp运行的位置和时间。 Where表示将在哪个流多处理器(SM)上启动块。

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

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

相关问题