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

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

Си-программа с расширениями 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».

Источник: http://www.opennet.ru/opennews/art.shtml?num=61253