【发布时间】:2018-12-20 16:51:26
【问题描述】:
我想确认我已经理解了许多机器学习讲座/笔记/视频中提到的向量化代码的概念。
我对此进行了一些阅读,发现 CPU 和 GPU 有一个称为 SIMD 的指令集;单指令多数据。
例如,这可以通过将两个变量移动到两个特殊的 64/128 位寄存器,然后一次添加所有位来实现。
例如,如果您使用-Ofast 标志(即
-Ofast - 无视严格的标准合规性。 -Ofast 启用所有 -O3 优化。它还启用对以下无效的优化 所有符合标准的程序。它打开 -ffast-math 和 Fortran 特定的 -fno-protect-parens 和 -fstack-arrays。
-Ofast 应在可能的情况下将任何用 C/C++ 编写的循环自动矢量化为 SIMD 指令。
我在 my own code 上对此进行了测试,并且能够显着加快 MNIST 数据集的速度,从 45 分钟缩短到 5 分钟。
我也知道 numpy 是用 C 语言编写并用 PyObjects 包装的。我阅读了很多他们的代码,但很难。
然后我的问题是:我上面的理解是否正确,Numpy 是否也做同样的事情,或者他们是否使用explicit pragmas 或其他特殊的instruction/register 名称进行矢量化?
【问题讨论】:
标签: python numpy vectorization simd