【问题标题】:Compare the number of instructions executed on the SIMD machine to the MIMD machine比较 SIMD 机器和 MIMD 机器上执行的指令数
【发布时间】:2019-06-02 15:07:53
【问题描述】:

我们希望尽可能高效地执行下面的循环。我们有两台不同的机器,一台 MIMD 机器和一台 SIMD 机器。

for (i=0; i<2000; i++)
    for (j=0; j<3000; j++)
        X_array[i][j] = Y_array[j][i] + 200;

第一季度。对于一台 4 CPU MIMD 机器,这台 MIMD 机器的加速是多少?

第二季度。对于八宽 SIMD 机器(即八个并行 SIMD 功能单元),比较 SIMD 机器和 MIMD 机器上执行的指令数。

我认为 Q1 的答案是 4,但我不知道 Q2.. 如何解决这个问题?

【问题讨论】:

  • 这看起来像家庭作业,并且关于 SO 家庭作业的问题预计会显示出对解决方案的一些努力。不能指望 SO 用户只会给出解决方案。请编辑以显示已尝试的内容。
  • 多核与 SIMD 不是相互冲突的选择,它们是正交的。事实上,大多数现实世界的多核 CPU 都有某种形式的 SIMD,因为在创建多核 CPU 的复杂性之前,值得将 SIMD 指令添加到单核中。使用多线程的加速通常只对大问题很重要,因为线程在大多数系统上都有很多启动开销。您的 4 倍完美加速还假设线程不竞争内存带宽或任何东西。

标签: architecture cpu-architecture


【解决方案1】:

如果不做更多您没有指定的假设,就没有足够的信息来回答这个问题。


用 SIMD 向量化这个问题并非易事,因为 X[i][j]Y[j][i] 的数组索引是相反的。 所以问题是制作数组的转置副本(并添加 +200 是的 SIMD 可以提供帮助,但是您将需要 shuffle 和 blend 指令以及垂直添加,所以细节很大程度上取决于 ISA 提供的 shuffle 和 blend 指令的细节。还是大步走负荷或收集指令?

还有你的编译器有多聪明,它是否使用 SIMD 指令。或者它是否可能加载一个向量并使用 SIMD 执行+200,然后用标量分散结果?甚至将向量的元素提取到内存的成本也取决于 ISA。以 x86 为例,SSE2 需要单独的 shuffle 才能将您想要的元素放到向量的底部。但是 SSE4.1 添加了pextrq,可以将一个qword double 存储到内存中。但它的 AVX 版本只能访问向量的低 2 个元素。


多核与 SIMD 不是相互冲突的选择,它们是正交的。事实上,大多数现实世界的多核 CPU 都有某种形式的 SIMD,因为在创建多核 CPU 的复杂性之前,值得将 SIMD 指令添加到单核中。

在 4 个 CPU 上运行标量代码通常会浪费数据并行性问题。在现实生活中,您可以使用 SIMD 对问题进行矢量化处理,然后(如果问题足够大)将其拆分为多个线程以实现 MIMD x SIMD 乘法加速。


使用多个线程访问相同数据的加速可能不是线性的。这个问题只涉及每个数组元素一次,因此它可能受内存限制。但它有一个困难的访问模式。没有根据假设这个问题将受 ALU 限制并且与内核数量成线性关系。在实践中,所有内核都将竞争读取/写入相同的 RAM。或者他们的私有缓存都需要读取结果。

通过仔细设计转置,您可能可以避免多个线程需要非常频繁地读取相同的缓存行。

启动开销对于在实践中使用 MIMD 线程级并行性也很重要。也许您应该假设零开销,或者您以最小的同步成本为不同的数组重复执行此操作?然后确保您可以假设零启动开销。

(除非您在谈论单核内的指令级并行性。那是免费的。但您提到“4 CPU”系统,也暗示线程级并行性。当然,在现实生活中它通常只值得在为具有超标量和 SIMD 的单个内核开发了容易实现的成果之后构建多个内核,因此实际代码可能在每个内核上每个时钟运行 3 条向量指令,每条指令在 8 个 SIMD 向量元素上运行。)

例如这就是您在具有单精度 float 向量的四核 Skylake CPU 上所获得的。


但问题是要你算出指令的数量吗?

比较在 SIMD 机器和 MIMD 机器上执行的指令数。

你怎么知道有多少循环开销,或者编译器展开了多少。

更重要的是,shuffle/blend 指令的设计究竟是如何让您转置的。

我想知道切换索引是否是一个错误,因为这是一个非常简单的问题,如果它只是一个没有转置的复制和添加,那么它很容易适应纯垂直 SIMD。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 2011-07-13
    • 2015-05-28
    • 1970-01-01
    • 2015-04-17
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多