CPU/SIMD 优化#

NumPy 带有一个灵活的工作机制,它允许 NumPy 利用 CPU 拥有的 SIMD 功能,以在所有流行平台上提供更快、更稳定的性能。目前,NumPy 支持 X86、IBM/Power、ARM7 和 ARM8 架构。

NumPy 中的优化过程分三个阶段进行

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

  • 编译时,CPU 构建选项用于根据用户选择和编译器支持来定义要支持的最低和附加功能。适当的内建函数与平台/体系结构内建函数重叠,并编译多个内核。

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

注意

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