什么是“vector化”?
现在好几次,我遇到过这个术语在matlab,fortran …其他…但我从来没有find一个解释是什么意思,它是什么? 所以我在这里问,什么是vector化,例如“一个循环是vector化的”是什么意思?
许多CPU具有“向量”或“SIMD”指令集,它们将同一操作同时应用于两个,四个或更多个数据。 现代的x86芯片有SSE指令,很多PPC芯片都有“Altivec”指令,甚至有些ARM芯片有一个叫做NEON的向量指令集。
“向量化”(简化)是重写一个循环的过程,它不是处理一个数组的单个元素N次,而是同时处理(比方说)4个元素的数组。
(我select了4,因为这是现代硬件最有可能直接支持的;“vector化”这个术语也被用来描述更高层次的软件转换,你可能只是完全抽象出循环,而只是描述对数组而不是元素包括他们)
vector化与循环展开的区别:考虑以下非常简单的循环,它添加了两个数组的元素并将结果存储到第三个数组中。
for (int i=0; i<16; ++i) C[i] = A[i] + B[i];
展开这个循环将会把它转换成如下forms:
for (int i=0; i<16; i+=4) { C[i] = A[i] + B[i]; C[i+1] = A[i+1] + B[i+1]; C[i+2] = A[i+2] + B[i+2]; C[i+3] = A[i+3] + B[i+3]; }
另一方面,对其进行vector化则产生如下的结果:
for (int i=0; i<16; i+=4) addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);
其中“addFourThingsAtOnceAndStoreResult”是编译器用于指定向量指令的任何内在的占位符。 请注意,一些编译器能够像这样自动向量化非常简单的循环,这通常可以通过编译选项来启用。 更复杂的algorithm仍然需要程序员的帮助才能生成好的向量代码。
vector化是将标量程序转换为vector程序的术语。 vector化程序可以从单个指令运行多个操作,而标量只能一次操作一对操作数。
从维基百科 :
标量方法:
for (i = 0; i < 1024; i++) { C[i] = A[i]*B[i]; }
vector化的方法:
for (i = 0; i < 1024; i+=4) { C[i:i+3] = A[i:i+3]*B[i:i+3]; }
它指的是在一个单一的步骤中对数字进行单个math运算的能力。 您经常使用Fortran来看它,因为这与科学计算有关,这与超级计算有关,在那里vector化算术首次出现。 现在,几乎所有的台式机CPU都通过英特尔的SSE等技术提供某种forms的vector化算术。 GPU也提供了一种向量化algorithm。
vector化在需要高效处理大量数据的科学计算中被大量使用。
在真正的编程应用程序中,我知道它用于NUMPY(不知道其他)。
Numpy(python中的科学计算软件包)使用vector化来快速处理n维数组,如果使用内置的用于处理数组的python选项,速度通常会变慢。
虽然大量的解释是在那里,这里的vector化是在NUMPY文件页面
向量化描述了代码中没有任何明确的循环,索引等 – 这些事情正在发生,当然,这只是在优化的,预先编译的C代码中的“幕后”。 vector化代码有很多优点,其中包括:
-
vector化的代码更简洁,更易于阅读
-
更less的代码行通常意味着更less的错误
-
代码更接近于标准的math符号(使得代码的正确编码更为容易)
-
vector化导致更多的“Pythonic”代码。 如果没有向量化,我们的代码将被浪费在效率低下,难于阅读的循环中。
看到上面的两个答案。 我只想补充说,想做vector化的理由是这些操作可以通过超级计算机和多处理器轻松地进行,从而产生巨大的性能增益。 在单处理器计算机上不会有性能提升。