并行编译多个 numba 函数



我正在尝试使用numba在我的代码库中编译几个函数以加快执行速度。我有几千个独立的函数,我正在尝试使用jit装饰器进行编译。在编译我的函数时,我注意到所有代码都是在单个 python 进程中编译的,并且只在我的机器中使用单个内核。这导致编译时间通常超过一小时。我想知道我是否可以在类似于make -j <number of processors>的编译步骤中启用并行化。

我的函数彼此完全独立,利用它们的后续调用位于单独的子模块中。以下是我希望能够并行编译的函数类型的示例:

import numpy as np
from numba import jit, float64
@jit(float64[:](float64[:]),nopython=True,cache=True,fastmath=True,parallel=True,nogil=True)
def fun_0(x):
return np.power(x,0)
@jit(float64[:](float64[:]),nopython=True,cache=True,fastmath=True,parallel=True,nogil=True)
def fun_1(x):
return np.power(x,1)
@jit(float64[:](float64[:]),nopython=True,cache=True,fastmath=True,parallel=True,nogil=True)
def fun_2(x):
return np.power(x,2)
@jit(float64[:](float64[:]),nopython=True,cache=True,fastmath=True,parallel=True,nogil=True)
def fun_3(x):
return np.power(x,3)

该代码仅说明我的用例。构建函数/模块的替代方法也可能是我可接受的解决方案。

提高运行时性能的目标是否被数千个独立函数的@decorator"内联">JIT 编译所降低?

解决方案:
可以使用"AoT编译:即提前编译代码">

虽然 Numba 的主要用例是即时编译,但它也为提前编译 (AOT( 提供了工具。

限制:
1(AOT编译只允许常规函数,不允许ufuncs
2( 您必须显式指定函数签名。
3( 每个导出的函数只能有一个签名(但您可以以不同的名称导出多个不同的签名(。
4( AOT 编译会为 CPU 的体系结构系列生成通用代码(例如"x86-64"(,而 JIT 编译会生成针对特定 CPU 型号优化的代码。

警告:
您的代码似乎很容易落入阿姆达尔定律陷阱

您很容易碰巧在附加开销上支付的费用比从(只是(潜在的处理加速中获得的回报要多得多 - 因为更密集的内存 I/O-s 和 CPU 核心缓存重用机制相关的约束(绝对 I/O 上限和重用效率的相对损失(确实并且仍然会违背您提高性能的愿望(

<块引用类>

至少,你已经被警告了:o(

最新更新