Компания Intel опубликовала компилятор ISPC 1.26 (Implicit SPMD Program Compiler), предназначенный для сборки кода на языке Си с расширениями параллельного программирования SPMD (Single Program, Multiple Data), позволяющими добиться параллельного выполнения нескольких экземпляров одной программы с разными наборами входных данных. Код проекта написан на языке С++ и распространяется под лицензией BSD. Поддерживается работа в Linux, Windows, macOS и FreeBSD.
Си-программы с расширениями 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.