这个问题说明了一切。在我看来,矢量化与令人尴尬的并行问题密切相关。换句话说,所有可矢量化的程序都必须是极其并行的程序。它是否正确?
对令人尴尬的并行性的快速总结:
一个代码是尴尬地平行如果代码可以毫不费力地并行化,特别是处理数据依赖性。请注意,令人尴尬的并行性仅意味着代码将毫不费力地安全地并行化;它不保证任何最佳性能。
一个简单的例子是两个向量的求和。
// 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 和英特尔的 MIC 架构。它们通过处理数据相关的操作和分支来实现更灵活的 SIMD 操作。
总而言之,在矢量化的狭义定义中,即传统 CPU SIMD 操作的矢量化,我认为可矢量化程序应该是高度并行的。然而,SIMD/矢量化的高级形式可以实现数据相关的操作和任意分支。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)