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

时间:2019-06-02 15:07:53

标签: architecture cpu-architecture

我们想尽可能高效地执行以下循环。我们有两种不同的机器,即MIMD机器和SIMD机器。

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

Q1。对于4 CPU MIMD机器,此MIMD机器的速度是多少?

Q2。对于8英寸宽的SIMD机器(即8个并行SIMD功能单元),将SIMD机器上执行的指令数与MIMD机器进行比较。

我认为第一季度的答案是4,但我不知道第二季度。 如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果没有做出很多未指定的假设,没有足够的信息来回答这个问题。


使用SIMD向量化此问题并非易事,因为X[i][j]Y[j][i]的数组索引是相反的。 所以问题是要制作数组的转置副本(并添加+200是的,SIMD可以帮助您,但是您需要改组和混合指令以及垂直添加,因此,细节在很大程度上取决于ISA提供的混洗和混合说明的细节。还是大步前进或收集指令?

以及您的编译器的智能程度如何,是否完全使用SIMD指令。还是是否可以加载向量,然后将+200用SIMD进行处理,然后用标量分散结果?甚至将向量的元素提取到内存的成本也取决于ISA。例如,对于x86,SSE2需要单独的混洗才能将想要的元素移到向量的底部。但是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机器的指令数。

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

更重要的是,随机/混合指令的设计目的是为了让您转座。

我想知道切换索引是否是一个错误,因为这是一个非常简单的问题,如果它只是一个无需转置就可以进行复制和添加的操作,那么很容易接受普通的垂直SIMD。