了解numpy的循环矢量化

时间:2018-12-20 16:51:26

标签: python numpy vectorization simd

我想证明我已经理解了许多机器学习讲座/笔记/视频中提到的矢量化代码的概念。

我对此进行了一些阅读,发现CPU和GPU都有一个称为SIMD的指令集。单指令多数据。

例如,通过将两个变量移至两个特殊的64/128位寄存器,然后一次将所有位相加,即可工作。

例如,如果您使用-Ofast标志(即

)打开优化功能,我也已经阅读了大多数现代编译器(例如GCC)
  

-Ofast-忽略严格的标准合规性。 -Ofast启用所有-O3优化。它还启用了无效的优化   所有符合标准的程序。它打开-ffast-math,   Fortran专用的-fno-protect-parens和-fstack-arrays。

然后,-Ofast应该在可能的情况下自动向量化用C / C ++编写的SIMD指令。

我在my own code上进行了测试,并且能够从45分钟降低到5分钟,从而大大提高了MNIST数据集的速度。

我也知道numpy是用C编写并用PyObjects包装的。我读了很多他们的代码,但这很困难。

然后我的问题是:我的理解是否正确,Numpy是否也做同样的事情,或者它们使用explicit pragmas或其他特殊的instruction/register名称进行矢量化处理?

1 个答案:

答案 0 :(得分:1)

numpy不会做任何事情。

在numpy上下文中的向量化一词意味着您直接使numpy在数组上工作,而不是自己进行循环。然后通常将其传递给所谓的“通用函数”或简称“ ufunc”。这些函数是C函数,将在C的C语言中处理循环以实现预期的操作。

但是它通常不能执行任何ISA向量化。原因是这些函数对于所有类型的数组,密集数组或这些密集数组的视图都是通用的。因此,由于使用了模式,因此无法期望向量化。

如果您要进行ISA向量化的numpy调用,则可以使用numba来实现JIT的JIT(从而实现ISA向量化)。还有另一个项目将使用英特尔的一个库,但是我找不到了。