对内部有数百个处理器的 GPU 感到困惑

Arr*_*row 9 cpu gpu graphics-card

我刚开始在 Udacity 上学习并行编程课程,我已经有点困惑了。在此视频片段中:https : //youtu.be/gbj0oauFFI8?t=52s

我们被告知平均 GPU 有数千个 ALU 和数百个处理器。我对“数百个处理器”部分感到困惑。为什么有这么多?不应该只有一个吗……?GPU 确实代表图形处理器单元。GPU 是不是像 CPU 一样,一个内部有数千个 ALU 的处理器,但完全专门用于某些任务?这些“处理器”是如何发挥作用的?

如果我错了,那么我假设每个处理器内部可能有大约 10 个(因为 10*100 个 CPU = 1000 个 ALU)ALU?是否有我可以看到的布局以便我可以验证这一点?

谢谢你。

gro*_*taj 13

CPU 是SISD,GPU 是SIMD

SISD 是 Single Instruction, Single Data 的首字母缩写。CPU 擅长执行顺序操作:拿这个,做那个,把它移到那里,再拿一个,把它们加在一起,写到一个设备,读响应,等等。它们执行的大多是简单的操作,这些操作取一两个值并返回一个值。

SIMD 是 Single Instruction, Multiple Data:同时在多个数据集上执行相同的操作。例如取128个值[X 1 …X 128 ],取128个值[Y 1 …Y 128 ],将对应的值成对相乘,返回128个结果。SISD 处理器必须执行 128 条指令(+ 内存读/写),因为它一次只能将两个数字相乘。SIMD 处理器可以通过几个步骤完成此操作,如果其寄存器中只有 128 个数字,则甚至可以在一个步骤中完成。

SISD CPU 适用于日常计算,因为它主要是顺序的,但有些任务需要以类似的方式处理大量数据 - 例如处理图形、视频渲染、破解密码、挖掘比特币等。 GPU 允许大规模并行化计算,前提是所有数据必须以相同方式处理。

好吧,那是纯理论。在现实世界中,常规 CPU 提供一些 SIMD 指令 ( SSE ),因此可以在常规 CPU 上更有效地完成一些多数据操作。同时,并非 GPU 中的所有 ALU 都必须在同一件事上工作,因为它们被分组为批次(参见Mokubai 的回答)。所以 CPU 不是纯粹的 SISD,GPU 也不是纯粹的 SIMD。

何时使用 GPU 进行计算有益?当您的计算真的非常非常可并行化时。您必须考虑将输入写入 GPU 的内存需要时间,而读取结果也需要一些时间。当您可以构建一个在离开 GPU 之前进行大量计算的处理管道时,您可以获得最大的性能提升。


Mok*_*bai 9

现代图形处理器是一种高度复杂的设备,可以拥有数千个处理内核。例如,Nvidia GTX 970有 1664 个内核。这些核心被分组到一起工作的批次。

对于 Nvidia 卡,根据底层架构(Kepler或 Fermi),核心以16 或 32 个为一组分组在一起,并且该批次中的每个核心将运行相同的任务。

批次和核心之间的区别很重要,因为虽然批次中的每个核心必须运行相同的任务,但其数据集可以分开。

您的中央处理器单元很大并且只有几个内核,因为它是一个高度通用的处理器,能够进行大规模决策和流量控制。显卡避开了大量的控制和切换逻辑,有利于并行运行大量任务的能力。

如果您坚持要一张图片来证明它,那么下图(来自GTX 660Ti Direct CU II TOP 评测)显示 5 个绿色区域,它们大体相似,每个区域包含数百个内核,总共 1344 个活动内核分布在不同的外观上对我来说是 15 个功能块:

在此处输入图片说明

仔细观察每个块的侧面似乎有 4 组控制逻辑,这表明您可以看到的 15 个较大的块中的每一个都有 4 个 SMX 单元。

这为我们提供了 15*4 处理块 (60),每个处理块具有 32 个内核,总共 1920 个内核,它们的批次将被禁用,因为它们要么出现故障,要么只是为了方便将它们分成不同的性能组。这将为我们提供正确数量的活动核心。

Stack Overflow 上有关批次如何映射的一个很好的信息来源:https : //stackoverflow.com/questions/10460742/how-do-cuda-blocks-warps-threads-map-onto-cuda-cores