Оптимизации CPU/SIMD#
NumPy поставляется с гибким рабочим механизмом, который позволяет использовать SIMD возможности процессоров для обеспечения более быстрой и стабильной производительности на всех популярных платформах. В настоящее время NumPy поддерживает архитектуры X86, IBM/Power, ARM7 и ARM8.
Процесс оптимизации в NumPy выполняется на трёх уровнях:
Код написанный используя универсальные внутренние функции, которые представляют собой набор типов, макросов и функций, которые сопоставляются с каждой поддерживаемой системой команд с помощью защитных механизмов, которые позволяют использовать их только тогда, когда компилятор их распознает. Это позволяет нам генерировать несколько ядер для одной и той же функциональности, где каждое сгенерированное ядро представляет набор инструкций, связанных с одной или несколькими определенными функциями ЦП. Первое ядро представляет минимальные (базовые) функции ЦП, а другие ядра представляют дополнительные (диспетчеризуемые) функции ЦП.
В компилировать Время, параметры сборки CPU используются для определения минимальных и дополнительных функций для поддержки, на основе выбора пользователя и поддержки компилятора. Соответствующие внутренние функции накладываются на внутренние функции платформы/архитектуры, и компилируются несколько ядер.
В импорт во время выполнения, ЦП проверяется на набор поддерживаемых функций ЦП. Используется механизм для получения указателя на наиболее подходящее ядро, и именно оно будет вызываться для функции.
Примечание
Сообщество NumPy провело глубокое обсуждение перед реализацией этой работы, пожалуйста, проверьте NEP 38 — Использование инструкций SIMD-оптимизации для производительности для дополнительного уточнения.
- CPU Build Options
- Как работает диспетчер CPU?