Выпуск компилятора 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 в единый исполняемый файл, вместо их поставки в виде отдельных файлов.



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

© OpenNet