为了账号安全,请及时绑定邮箱和手机立即绑定

什么是“向量化”?

什么是“向量化”?

万千封印 2020-02-04 16:18:23
现在好几次,我在matlab,fortran等中都遇到过这个术语……但我从未找到任何解释,它的含义是什么,它的作用是什么?所以我在这里问,什么是向量化?例如,“循环被向量化”是什么意思?
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

许多CPU具有“向量”或“ SIMD”指令集,这些指令集将相同的操作同时应用于两个,四个或更多数据。现代的x86芯片具有SSE指令,许多PPC芯片具有“ Altivec”指令,甚至某些ARM芯片也具有称为NEON的矢量指令集。


“向量化”(简化)是重写循环的过程,以便与其同时处理(例如)数组的4个元素N / 4次,而不是处理数组的单个元素N次。


(我之所以选择4,是因为这是现代硬件最有可能直接支持的功能;“向量化”一词也用于描述更高级别的软件转换,您可以在其中完全抽象出循环并仅描述对数组而不是元素的操作。组成它们)


向量化和循环展开之间的区别: 考虑以下非常简单的循环,该循环将两个数组的元素相加并将结果存储到第三个数组中。


for (int i=0; i<16; ++i)

    C[i] = A[i] + B[i];

展开此循环会将其转换为如下形式:


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

}

另一方面,将其向量化会产生如下结果:


for (int i=0; i<16; i+=4)

    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

其中“ addFourThingsAtOnceAndStoreResult”是您的编译器用来指定矢量指令的任何内部函数的占位符。请注意,某些编译器能够自动矢量化非常简单的这样的循环,通常可以通过编译选项启用它。更复杂的算法仍然需要程序员的帮助才能生成良好的矢量代码。


查看完整回答
反对 回复 2020-02-04
?
忽然笑

TA贡献1806条经验 获得超5个赞

向量化在科学计算中得到了很大的应用,在科学计算中,大量数据需要得到有效处理。

在实际的编程应用程序中,我知道它已在NUMPY中使用(不确定其他)。

Numpy(Python中用于科学计算的软件包),使用矢量化来快速处理n维数组,如果使用内置的python选项来处理数组,这通常会比较慢。

虽然万吨的解释是在那里,这里是矢量化定义为numpy的文档页面

向量化描述了代码中没有任何显式的循环,索引等操作-当然,这些事情只是在优化的预编译C代码中“在幕后”发生的。向量化代码具有许多优点,其中包括:

  1. 向量化的代码更简洁,更易于阅读

  2. 更少的代码行通常意味着更少的错误

  3. 该代码更类似于标准数学符号(通常更容易正确地对数学构造进行编码)

  4. 向量化产生更多的“ Pythonic”代码。没有向量化,我们的代码将效率低下,并且难以阅读循环。


查看完整回答
反对 回复 2020-02-04
  • 3 回答
  • 0 关注
  • 4658 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信