• 缓存注意事项


    缓存注意事项

    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在编译站点引发异常。

     缓存注意事项

    人工智能芯片与自动驾驶
  • 相关阅读:
    各种语言语法大全
    【mysql】SQL常用指令
    【JdbcTemplete】JdbcTemplete代码详解--模板方法详解
    【Spring-AOP-1】AOP相关概念
    【设计模式】命令行模式
    【设计模式】单件模式(Singleton)--各类单件模式的比较
    【设计模式】工厂方法模式(Factory Method)
    【设计模式】装饰者模式(Decorator)
    【并发编程】延时初始化
    【并发编程】AQS学习
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/14193294.html
Copyright © 2020-2023  润新知