我刚刚开始学习 Udacity 上的并行编程课程,但还是有点困惑。以下是这段视频:https://youtu.be/gbj0oauFFI8?t=52s
据说,普通的 GPU 有数千个 ALU 和数百个处理器。我对“数百个处理器”这个部分感到困惑。为什么有那么多?难道不应该只有一个吗……?GPU 代表图形处理器单元。GPU 难道不像 CPU 一样,一个处理器里面有数千个 ALU,但完全专门用于某些任务吗?这些“处理器”是如何发挥作用的?
如果我错了,那么我假设每个处理器里面大概有 10 个 ALU(因为 10* 100 个 CPU = 1000 个 ALU)?有没有我可以查看的布局,以便验证这一点?
谢谢。
答案1
现代图形处理器是一种高度复杂的设备,可以拥有数千个处理核心。Nvidia GTX 970例如,有 1664 个核心。这些核心被分组为多个批次,共同工作。
对于 Nvidia 卡,核心按 16 个或 32 个批次分组,具体取决于底层架构(开普勒或 Fermi),并且该批次中的每个核心都会运行相同的任务。
然而,批次和核心之间的区别很重要,因为虽然批次中的每个核心都必须运行相同的任务,但其数据集可以分开。
您的中央处理器很大,但只有几个核心,因为它是一种高度通用的处理器,能够进行大规模决策和流量控制。显卡避开了大量的控制和切换逻辑,有利于并行运行大量任务。
如果你坚持要用图片来证明这一点,那么下面的图片(来自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
答案2
SISD 是“单指令、单数据”的缩写。CPU 擅长执行顺序操作:取这个、执行那个、将其移到那里、取另一个、将两者相加、写入设备、读取响应等等。它们主要执行简单的操作,这些操作取一两个值并返回一个值。
SIMD 是单指令、多数据:对多个数据集同时执行相同的操作。例如,取 128 个值 [X 1 …X 128 ],取 128 个值 [Y 1 …Y 128 ],成对乘以相应的值并返回 128 个结果。SISD 处理器必须执行 128 条指令(+ 内存读取/写入),因为它一次只能乘以两个数字。如果寄存器中只能容纳 128 个数字,SIMD 处理器只需几个步骤即可完成此操作,甚至可能只需一个步骤。
SISD CPU 非常适合日常计算,因为它主要是顺序的,但有些任务需要以类似的方式处理大量数据 - 例如处理图形、视频渲染、破解密码、挖掘比特币等。GPU 允许大规模并行计算,前提是所有数据都必须以相同的方式处理。
好吧,这只是理论。在现实世界中,常规 CPU 提供一些 SIMD 指令(上交所),因此一些多数据任务可以在普通 CPU 上更高效地完成。同时,GPU 中的 ALU 不必处理同一件事,因为它们被分组到批次中(参见Mokubai 的回答)所以 CPU 不是纯粹的 SISD,GPU 也不是纯粹的 SIMD。
什么时候使用 GPU 进行计算是有益的?当你的计算真的非常大规模可并行时。你必须考虑到将输入写入 GPU 内存需要时间,读取结果也需要一些时间。当你可以构建一个在离开 GPU 之前进行大量计算的处理管道时,你可以获得最大的性能提升。
答案3
图形数据非常适合并行处理。将 1024x1024 像素的图片分成 16x16 的块,让每个核心处理这么小的块。将结果重新组合在一起,结果与一个处理器逐个处理这些块的结果没有什么不同。
实现该功能的条件是,一个核心的结果不会影响其他核心的结果,反之亦然。类似情况也适用于 Excel 工作表,其中 C 列中的单元格将 A + B 列的值相加。C1=A1+B1,C2=A2+B2,第 1 行和第 2 行相互独立。
图形数据处理是一项高度具体的任务,你可以专门为这类任务设计一个处理器——它也可以用于其他任务,比如挖掘比特币。显然,你可以通过使用彼此相邻的多个核心而不是使用一个大处理器来提高处理单元的效率。更高效不仅意味着更快,而且还具有这样的优势:如果你只需要 20% 的处理核心,你可以关闭其余核心,从而节省能源。
免责声明:以上示例在技术上可能不正确。它更多的是为了展示原理。我猜实际的数据处理会复杂得多。
答案4
主要答案是它们更简单,所以你可以把它们塞在一起,它们过去只做一项任务,那就是把碎片放在屏幕上。但现在它们在本质上更通用,就像 cpu 一样。cpu 和 gpu 之间的主要原因是 cpu 架构基于 x86,而 gpu 中的架构基于 AMD GCN 或 NVIDIA CUDA
尝试阅读 http://www.anandtech.com/show/4455/amds-graphics-core-next-preview-amd-architects-for-compute http://www.anandtech.com/show/5699/nvidia-geforce-gtx-680-review/2