CPU/SIMD 优化#

NumPy 具有灵活的工作机制,使其能够利用 CPU 所拥有的 SIMD 特性,从而在所有流行平台上提供更快、更稳定的性能。目前,NumPy 支持 X86、IBM/Power、ARM7 和 ARM8 架构。

NumPy 中的优化过程分为三层进行:

  • 代码是使用通用内部函数(universal intrinsics)*编写*的,这是一组类型、宏和函数,通过使用防护(guards)机制,仅在编译器识别它们时才启用它们,从而映射到每个受支持的指令集。这使我们能够为相同的功能生成多个内核,其中每个生成的内核都代表一组与一个或多个特定 CPU 特性相关的指令。第一个内核代表最小(基线)CPU 特性,而其他内核代表附加(调度)CPU 特性。

  • 在*编译*时,CPU 构建选项用于根据用户选择和编译器支持来定义要支持的最小和附加特性。适当的内部函数与平台/架构内部函数重叠,并编译多个内核。

  • 在*运行时导入*时,会探测 CPU 以获取受支持的 CPU 特性集。一种机制用于获取指向最合适的内核的指针,该内核将是调用函数的内核。

注意

NumPy 社区在实施此工作之前进行了深入讨论,请查看 NEP 38 — 使用 SIMD 优化指令提高性能 以获取更多说明。