矢量化和尴尬并行之间的关系是什么?

时间:2013-01-10 14:06:16

标签: parallel-processing

这个问题说明了一切。在我看来,矢量化与令人尴尬的并行问题密切相关。换句话说,所有可矢量化的程序必须是令人尴尬的并行程序。这是对的吗?

3 个答案:

答案 0 :(得分:2)

令人尴尬的并行性的快速总结:

代码是令人尴尬的并行如果代码可以在没有任何努力的情况下并行化,尤其是处理数据依赖性。请注意,令人尴尬的并行性只意味着代码将安全地并行化而不需要努力;它不保证任何最佳性能。

一个简单的例子是两个向量的总和。

// A, B, and C are all distinct arrays.    
for (int i = 0; i < N; ++i)
  C[i] = A[i] + B[i];

此代码令人尴尬地并行,因为C没有数据依赖性。这个代码可以简单地并行化,例如,使用OpenMP:

#pragma omp parallel for 
for (int i = 0; i < N; ++i)
  C[i] = A[i] + B[i];

矢量化是实现并行化的一种特殊形式。特别地,矢量化主要使用处理器中的专用SIMD执行硬件单元,使用诸如x86 SSE / AVX和ARM NEON之类的专用指令。编译器可以自动对代码进行矢量化,也可以使用内在函数和直接汇编代码手动进行矢量化。

我不认为矢量化并不一定意味着要矢量化的代码必须令人尴尬地并行。但是,在实践中,大多数可矢量化的代码都是令人尴尬的并行,因为几乎所有SIMD指令都假定这一点。我找不到任何允许数据相关操作的SIMD指令。从这个意义上讲,是的,你可以说可矢量化的程序需要令人尴尬地平行。

然而,从广义上讲,矢量化可以采用GPGPU风格的SIMD编程,例如Nvidia的CUDA和Intel的MIC架构。它们通过处理数据相关的操作和分支来实现灵活的SIMD操作。


总而言之,在矢量化的狭义定义中,即传统CPU的SIMD操作的矢量化,我相信可矢量化程序应该是令人尴尬的并行。但是,SIMD /矢量化的高级形式可以实现与数据相关的操作和任意分支。

答案 1 :(得分:1)

令人尴尬的并行问题是不需要以并行形式编写的任务。 矢量化是传统程序变得平行的过程。

所以,这不是一个是另一个的逻辑子类型的情况,而是趋势。问题越接近令人尴尬的并行,就需要的矢量化程度越低。

答案 2 :(得分:0)

并行性是尽可能地使用我们的计算设备,因此我们尝试以这样的方式安排任务,以便它们的执行几乎彼此独立。

现在,并行计算中的Vectorization是并行化的一种特殊情况,其中默认情况下在一个线程上一次执行一个操作的软件程序被修改为同时执行多个操作。

矢量化是将计算机程序从标量实现(一次处理一对操作数)转换为矢量实现的更有限的过程,该矢量实现一次处理多对操作数上的一个操作。

让我们举一个添加两个数组的简单例子:

在正常模式下,我们需要一个循环来添加两个数组。我们可以通过多种方式使它并行,就像我们可以创建两个线程并将数组分成两个相等的部分并分别分配给线程。现在,最多没有。可以提高性能的线程数等于no。数组节点或数组长度。 如果我们应用并行性,那么它不应该循环所有数组来添加它。它应该只启动一个命令,并且将添加两个数组。为此,我们需要以这种方式使数组添加程序并行,以便它不需要任何循环。为此,我们将数组划分为等于数组长度的部分,并将每个部分分配给一个新线程并同时启动所有这些部分,以便所有添加都在单个指令下发生而不会同时循环。

对于完全矢量化的rutine,它必须像上面的例子一样令人尴尬地平行。但这取决于给定的场景。对于具有相互依赖性的两个rutines,它们可以单独地进行矢量化等。