【问题标题】:Understanding numpy's vectorization of loops了解 numpy 的循环向量化
【发布时间】: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


    【解决方案1】:

    numpy 不会做那样的事情。

    numpy 上下文中的向量化一词意味着您让 numpy 直接在您的数组上工作,而不是自己创建一个循环。然后通常将其传递给所谓的“通用函数”,或简称为“ufunc”。这些函数是 C 函数,它们将在 C 中的 C for 循环中处理预期的操作。

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

    如果您想要 ISA 矢量化 numpy 调用,您可以使用 JIT 可以 JIT 的 numba(因此真的是 ISA 矢量化)。还有另一个项目将使用英特尔的库之一,但我再也找不到了。

    【讨论】:

    • 好的,所以 numpy 将循环向下推到 C 并且它们更快,因为没有类型检查等。除此之外,如果我编写自己的 C 循环,它们可以变成 ISA 矢量化只需使用-Ofast?
    • 你好,我的理解有限,但这不是和this ans矛盾吗?
    • 有非常少量的循环可以在非常小的上下文中进行矢量化。即使这样,矢量化也可能不值得,因为您会花费更多时间等待数据。
    猜你喜欢
    • 2017-04-29
    • 2013-07-21
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多