关于目标扩展的说明
警告
本页描述的所有功能和API均处于开发阶段,可能会在没有发布弃用通知的情况下随时更改。
从调用者继承编译器标志
编译器标志,例如 @jit(nrt=True, fastmath=True))
中的 fastmath
、nrt
等选项,是按函数指定的,但它们的效果并不明确——有些标志影响整个调用图,有些标志仅影响当前函数。有时,被调用者需要从调用者那里继承标志;例如,fastmath
标志应该是传染性的。
要解决这个问题,需要以下内容:
更好的编译器标志语义定义。理想情况下,所有标志应将其影响限制在当前函数内。(待办)
允许编译器标志从调用者继承。(已完成)
在函数解析中考虑编译器标志。(待办)
numba.core.targetconfig.ConfigStack
用于在整个编译器中传播编译器标志。在编译开始时,标志被推入 ConfigStack
,它为编译维护一个线程本地的栈。因此,被调用者可以检查调用者中的标志。
- class numba.core.targetconfig.ConfigStack[源代码]
用于在编译器中跟踪目标配置的堆栈。
它将堆栈存储在一个线程本地的类属性中。同一线程中的所有实例将看到相同的堆栈。
编译器标志
编译器标志 被定义为 TargetConfig
的子类:
- class numba.core.targetconfig.TargetConfig(copy_from=None)[源代码]
TargetConfig
的基类。子类应使用
Option
填充类成员。例如:>>> class MyTargetConfig(TargetConfig): >>> a_bool_option = Option(type=bool, default=False, doc="a bool") >>> an_int_option = Option(type=int, default=0, doc="an int")
元类将为每个
Option
插入属性。例如:>>> tc = MyTargetConfig() >>> tc.a_bool_option = True # invokes the setter >>> print(tc.an_int_option) # print the default
这些是内部编译器标志,它们与在 jit 装饰器中使用的面向用户的选项不同。
在内部,面向用户的选项通过 :class:`numba.core.options.TargetOptions 映射到内部编译器标志 <https://github.com/numba/numba/blob/7e8538140ce3f8d01a5273a39233b5481d8b20b1/numba/core/options.py#L72>`_。每个目标可以覆盖默认的编译器标志,并在 TargetOptions.finalize
中控制标志继承。CPU 目标覆盖了它。
- class numba.core.options.TargetOptions[源代码]
目标选项将装饰器中的用户选项映射到
numba.core.compiler.Flags
,这些标志用于降低和目标上下文。
在 numba.core.options.TargetOptions.finalize()
中,使用 numba.core.targetconfig.TargetConfig.inherit_if_not_set()
来请求调用者提供一个编译器标志,如果当前函数未设置该标志。