CPU/SIMD 优化#
NumPy 配备了一种灵活的工作机制,使其能够利用 CPU 拥有的 SIMD 功能,以便在所有流行的平台上提供更快,更稳定的性能. 目前,NumPy 支持 X86,IBM/Power,ARM7 和 ARM8 架构.
NumPy 中的优化过程分为三个层次:
代码是使用通用内联函数编写的,这是一组类型,宏和函数,通过使用保护映射到每个受支持的指令集,这些保护仅在编译器识别它们时才启用它们的使用. 这允许我们为同一功能生成多个内核,其中每个生成的内核代表一组与一个或多个特定 CPU 功能相关的指令. 第一个内核代表最小(基线)CPU 功能,其他内核代表附加(分派)CPU 功能.
在编译时,CPU 构建选项用于定义要支持的最小和附加功能,这基于用户选择和编译器支持. 适当的内部函数与平台/架构内部函数重叠,并编译多个内核.
在运行时导入时,将探测 CPU 以获取支持的 CPU 功能集. 一种机制用于获取指向最合适的内核的指针,这将是为该函数调用的内核.
备注
NumPy 社区在实施这项工作之前进行了深入的讨论,请查看 :external+neps NEP 38 — Using SIMD optimization instructions for performance 以获得更清楚的说明.