数组编程/矢量化:更快的代码?

时间:2016-01-14 13:39:20

标签: arrays vector octave vectorization

最近,我在Octave中一直很享受vectorization:将矢量/矩阵视为标量并且不用担心底层循环等来计算矩阵乘法等等。

有人告诉我,除了不易出错之外,它也更快,因为编译器/解释器可以优化计算。

我不知道为什么会这样。任何人都可以阐明为什么矢量化/数组编程会更有效率?这是因为计算可以并行进行吗?

2 个答案:

答案 0 :(得分:4)

导致循环在Octave中变慢的一个重要原因是,它在解释器中运行,而不像Java或C这样通常编译的语言。 This article解释了和解释器和编译器之间的区别,但基本上编译器会将代码转换为CPU可以在程序运行之前运行的低级代码(可能通过操作系统)。这些语言通常是强类型的,即您必须预先声明所有变量,因此他们可以预先查看所有代码并优化程序如何分配内存并对其进行计算等。另一方面,解释器在运行时动态地逐行转换代码。这意味着它不知道将来会发生什么样的记忆或计算。在跑步时还有解释的开销。

那么为什么矩阵运算在解释语言Octave中运行得更快呢?这是因为许多内置函数实际上都是用另一种语言预编译的(在MATLAB中它是C,对Octave不太确定,但我会猜测相同)因此他们享受编译代码的加速优势

除此之外,您可以公平地假设他们使用的算法比您更好。考虑例如矩阵乘法。编写这个的简单方法是在O(n ^ 3)中运行的三重嵌套for循环。然而,有more complex algorithms可以提供亚立方运行时间,并且可以导致巨大的加速。最后,我在MATLAB中知道,因此我也假设在Octave中,许多常见的内置函数也被编译为通过并行化来利用多核过程。

答案 1 :(得分:1)

基本上,处理器具有可以同时对多个数据进行操作的指令。如果你批评类似的工作并同时完成所有工作,你只能利用这些。

有几项性能提升:

  • 处理器有多个执行单元,否则在标量操作期间可能会空闲。
  • 同时访问数据,这意味着它可能位于内存和各级CPU缓存中的类似位置。
  • 完成相同数量的工作需要更少的处理器指令,从而释放处理器管道前端的资源,因为它的工作量较少。

要在不直接使用这些指令的情况下利用这些指令,您需要以编译器友好的方式排列代码。在你的情况下,这意味着利用矩阵和矢量对象。