Си-программы с расширениями SPMD компилируются для выполнения на вычислительных блоках SIMD, предоставляемых CPU и GPU, что позволяет задействовать механизмы векторизации SIMD без низкоуровневых оптимизаций и явного применения в коде SIMD-инструкций. Для написания распараллеливаемых функций используется привычный синтаксис и идиомы языка Си — SPMD-функции напрямую взаимодействуют с функциями и структурами, написанными на C/C++. Для отладки программ могут применяться существующие отладчики.
В качестве бэкенда для генерации кода и оптимизации в ISPC используется инфраструктура LLVM. Поддерживаются векторные инструкции x86 (SSE2, SSE4, AVX, AVX2, AVX512) и ARM (NEON), а также вынос вычислений на сторону GPU (Intel Gen9 и Xe). На архитектурах с векторными блоками SSE, обрабатывающими по 4 элемента за раз, применение ISPC даёт возможность добиться ускорения выполнения программы в 3 или более раз, а на архитектурах с векторными блоками AVX, обрабатывающими по 8 элементов за раз, ускорение может достигать 5-6 раз. При этом помимо размера векторного блока, масштабирование также обеспечивается за счёт выполнения на разных процессорных ядрах.
Основные новшества, добавленные в версии ISPC 1.26:
- Улучшена поддержка архитектуры ARM:
- Изменено поведение флага «—arch=arm», который теперь связан с архитектурой ARMv8 (32-bit), а не
ARMv7 (для ARMv8 в 64-разрядном режиме как и раньше следует использовать флаг «—arch=aarch64»). - Прекращена поддержка процессоров ARMv7 Cortex-a9 и Cortex-a15.
- Добавлена поддержка процессоров Cortex-a55, Cortex-a78, Cortex-a510, Cortex-a520, а также новых ARM-процессоров Apple.
- Добавлены новые сборочные цели: neon-i16x16 и neon-i8x32.
- Добавлена поддержка операций на базе векторных инструкций ARM SDOT и UDOT.
- Проведена оптимизация, производительность для ARMv8 в среднем увеличилась на 13%.
- Изменено поведение флага «—arch=arm», который теперь связан с архитектурой ARMv8 (32-bit), а не
- Добавлен новый вид сборочных целей — «generic», позволивший оптимизировать внутреннюю архитектуру компилятора и упростить добавление новых сборочных целей. Идея в том, чтобы поддерживать базовые цели для специфичных аппаратных возможностей, поверх которых легко можно создавать цели с частными оптимизациями. На использование generic-целей переведена поддержка архитектуры ARM.
- В генераторе кода проведена корректировка развёртывания циклов и функций для сокращения размера результирующего кода в режиме оптимизации «-O1». Улучшена генерация кода для встроенных функций count_leading_zeros и count_trailing_zeros, а также при возвращении структур из функций и при сохранении или загрузки данных с типами int8/int16.
- Расширена поддержка встроенных функций (intrinsics) LLVM, активируемая при указании флага «—enable-llvm-intrinsics».
- Инструментарий LLVM обновлён до версии 18.1.8 с патчами. Добавлен макрос для определения используемой в ISPC версии LLVM.
- Разрешено применение атрибута «__attribute__((deprecated))» к функциям для вывода предупреждения при вызове функции.
- Удалена сборочная цель avx512knl-x16 (KNL).
- Добавлена опция «—darwin-version-min» для указания минимально поддерживаемой версии целевой платформы для macOS и iOS.
Источник: http://www.opennet.ru/opennews/art.shtml?num=62692