Numba-编译时间常数优化

问题描述

我有使用JIT编辑的人工示例代码Numba

import numba
@numba.njit
def f(x,c):
    for i in range(3):
        if c == 0:
            x += 1
        elif c == 1:
            x *= 2
        else:
            assert False
    return x
print(f(3,0),f(3,1))

如果c是一个较小的最终整数集(例如, 0 <= c <= 3

不允许将与if有关的c条件移出循环,因为这显然是一种优化。因为这是一个人工示例,所以在实际示例中,循环可能非常庞大,而且在体内仅更改了1-2行的情况下,重复两次循环是不可行的。

基本上,我想使c的编译时常数。像C++一样,可以将编译时常量作为模板参数,并进行与此相关的所有代码优化。

所以我想告诉Numba,参数c0c1等是编译时常量,应该以这样的方式进行处理:无论何时以不同的{{1}值调用函数} Numba应该创建并编译一个单独的函数实例,并进行必要的优化,就像c在传递新的模板参数集时生成模板函数的每个实例一样。

换句话说,应该以某种方式在函数的签名中包含此类常量C++的可能值,据我了解,Numba会为每个不同的签名生成单独的函数代码,就像C ++模板一样。

另一种需要优化的情况是,c不是函数的参数,而是循环开始之前某些复杂表达式计算的结果。在这种情况下,结果c也来自一小部分可能的值。通过创建一个接受c作为参数的子函数,也许可以将这种情况转换为上述情况。

通常,我有一些嵌套循环,每个循环都有一些在循环运行之前计算的常数。然后在相应的循环内部,在c条件中使用这些常量。如何迫使Numba进行优化,以将这些常量条件从这些循环体中移出。

您有什么建议?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...