代码之家  ›  专栏  ›  技术社区  ›  Sam Hammamy

理解numpy循环的矢量化

  •  0
  • Sam Hammamy  · 技术社区  · 6 年前

    我对此做了一些阅读,发现CPU和GPU有一个名为SIMD的指令集;单指令多数据。

    例如,将两个变量移动到两个特殊的64/128位寄存器,然后一次添加所有位。

    -Ofast 国旗,这是

    -Ofast-无视严格的标准遵从性-Ofast支持所有O3优化。它还启用了对用户无效的优化 所有符合标准的程序。它打开了-ffast math和 Fortran专用-fno保护parens和-fstack数组。

    -过去 然后,应在可能的情况下将用C/C++编写的任何循环自动矢量化为SIMD指令。

    my own code 并且能够在MNIST数据集上获得显著的加速,从45分钟缩短到5分钟。

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

    我的问题是:我上面的理解正确吗?Numpy是否也做同样的事情,或者他们是否使用 explicit pragmas instruction/register 矢量化的名称?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Matthieu Brucher    6 年前

    numpy不会那样做的。

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

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

    如果您想要ISA矢量化numpy调用,那么可以使用numba,JIT可以使用numba实现JIT(从而真正实现ISA矢量化)。还有一个项目将使用Intel的一个库,但我再也找不到了。