什么是“向量化”?

现在好几次,我在matlab,fortran等中都遇到过这个术语……但我从未找到任何解释,它的含义是什么,它的作用是什么?所以我在这里问,什么是向量化?例如,“循环被向量化”是什么意思?



万千封印
浏览 4692回答 3
3回答

缥缈止盈

许多CPU具有“向量”或“ SIMD”指令集,这些指令集将相同的操作同时应用于两个,四个或更多数据。现代的x86芯片具有SSE指令,许多PPC芯片具有“ Altivec”指令,甚至某些ARM芯片也具有称为NEON的矢量指令集。“向量化”(简化)是重写循环的过程,以便与其同时处理(例如)数组的4个元素N / 4次,而不是处理数组的单个元素N次。(我之所以选择4,是因为这是现代硬件最有可能直接支持的功能;“向量化”一词也用于描述更高级别的软件转换,您可以在其中完全抽象出循环并仅描述对数组而不是元素的操作。组成它们)向量化和循环展开之间的区别: 考虑以下非常简单的循环,该循环将两个数组的元素相加并将结果存储到第三个数组中。for (int i=0; i<16; ++i)&nbsp; &nbsp; C[i] = A[i] + B[i];展开此循环会将其转换为如下形式:for (int i=0; i<16; i+=4) {&nbsp; &nbsp; C[i]&nbsp; &nbsp;= A[i]&nbsp; &nbsp;+ B[i];&nbsp; &nbsp; C[i+1] = A[i+1] + B[i+1];&nbsp; &nbsp; C[i+2] = A[i+2] + B[i+2];&nbsp; &nbsp; C[i+3] = A[i+3] + B[i+3];}另一方面,将其向量化会产生如下结果:for (int i=0; i<16; i+=4)&nbsp; &nbsp; addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);其中“ addFourThingsAtOnceAndStoreResult”是您的编译器用来指定矢量指令的任何内部函数的占位符。请注意,某些编译器能够自动矢量化非常简单的这样的循环,通常可以通过编译选项启用它。更复杂的算法仍然需要程序员的帮助才能生成良好的矢量代码。

忽然笑

向量化在科学计算中得到了很大的应用,在科学计算中,大量数据需要得到有效处理。在实际的编程应用程序中,我知道它已在NUMPY中使用(不确定其他)。Numpy(Python中用于科学计算的软件包),使用矢量化来快速处理n维数组,如果使用内置的python选项来处理数组,这通常会比较慢。虽然万吨的解释是在那里,这里是矢量化定义为numpy的文档页面向量化描述了代码中没有任何显式的循环,索引等操作-当然,这些事情只是在优化的预编译C代码中“在幕后”发生的。向量化代码具有许多优点,其中包括:向量化的代码更简洁,更易于阅读更少的代码行通常意味着更少的错误该代码更类似于标准数学符号(通常更容易正确地对数学构造进行编码)向量化产生更多的“ Pythonic”代码。没有向量化,我们的代码将效率低下,并且难以阅读循环。
打开App,查看更多内容
随时随地看视频慕课网APP