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

Posted

技术标签:

【中文标题】关于 GPU 上的并行性 (CUDA) 的问题【英文标题】:Questions about parallelism on GPU (CUDA) 【发布时间】:2014-04-10 09:14:58 【问题描述】:

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

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

在没有详细介绍代码的情况下,我使用了相对较小的 2D 块。线程数为 18 或 57(由于我的包裹没有完全占用,这很尴尬)。

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

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

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

这是我的问题:

如果我理解正确的话,我的所有块都在同时在数组上工作。所以这意味着处理 10 块网格、100 块网格或 10 亿块网格将花费相同的时间吗?答案显然是否定的,因为当我处理大型网格时,计算时间要重要得多。这是为什么呢?

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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 有一个内部调度程序,它管理哪个线程块和块的扭曲将在何时何地运行。 Where 表示块将在哪个流式多处理器 (SM) 上启动。

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

如果我提醒我正确,cc2.1 的 SM 存在 96 个 cuda 内核,因此您的 NVS 5200M 应该有一个 SM。让我们假设您的内核设置 N (N

【讨论】:

好的,感谢您的回答,这证实了我的想法!我的 deviceQuery 为 96 个 CUDA 内核提供了 2 个多处理器,这意味着我有两个 SM(?)。我可能会得到新设备,比如说两台 NVIDIA Quadro K4000,每台都有 336 个 CUDA 核心。所以这意味着我至少有 7 倍的加速?我还使用 nnvp 来检查我的表现,我想我有 8 个线程同时运行……最后一个问题! : 我能做的就是获得更好的设备来加快速度?或者可能让多个设备同时运行?再次感谢。 如果它仍然是相同的 cc 并且所有其他硬件规格都相同,那么如果您有 n 倍的 SM,那么您可以说您将获得近 n 倍的速度。但是 K4000 是 Kepler,而 NVS 5200M 是 Fermi,每个 SM 的内核、每个 SM 的寄存器和每个 SM 的缓存之间的关系完全不同。 另外,获得更好的设备应该是加快计算速度的最后方法。第一种方法是针对当前 gpu 对内核进行全面优化!

以上是关于关于 GPU 上的并行性 (CUDA) 的问题的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 学习(十六)优化策略1:并行/串行在GPU/ CPU 上的问题分解

一文了解GPU并行计算CUDA

用 CUDA 在 GPU 上并行一个简单的算法

CUDA编程入门极简教程(转)

CUDA并行程序设计系列GPU技术简介

cuda并行程序设计 gpu编程指南