Оптимизации CPU/SIMD
NumPy имеет гибкую рабочую схему, которая позволяет ему использовать возможности SIMD процессоров, чтобы обеспечить более высокую и стабильную производительность на всех популярных платформах. В настоящее время NumPy поддерживает архитектуры X86, IBM/Power, ARM7 и ARM8.
Процесс оптимизации в NumPy выполняется в три этапа:
- Код пишется с использованием универсальных внутренних функций, которые представляют собой набор типов, макросов и функций, сопоставленных с каждой поддерживаемой системой команд с использованием защитных механизмов, которые позволят использовать их только тогда, когда компилятор их распознает. Это позволяет нам генерировать несколько ядер для одной и той же функциональности, где каждое сгенерированное ядро представляет собой набор инструкций, связанных с одной или несколькими определёнными функциями процессора. Первое ядро представляет минимальные (базовые) возможности процессора, а другие ядра представляют дополнительные (распределённые) возможности процессора.
- На этапе компиляции используются параметры сборки процессора для определения минимальных и дополнительных возможностей поддержки в зависимости от выбора пользователя и поддержки компилятора. Соответствующие внутренние функции перекрываются с внутренними функциями платформы/архитектуры, и компилируются несколько ядер.
- Во время импорта во время выполнения процессор проверяется на наличие набора поддерживаемых функций процессора. Используется механизм для получения указателя на наиболее подходящее ядро, которое будет вызвано для функции.
Примечание
Сообщество NumPy провело глубокое обсуждение перед реализацией этой работы, пожалуйста, ознакомьтесь с NEP-38 для получения более подробной информации.
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/simd/index.html