CPU/SIMD 优化#
NumPy 具有灵活的工作机制,可以利用 CPU 自带的 SIMD 特性,在所有主流平台上提供更快、更稳定的性能。目前,NumPy 支持 X86、IBM/Power、ARM7 和 ARM8 架构。
NumPy 中的优化过程分为三个层次
代码是使用通用内部函数(universal intrinsics)编写的,这是一组类型、宏和函数,通过保护机制映射到每个支持的指令集,该机制仅在编译器识别它们时启用。这允许我们为相同的功能生成多个内核,其中每个生成的内核代表一组与一个或多个特定 CPU 功能相关的指令。第一个内核代表最低(基线)CPU 功能,其他内核代表附加(分派)CPU 功能。
在编译时,CPU 构建选项用于根据用户选择和编译器支持来定义支持的最低和附加功能。相应的内部函数与平台/架构内部函数叠加,并编译多个内核。
在运行时导入时,会探测 CPU 支持的 CPU 功能集。使用一种机制来获取指向最合适内核的指针,这将是调用该函数的内核。
注意
NumPy 社区在实施这项工作之前进行了深入的讨论,请参阅 NEP 38 — Using SIMD optimization instructions for performance 以获得更多澄清。