CPU/SIMD 优化#

NumPy 具有灵活的工作机制,可以利用 CPU 自身的 SIMD 功能,从而在所有主流平台上提供更快、更稳定的性能。目前,NumPy 支持 X86、IBM/Power、ARM7 和 ARM8 架构。

NumPy 的优化过程分三个层次进行

  • 代码使用通用内联函数编写,这是一组类型、宏和函数,通过保护语句映射到每个支持的指令集,这些保护语句仅在编译器识别它们时才启用它们的使用。这允许我们为相同的功能生成多个内核,其中每个生成的内核代表一组与一个或多个特定 CPU 功能相关的指令。第一个内核代表最低限度的(基线)CPU 功能,其他内核代表附加的(分派的)CPU 功能。

  • 编译时,使用 CPU 构建选项根据用户选择和编译器支持来定义要支持的最低限度和附加功能。相应的内联函数将与平台/架构内联函数重叠,并编译多个内核。

  • 运行时导入时,将探测 CPU 以获取支持的 CPU 功能集。使用一种机制来获取指向最合适的内核的指针,这将是该函数调用的内核。

注意

在实现这项工作之前,NumPy 社区进行了深入讨论,请查看 NEP-38 以了解更多说明。