5

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

4

3 回答 3

6

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

如果代码无需任何努力就可以并行化,尤其是处理数据依赖性,那么代码就是令人尴尬的并行。请注意,令人尴尬的并行性仅意味着代码将被安全地并行化而无需付出任何努力;它不保证任何最佳性能。

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

// 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];

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

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

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


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

于 2013-01-10T19:07:05.500 回答
3

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

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

于 2013-01-10T14:20:44.797 回答
0

并行是尽可能多地使用我们的计算设备,因此我们尝试以这样的方式调度任务,使它们的执行几乎相互独立。

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

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

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

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

为了使一个完全向量化的规则,它必须像上面的例子一样是令人尴尬的平行。但这取决于给定的场景。对于两个具有相互依赖关系的规则,它们可以单独矢量化,等等。

于 2013-01-10T14:25:11.750 回答