CPU SIMD和GPU SIMD有何不同?

42

GPU使用SIMD模型,即同一部分代码将并行执行,并应用于数据集的各个元素。

然而,CPU也使用SIMD,并提供指令级并行性。例如,据我所知,类似SSE的指令将以并行方式处理数据元素。

虽然SIMD范式在GPU和CPU中似乎被不同地使用,但是GPU是否比CPU具有更强的SIMD能力?

CPU的并行计算能力相对于GPU在哪些方面“较弱”?


指令级并行是指两条指令是独立的,因此CPU可以在同一时钟周期内运行它们。这与SIMD数据并行是正交的。您希望编写能够利用两者的代码,例如每个时钟周期执行2个向量FMA指令,每个指令执行8个浮点FMA,总吞吐量为每时钟周期16个浮点FMA操作。通过SIMD x ILP x线程,可以将数据并行性公开到CPU。 - Peter Cordes
2个回答

36

两种处理器(CPU和GPU)都提供SIMD,其中最常见的概念单位是16字节/128位;例如4个浮点数(x,y,z,w)构成一个向量。

简单地说:

CPU通过将未来指令进行流水线处理来并行化更多操作,从而使它们在程序中更快地执行。下一步是多核心,可以独立运行不同的程序。

另一方面,GPU则通过继续使用SIMD方法并多次执行相同的程序来实现并行化;其中纯粹的SIMD方式是一组程序同时执行(这就是为什么在GPU上分支较差的原因,因为if语句的两个分支都必须执行;并且需要舍弃一个结果,以便锁定步骤程序以相同的速率执行);同时还有单程序,多数据(SPMD),其中一组相同程序的集合可以并行执行,但不一定要按照锁定步骤进行。

GPU的方法非常适用于需要对大量数据应用完全相同处理的情况,例如需要以相同方式转换的一百万个顶点,或者需要处理生成颜色的数百万像素。假设它们不会成为数据块/管道停顿,由于其限制,GPU程序通常提供更可预测的时间绑定执行;这对于时间并行性非常有好处,例如程序需要以某个速率重复其周期,例如每秒60次(16毫秒)以达到60 fps。
然而,CPU方法更适合决策和同时执行多个不同任务,并处理不断变化的输入和请求。
除了其许多其他用途和目的外,CPU也用于协调GPU执行的工作。

18

这个想法类似,大概是这样(非常不正式地说):

  • CPU 有一组可以运行打包值的功能。根据您 CPU 的品牌和版本,您可能可以访问 SSE2、3、4、3dnow 等,并且每个功能都为您提供更多的函数。您受寄存器大小的限制,使用的较大数据类型会减少可以并行使用的值的数量。您可以自由混合和匹配 SIMD 指令和传统的 x86/x64 指令。
  • GPU 允许您为纹理的每个像素编写整个管道。纹理大小不取决于管道长度,即您可以在一个周期中影响的值的数量不依赖于任何东西,除了您的 GPU 和您可以链接的函数(像素着色器)可以是几乎任何东西。然而,在设置和读取值方面,它有点更加刚性,速度会比较慢,而且这是一个一次性的过程(加载值、运行着色器、读取值),您不能在此之外进行任何调整,因此实际上需要使用很多值才值得。

7
CPU和GPU之间的底层硬件非常相似。 GPU通过遮蔽不活动线程来更好地隐藏底层的SIMD设计。对于CPU,您必须明确管理哪些lanes是活动的。顺便说一下,AVX-512增加了掩码寄存器,使其更类似GPU。 - void_ptr
1
它们的形状相似,但GPU拥有的核心数量和“寄存器大小”(即纹理大小)使它们成为完全不同的生物。 - Blindy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接