Выпуск компилятора ISPC 1.25, развиваемого Intel для языка Си с расширениями SPMD

Компания Intel опубликовала компилятор ISPC 1.25 (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.25:

  • При объявлении переменных и функций разрешено указание атрибутов “noescape”, “address_space(N)”, “external_only” и “unmangled” при помощи ключевого слова “__attribute__“.
  • Добавлена поддержка использования шаблонов при объявлении векторов и массивов.
  • Обеспечен вывод сообщений об ошибках при использовании несовместимых типов при объявлении переменных.
  • Улучшена генерация кода для циклов foreach. Повышена эффективность генерации кода на основе наборов инструкций AVX2 и AVX512.
  • Обеспечена упреждающая компиляция стандартной библиотеки
    (stdlib), выполняемая на стадии сборки ISPC, а не при компиляции проектов. Изменение позволило сократить время сборки на 5-60%, в зависимости от размера собираемого кода.
  • Добавлены новые сборочные цели: xe2hpg-x16 и xe2hpg-x32 для GPU Intel Xe2 Battlemage, xe2lpg-x16 и xe2lpg-x32 для GPU Intel X Xe2 Lunar Lake. Также добавлены определения arrowlake, lunarlake и graniterapids для CPU Intel ArrowLake, LunarLake и GraniteRapids.
  • Объявлены устаревшими сборочные цели avx512knl-x16, gen9-x8 и gen9-x16.
  • В стандартную библиотеку для данных с типами float и double добавлены атомарные операции сложения, вычитания, поиска минимума и максимума.
  • Добавлена опция командной строки “-ffunction-sections” для генерации каждой функции в отдельной секции.
  • Предоставлена возможность сборки ISPC в двух режимах “slim” и “composite” (по умолчанию). Второй режим отличается интеграцией библиотек stdlib и binutils в единый исполняемый файл, вместо их поставки в виде отдельных файлов.
Release. Ссылка here.