我想证明我已经理解了许多机器学习讲座/笔记/视频中提到的矢量化代码的概念。
我对此进行了一些阅读,发现CPU和GPU都有一个称为SIMD的指令集。单指令多数据。
例如,通过将两个变量移至两个特殊的64/128位寄存器,然后一次将所有位相加,即可工作。
例如,如果您使用-Ofast
标志(即
-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
名称进行矢量化处理?
答案 0 :(得分:1)
numpy不会做任何事情。
在numpy上下文中的向量化一词意味着您直接使numpy在数组上工作,而不是自己进行循环。然后通常将其传递给所谓的“通用函数”或简称“ ufunc”。这些函数是C函数,将在C的C语言中处理循环以实现预期的操作。
但是它通常不能执行任何ISA向量化。原因是这些函数对于所有类型的数组,密集数组或这些密集数组的视图都是通用的。因此,由于使用了模式,因此无法期望向量化。
如果您要进行ISA向量化的numpy调用,则可以使用numba来实现JIT的JIT(从而实现ISA向量化)。还有另一个项目将使用英特尔的一个库,但是我找不到了。