Arrays 阵列编程/矢量化:更快的代码?

Arrays 阵列编程/矢量化:更快的代码?,arrays,vector,octave,vectorization,Arrays,Vector,Octave,Vectorization,最近,我喜欢八度音阶:把向量/矩阵当作标量,不用担心底层的循环等来计算矩阵乘法等等 有人告诉我,它不仅不容易出错,而且速度更快,因为编译器/解释器可以在幕后优化计算 我不知道为什么会这样。有人能解释为什么矢量化/数组编程会更有效吗?这是因为计算可以并行进行?基本上,处理器的指令可以同时处理多条数据。只有当你批量完成类似的工作并同时完成所有工作时,你才能利用这些优势 有几个性能改进: 处理器有多个执行单元,否则在标量操作期间这些执行单元可能处于空闲状态 数据在同一时间被访问,这意味着它很可能位于

最近,我喜欢八度音阶:把向量/矩阵当作标量,不用担心底层的循环等来计算矩阵乘法等等

有人告诉我,它不仅不容易出错,而且速度更快,因为编译器/解释器可以在幕后优化计算


我不知道为什么会这样。有人能解释为什么矢量化/数组编程会更有效吗?这是因为计算可以并行进行?

基本上,处理器的指令可以同时处理多条数据。只有当你批量完成类似的工作并同时完成所有工作时,你才能利用这些优势

有几个性能改进:

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

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

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

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


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

在Octave中,它取决于您所谈论的操作。核心是在C++中实现的,例如元素矩阵乘法。正常的矩阵乘法是通过使用的BLAS库(例如ATLAS,它对特定的CPU类型进行了许多优化)和大量Fortran代码来完成的