【问题标题】:Does SIMD require a multi-core CPU?SIMD 是否需要多核 CPU?
【发布时间】:2018-04-13 06:30:05
【问题描述】:

实现 SIMD 是否需要多核 CPU?

在阅读有关 SIMD 的 Wikipedia 时,我发现了以下短语“多个处理元素”。那么这句话和“多核CPU”有什么区别呢?

【问题讨论】:

  • 没有。 "SI" = 单条指令,"MD" = 多条数据。例如,内核需要有 4 个可用的乘法器电路,这样一条指令就可以同时乘以 4 个数字。并行性在核心本身。
  • @ShreckYe 我认为问题的意图是实现 SIMD 是否需要多核 CPU,而不是多核 CPU 是否需要 SIMD。原文是需要修复的语法混乱,但我选择了与答案不匹配的其他解释。 (我对其进行了编辑以询问答案正在回答的问题。)
  • @PeterCordes 知道了。感谢您指出。

标签: cpu cpu-architecture simd


【解决方案1】:

不,每个内核通常都可以执行指令集中的大多数通用操作。但是 SIMD 操作的“多个处理元素”只是对不同的数据(不同的字节或字)执行单个操作。

例如,ARM Cortex-A53 微架构的每个内核都能够独立于其他内核运行 SIMD 指令,而诸如 MMXSSESSE2 等 SIMD 指令集最初是在单核 CPU 上引入的。

【讨论】:

    【解决方案2】:

    每个内核都有自己独立的 SIMD 执行单元。在一个内核中使用 SIMD 指令不会消耗其他内核中的执行资源。即使在同一物理芯片上的独立内核也是独立的,因此它们可以单独进入睡眠状态以节省电力,以及保持它们隔离的各种其他设计原因。

    我知道的一个例外:AMD Bulldozer 有两个弱整数内核共享一个 SIMD / FPU 并共享一些缓存。他们称之为“集群”,它基本上是超线程(SMT)的替代品。见David Kanter's Bulldozer write-up on RealworldTech

    SIMD 和多核是正交的:您可以在没有 SIMD 的情况下拥有多核(也许某些 ARM 芯片没有 FPU / NEON),并且您可以在没有多核的情况下拥有 SIMD。

    后者的许多示例,包括最显着的早期 x86 芯片,例如 Pentium-MMX 到 Pentium III / Pentium 4,具有 MMX / SSE1 / SSE2 但都是单核 CPU。


    程序中至少有三种不同的并行性

    • Instruction-level parallelism:可以在同一个执行线程中重叠不同指令完成的一些工作,从而保持每条指令一个接一个地运行的错觉。通过构建流水线 CPU 内核或超标量(每个时钟多条指令)甚至乱序执行来利用它。 (详见my answer on a question about that。)

      创建软件时:尽可能避免长依赖链,将这种并行性暴露给硬件。 (例如,将sum += a[i++] 替换为sum1+=a[i]; sum2+=a[i+1]; i+=2;:使用多个累加器展开)。或者使用数组而不是链表,因为要加载的下一个地址的计算成本很低,而不是成为您必须等待缓存未命中的内存数据的一部分。 但大多数 ILP 已经存在于“普通”代码中,没有做任何特殊的事情,您构建更大/更高级的硬件以找到更多内容,并增加平均每时钟指令数。

    • Data parallelism:您需要对图像的每个像素或音频文件中的每个样本执行相同的操作。 (例如混合 2 个图像,或混合两个音频流)。 通过在每个 CPU 内核中构建并行执行单元来利用这一点,这样一条指令就可以并行执行 16 个单字节加法,从而在不增加通过每个时钟的 CPU 内核。 这是 SIMD:单指令,多数据。

      音频/视频是这方面最著名的应用程序,其中加速是大量,因为您可以将大量字节或 16 位元素放入单个固定宽度向量寄存器中。

      通过使用智能编译器自动矢量化循环或手动来利用 SIMD。。 SIMD 将 sum += a[i]; 转换为 sum[0..3] += a[i+0..3](每个向量 4 个元素,例如 intfloat 与 32 位向量)。

    • Thread/task-level parallelism:利用多核 CPU,通过手动编写多线程代码暴露给硬件,或使用 OpenMP 或其他自动并行化工具对循环进行多线程处理,或使用启动多个循环的库函数用于大矩阵乘法之类的线程。

      或者更简单的是一次运行多个单独的程序。例如使用make -j8 编译以同时保持 8 个编译进程在运行。粗粒度的任务级并行性也可以通过在多台计算机的集群上运行您的工作负载,甚至是分布式计算来加以利用。

      但多核 CPU 使得在任务需要共享大量数据(如大型数组)或通过共享内存进行低延迟通信的情况下利用细粒度线程级并行性成为可能/高效。 (例如,使用锁来保护共享数据的不同部分,或无锁编程。)

    这三种并行是正交的。

    在现代 CPU 上汇总大量 float

    您会为每个 CPU 内核启动一个线程,并让每个内核循环遍历共享内存中的一大块数组。 (线程级并行)。比方说,这为您提供了 4 倍的加速。 (由于内存瓶颈,即使这可能是不现实的,但您可以想象其他一些不需要读取这么多内存的计算密集型任务,在 28 核 Xeon 或具有其中两个芯片的双插槽服务器上运行。 .)

    每个线程的代码将使用 SIMD 对每个指令分别在每个内核上执行 4 或 8 次加法。 (SIMD)。这为您提供了 4 或 8 倍的加速。 (或 16 个 AVX512)

    您可以使用 8 个向量累加器展开,以隐藏浮点加法的延迟。 (ILP)。 Skylake 的vaddps 指令具有 4 个周期的延迟和 0.5 个周期的吞吐量(即每个时钟 2 个周期)。因此,8 个累加器仅足以隐藏该延迟并同时保持 8 个 FP 添加指令运行。

    单线程标量 sum += a[i++] 的总吞吐量增益是所有这些加速因素的乘积4 * 8 * 8 = 非并行化、非矢量化、单线程的吞吐量的 256 倍累加器 ILP 瓶颈的幼稚实现,就像您从 gcc -O2 获得的简单循环一样。 clang -O3 -march=native -ffast-math 会给 SIMD 和一些 ILP(因为 clang 知道如何在展开时使用多个累加器,通常使用 4,不像 gcc。)

    您需要 OpenMP 或其他自动并行化来利用多个内核。

    相关:Why does mulss take only 3 cycles on Haswell, different from Agner's instruction tables? 更深入地了解 ILP 和 SIMD 的多个累加器,用于 FMA 循环。

    【讨论】:

      【解决方案3】:

      是的。确实如此。但仅从营销的角度来看。在没有 SIMD 指令的情况下很难销售 uP 或 uC。

      【讨论】:

      • 你的最后一句话没有意义。例如,AVR 微控制器是没有 SIMD 的单核。您的意思是说单核 CPU with SIMD 很难销售吗?这些天有点真实,但英特尔当然很高兴销售 Pentium-MMX(他们的第一个 SIMD CPU,也是所有主流 CPU 中最早的 SIMD 实现之一)。我仍然记得他们的广告活动,人们穿着五颜六色的无尘室“兔子”套装intel.com/pressroom/archive/releases/1997/CN12297A.HTM,谷歌搜索intel pentium mmx ads。 SIMD 早于主流 CPU 的多核数年。
      • AVR 是现代的还是多核的? 8051也没有:)。 现代 uP 或 uC(单核或多核)设计不会被老板接受而没有 SIMD 指令,因为用户需要它们(在 uC 中用于 DSP)。
      • 但即使在今天,ARM Cortex-A17 for example 也有 1 到 4 个核心配置,NEON 用于整数/FP SIMD。我认为即使在低端芯片中,NEON 指令也并非完全罕见。它允许它在每条指令中复制更多内存,这对简单的有序芯片很重要。
      • 我没有做过太多嵌入式的东西,我不太了解不同ucontroller的功率/速度/成本权衡。我大多只是在 SO 上看到关于它们的 asm 问题并出于兴趣阅读。我发现Why are Atmel AVRs so popular? 很有趣。对于低功耗应用,它们似乎比 ARM 更好,但一些评论者说它们最适合业余爱好者,商业设计更经常使用 PIC 或 MSP430。
      • 我现在对此投了反对票,因为我认为您误读了这个问题。我认为 OP 是在询问 SIMD 是否需要多个内核,而不是在多核 CPU 上是否需要 SIMD。 (即他们不明白线程级并行与数据级并行不同)。就像我多次说过的那样,您正在回答与问题相反的问题。 (此外,很明显,没有 SIMD 的处理器的销量不可忽略;显然人们希望它们用于非常低端的爱好项目,如 AVR,或者运行没有自动矢量化且没有手动矢量化的代码。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多