Intel опубликовал компилятор ISPC 1.24, реализующий модель распараллеливания SPMD

Компания Intel опубликовала компилятор ISPC 1.24 (Implicit SPMD Program Compiler), обеспечивающий сборку кода на языке Си с расширениями для поддержи метода параллельного программирования SPMD (Single Program, Multiple Data), при котором несколько экземпляров одной программы выполняются параллельно с разными наборами входных данных. Код проекта написан на языке С++ и распространяется под лицензией BSD. Поддерживается работа в Linux, Windows, macOS, Linux и FreeBSD (плюс код может собираться для Android, iOS и PS4/PS5).

Си-программа с расширениями SPMD компилируется для выполнения на вычислительных блоках SIMD, предоставляемых CPU и GPU, что позволяет задействовать в программах механизмы векторизации SIMD без низкоуровневых оптимизаций и явного применения в коде SIMD-инструкций. Для написания распараллеливаемых функций используется привычный синтаксис и идиомы языка Си. Данные SPMD-функции могут интегрироваться с приложениями на C/C++, и
напрямую взаимодействовать с их функциями и структурами. Для отладки программ могут применяться существующие отладчики.

В качестве бэкенда для генерации кода и оптимизации используется инфраструктура LLVM. Поддерживается использование векторных инструкций x86 (SSE2, SSE4, AVX, AVX2, AVX512) и ARM (NEON), а также вынос вычислений на сторону GPU (Intel Gen9 и Xe). На архитектурах с векторными блоками SSE, обрабатывающими по 4 элемента за раз, применение ISPC позволяет добиться ускорения выполнения программы в 3 или более раз, а на архитектурах с векторными блоками AVX, обрабатывающими по 8 элементов за раз, ускорение может достигать 5-6 раз. При этом помимо размера векторного блока, масштабирование также достигается за счёт выполнения на разных процессорных ядрах.

Основные новшества, добавленные в версии ISPC 1.24:

  • Добавлена поддержка нетипизированных параметров шаблонов. В качестве параметров шаблона теперь можно использовать унифицированные целые и перечисляемые значения (с признаком “uniform“).
  • Добавлены dot-функции для знаковых и беззнаковых типов int8 и int16, в которых используются инструкции AVX-VNNI и AVX512-VNN.
  • Добавлены определения макросов для ограничений чисел.
  • Добавлены новые целевые платформы: avx2vnni-i32x4, avx2vnni-i32x8, avx2vnni-i32x16 c поддержкой инструкции AVX-VNNI, и avx512icl-x4, avx512icl-x8, avx512icl-x16, avx512icl-x32, avx512icl-x64 c поддержкой инструкции AVX512-VNNI.
  • Решены проблемы с использованием лишних векторных инструкций при генерации кода для GPU.
  • Флаг командной строки “–pic” приведён к соответствию флагу “-fpic” в Clang и GCC, а флаг “–PIC” – к соответствию “-fPIC”.
Release. Ссылка here.