|
Компания Intel опубликовала компилятор ISPC 1.32 (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.32:
- Обеспечена полная поддержка расширений AVX10.2 и APX (Advanced Performance Extensions), применяемых при генерации кода для сборочных целей avx10.2dmr (CPU Intel Diamond Rapids) и avx10.2nvl (CPU Intel Nova Lake).
- Добавлена поддержка процессоров на базе микроархитектуры AMD Zen 6, включаемая через опцию "--cpu=znver6".
- В стандартную библиотеку добавлены функции pdep32(), pext32(), pdep64() и pext64() для выполнения операций над битами "параллельное извлечение" и "параллельное размещение".
- В ISPC Runtime реализованы функции ispcrtLoadModuleFromMemory() и ispcrtLoadModuleFromMemoryWithOptions(), при помощи которых можно загрузить GPU-модуль из находящегося в оперативной памяти буфера SPIR-V.
- Инструментарий LLVM обновлён до версии 23.1.2. Добавлена начальная поддержка сборки с находящейся в разработке веткой LLVM 24.
|