缓存注意事项

Numba支持将编译后的函数缓存到文件系统中,以供将来使用相同的函数。

实施

通过保存编译后的目标代码(可执行代码的ELF对象)来完成缓存。通过使用目标代码,由于不需要编译,因此缓存的函数具有最小的开销。缓存的数据保存在缓存目录下(请参阅NUMBA_CACHE_DIR)。缓存的索引存储在.nbi文件中,每个函数有一个索引,并且列出了为该函数编译的所有load重载签名。每load过载一个文件,目标代码被存储在具有.nbc扩展名文件中。两个文件中的数据都以pickle序列化。

注意

在Python <= 3.7上,Numbapickle使用纯Python Pickler进行扩展。要使用速度更快的C Pickler,请 从pip安装pickle5。pickle5向后移植Python 3.8 Pickler功能。

缓存要求

开发人员应注意允许缓存功能的要求,以确保正在使用的功能与缓存兼容。

可缓存功能的要求:

  • LLVM模块必须是独立的,这意味着如果不链接到其它已编译的单元,则它不能依赖其它模块。
  • 唯一允许的外部符号来自 NRT或系统库中的其它常见符号(即libc和libm)。

调试说明:

  • inttoptr在LLVM IR或 target_context.add_dynamic_add()Python的降低代码中查找的用法。指示运行时runtime地址的潜在用途。并非所有用途都是有问题的,有些用途是必需的。仅将常量整数转换为指针会影响缓存。
  • 错误使用动态地址或动态标志可能会导致段错误。
  • 链接顺序很重要,因为链接后会删除未使用的符号。链接应从依赖关系图的叶节点开始。

与缓存兼容的功能

明确验证了以下功能可用于缓存。

  • cpu和parallel目标的ufuncs和gufuncs
  • 并行加速器功能(即parallel=True)

缓存限制

这是缓存的已知限制的列表:

  • 缓存无效。无法识别在另一个文件中定义的符号中的更改。
  • 全局变量被视为常量。缓存将保存编译时使用的全局变量中的值。在缓存加载时,缓存的函数将不会重新绑定到全局变量的新值。

缓存共享

在另一台计算机上共享和重用缓存目录中的内容是安全的。缓存会在编译过程中记录CPU模型和可用的CPU功能。如果CPU型号和CPU功能不完全匹配,则不会考虑缓存内容。(参阅NUMBA_CPU_NAME

如果高速缓存目录在网络文件系统上共享,仅当文件替换操作是文件系统的原子操作时,并发读取/写入高速缓存才是安全的。Numba始终首先写入唯一的临时文件,然后用该临时文件替换目标缓存文件路径。Numba可以容忍丢失的缓存文件和丢失的缓存条目。

缓存清除

修改相应的源文件后,缓存将失效。但是,有时有需要手动清除缓存目录。例如,由于未修改源文件,因此无法识别编译器中的更改。

要清除缓存,可以简单地删除缓存目录。

在运行Numba应用程序时,删除缓存目录可能会导致 OSError在编译站点引发异常。

 缓存注意事项

人工智能芯片与自动驾驶