Эта статья может чрезмерно полагаться на источники, слишком тесно связанные с темой , что потенциально делает статью непроверяемой и нейтральной . Пожалуйста ( Январь 2019 ) |
Оригинальный автор(ы) | Группа компаний «Хронос» |
---|---|
Разработчик(и) | Группа компаний «Хронос» |
Первоначальный выпуск | Март 2014 ( 2014-03 ) |
Стабильный релиз | 2020 пересмотр 8 (1.2.1) / 19 октября 2023 г. ( 2023-10-19 ) [1] |
Операционная система | Кроссплатформенный |
Платформа | Кроссплатформенный |
Тип | Язык программирования высокого уровня |
Веб-сайт | www.khronos.org/sycl/sycl.tech |
SYCL (произносится как «серп») — это модель программирования более высокого уровня для повышения производительности программирования на различных аппаратных ускорителях . Это встроенный доменно-ориентированный язык с одним источником ( eDSL ), основанный на чистом C++17 . Это стандарт, разработанный Khronos Group , анонсированный в марте 2014 года.
SYCL (произносится как «серп») изначально расшифровывалось как SY stem-wide Computer Language [ 2] , но с 2020 года разработчики SYCL заявили, что SYCL — это название, и дали ясно понять, что оно больше не является аббревиатурой и не содержит ссылок на OpenCL . [3]
SYCL — это бесплатный кроссплатформенный уровень абстракции, который строится на базовых концепциях, переносимости и эффективности, вдохновленных OpenCL , что позволяет писать код для гетерогенных процессоров в стиле «из одного источника» с использованием полностью стандартного C++ . SYCL обеспечивает разработку из одного источника, где функции шаблонов C++ могут содержать как код хоста, так и код устройства для построения сложных алгоритмов, использующих аппаратные ускорители , а затем повторно использовать их в исходном коде для различных типов данных.
В то время как стандарт SYCL начинался как подгруппа высокоуровневой модели программирования рабочей группы OpenCL и изначально разрабатывался для использования с OpenCL и SPIR , SYCL является рабочей группой Khronos Group, независимой от рабочей группы OpenCL с 20 сентября 2019 года, и начиная с SYCL 2020, SYCL был обобщен как более общая гетерогенная структура, способная ориентироваться на другие системы. Теперь это возможно с концепцией универсального бэкэнда для ориентации на любой API ускорения , обеспечивая при этом полную совместимость с целевым API , например, использование существующих собственных библиотек для достижения максимальной производительности наряду с упрощением усилий по программированию. Например, реализация Open SYCL нацелена на ROCm и CUDA через кросс-вендорный HIP AMD .
SYCL был представлен на GDC в марте 2014 года с предварительной версией 1.2, [4] затем окончательная версия SYCL 1.2 была представлена на IWOCL 2015 в мае 2015 года. [5]
Последняя версия предыдущей серии SYCL 1.2.1 — это SYCL 1.2.1 revision 7, опубликованная 27 апреля 2020 года (первая версия была опубликована 6 декабря 2017 года [6] ).
SYCL 2.2 предварительный был представлен на IWOCL 2016 в мае 2016 года [7] с ориентацией на C++14 и OpenCL 2.2. Но комитет SYCL предпочел не финализировать эту версию и перейти к более гибкой спецификации SYCL для решения растущего разнообразия современных аппаратных ускорителей , включая движки искусственного интеллекта , что привело к SYCL 2020.
Последняя версия — SYCL 2020 revision 6, опубликованная 13 ноября 2022 года, представляющая собой эволюцию первого выпуска revision 2, опубликованного 9 февраля 2021 года, [8] с учетом отзывов пользователей и разработчиков на SYCL 2020 Provisional Specification revision 1, опубликованном 30 июня 2020 года. [9] Поддержка C++17 и OpenCL 3.0 является основными целями этого выпуска. Унифицированная общая память (USM) является одной из основных функций для графических процессоров с поддержкой OpenCL и CUDA.
На IWOCL 2021 была представлена дорожная карта. DPC++, ComputeCpp, Open SYCL, triSYCL и neoSYCL являются основными реализациями SYCL. Следующая цель в разработке — поддержка C++20 в будущем SYCL 202x. [10]
std::execution
) в дополнение к SYCL. [18]В марте 2023 года Khronos Group объявила о создании рабочей группы SYCL SC [26] с целью создания высокоуровневой гетерогенной вычислительной среды для систем, критически важных для безопасности . Эти системы охватывают различные области, включая авионику, автомобилестроение, промышленность и медицину.
Фреймворк SYCL Safety Critical будет соответствовать нескольким отраслевым стандартам для обеспечения его надежности и безопасности. Эти стандарты включают MISRA C++ 202X, [27] который предоставляет рекомендации по использованию C++ в критических системах, RTCA DO-178C / EASA ED-12C, [28] которые являются стандартами для рассмотрения программного обеспечения в бортовых системах и сертификации оборудования, ISO 26262/21448, [29] который относится к функциональной безопасности дорожных транспортных средств, IEC 61508 , который охватывает функциональную безопасность электрических/электронных/программируемых электронных систем, связанных с безопасностью, и IEC 62304 , который относится к требованиям жизненного цикла для программного обеспечения медицинских устройств. [26]
Вот некоторые известные области программного обеспечения, в которых используется SYCL (с примерами):
Khronos Ведет список ресурсов SYCL. [36] Codeplay Software также предоставляет учебные пособия на сайте sycl.tech вместе с другой информацией и новостями об экосистеме SYCL.
Исходные файлы для построения спецификации, такие как Makefiles и некоторые скрипты, заголовки SYCL и примеры кода SYCL находятся под лицензией Apache 2.0 . [37]
Открытые стандарты SYCL и OpenCL аналогичны моделям программирования фирменного стека CUDA от Nvidia и HIP из открытого стека ROCm , поддерживаемого AMD . [38]
В сфере Khronos Group OpenCL и Vulkan являются низкоуровневыми API с неединым исходным кодом , обеспечивающими детальный контроль над аппаратными ресурсами и операциями. OpenCL широко используется для параллельного программирования на различных типах оборудования, в то время как Vulkan в первую очередь фокусируется на высокопроизводительных графических и вычислительных задачах. [39]
SYCL, с другой стороны, является высокоуровневым одноисходным встроенным доменно-специфическим языком C++ (eDSL). Он позволяет разработчикам писать код для гетерогенных вычислительных систем, включая CPU, GPU и другие ускорители, используя одноисходный подход. Это означает, что как код хоста, так и код устройства могут быть написаны в одном и том же исходном файле C++. [40]
Для сравнения, версия CUDA на основе встроенного доменно-специфического языка C++ с одним исходным кодом , которая называется «CUDA Runtime API », несколько похожа на SYCL. Фактически, Intel выпустила инструмент под названием SYCLOMATIC, который автоматически транслировал код из CUDA в SYCL. [41] Однако существует менее известная версия CUDA с несколькими исходными кодами, которая называется «CUDA Driver API», похожая на OpenCL и используемая, например, самой реализацией CUDA Runtime API. [38]
SYCL расширяет возможности C++ AMP , освобождая программиста от явной передачи данных между хостом и устройствами с помощью буферов и аксессоров. Это контрастирует с CUDA (до введения Unified Memory в CUDA 6), где требовалась явная передача данных. Начиная с SYCL 2020, также можно использовать Unified Shared Memory (USM) для дополнения, а не замены интерфейсов на основе буферов, [42] предоставляя модель программирования более низкого уровня, похожую на Unified Memory в CUDA. [43]
SYCL — это язык более высокого уровня, чем C++ AMP и CUDA, поскольку вам не нужно строить явный график зависимостей между всеми ядрами, и он предоставляет вам автоматическое асинхронное планирование ядер с перекрытием коммуникаций и вычислений. Все это делается с использованием концепции аксессоров без необходимости какой-либо поддержки компилятора. [44]
В отличие от C++ AMP и CUDA, SYCL — это чистый C++ eDSL без какого-либо расширения C++. Это позволяет реализовать базовую реализацию ЦП, которая опирается на чистую среду выполнения без какого-либо конкретного компилятора. [40]
Оба компилятора DPC++ [45] и AdaptiveCpp [46] предоставляют бэкэнд для графических процессоров NVIDIA, подобно тому, как это делает CUDA. Это позволяет компилировать и запускать код SYCL на оборудовании NVIDIA, позволяя разработчикам использовать высокоуровневые абстракции SYCL на графических процессорах с поддержкой CUDA. [45] [46]
ROCm HIP нацелен на Nvidia GPU, AMD GPU и x86 CPU. HIP — это низкоуровневый API, который очень похож на API CUDA. [47] Например, AMD выпустила инструмент под названием HIPIFY, который может автоматически переводить код CUDA в HIP. [48] Поэтому многие из пунктов, упомянутых в сравнении CUDA и SYCL, также применимы к сравнению HIP и SYCL. [49]
ROCm HIP имеет некоторые сходства с SYCL в том смысле, что он может быть ориентирован на различных поставщиков (AMD и Nvidia) и типы ускорителей (GPU и CPU). [50] Однако SYCL может быть ориентирован на более широкий спектр ускорителей и поставщиков. SYCL поддерживает несколько типов ускорителей одновременно в одном приложении через концепцию бэкэндов. Кроме того, SYCL написан на чистом C++, тогда как HIP, как и CUDA, использует некоторые расширения языка. Эти расширения не позволяют компилировать HIP с помощью стандартного компилятора C++. [49]
Компиляторы DPC++ [45] и AdaptiveCpp [46] предоставляют бэкэнды для графических процессоров NVIDIA и AMD, подобно тому, как это делает HIP. Это позволяет компилировать и выполнять код SYCL на оборудовании этих поставщиков, предлагая разработчикам гибкость в использовании высокоуровневых абстракций SYCL на разнообразных устройствах и платформах. [46] [45]
SYCL имеет много общего с моделью программирования Kokkos , [51] включая использование непрозрачных многомерных массивов объектов (буферы SYCL и массивы Kokkos), многомерных диапазонов для параллельного выполнения и сокращений (добавлено в SYCL 2020). [52] Многочисленные функции в SYCL 2020 были добавлены в ответ на отзывы сообщества Kokkos.
SYCL больше фокусируется на гетерогенных системах; благодаря интеграции с OpenCL, он может быть принят на широком спектре устройств. Kokkos, с другой стороны, нацелен на большинство платформ HPC, [53] поэтому он больше ориентирован на HPC для производительности.
С 2024 года команда Kokkos разрабатывает бэкэнд SYCL, [54] который позволяет Kokkos ориентироваться на аппаратное обеспечение Intel в дополнение к платформам, которые он уже поддерживает. Эта разработка расширяет применимость Kokkos и обеспечивает большую гибкость в использовании различных аппаратных архитектур в приложениях HPC. [51]
Raja [55] [56] — это библиотека абстракций программного обеспечения C++, обеспечивающая переносимость архитектуры и программирования приложений HPC.
Как и SYCL, он обеспечивает переносимый код на гетерогенных платформах. Однако, в отличие от SYCL, Raja вводит уровень абстракции над другими моделями программирования, такими как CUDA, HIP, OpenMP и другими. Это позволяет разработчикам писать свой код один раз и запускать его на различных бэкэндах, не изменяя основную логику. Raja поддерживается и разрабатывается в Ливерморской национальной лаборатории Лоуренса (LLNL), тогда как SYCL является открытым стандартом, поддерживаемым сообществом. [39]
Подобно Kokkos, Raja больше подходит для случаев использования HPC, фокусируясь на производительности и масштабируемости в высокопроизводительных вычислительных средах. В отличие от этого, SYCL поддерживает более широкий спектр устройств, что делает его более универсальным для различных типов приложений, выходящих за рамки только HPC. [56]
С 2024 года команда Raja разрабатывает бэкэнд SYCL, [57] который позволит Raja также ориентироваться на оборудование Intel. Эта разработка повысит переносимость и гибкость Raja, позволяя использовать возможности SYCL и расширить его применимость на более широком спектре аппаратных платформ. [39]
OpenMP нацелен на вычислительную разгрузку внешних ускорителей, [58] в первую очередь фокусируясь на многоядерных архитектурах и графических процессорах. SYCL, с другой стороны, ориентирован на более широкий спектр устройств благодаря своей интеграции с OpenCL, что обеспечивает поддержку различных типов аппаратных ускорителей. [59]
OpenMP использует подход на основе прагмы , где программист аннотирует код директивами, а компилятор обрабатывает сложность параллельного выполнения и управления памятью. Эта высокоуровневая абстракция упрощает разработчикам задачу параллелизации их приложений без необходимости иметь дело со сложными деталями передачи памяти и синхронизации. [60]
OpenMP и SYCL поддерживают C++ и стандартизированы. OpenMP стандартизирован Советом по рассмотрению архитектуры OpenMP (ARB), в то время как SYCL стандартизирован Khronos Group. [39]
OpenMP имеет широкую поддержку различных компиляторов, таких как GCC и Clang . [61]
std::par является частью стандарта C++17 [62] и разработан для облегчения параллельного выполнения стандартных алгоритмов в стандартных контейнерах C++. Он предоставляет стандартный способ использования внешних ускорителей, позволяя разработчикам указывать политику выполнения для параллельных операций, таких как std::for_each
, std::transform
, и std::reduce
. Это позволяет эффективно использовать многоядерные процессоры и другое параллельное оборудование, не требуя существенных изменений в коде. [63]
SYCL может использоваться в качестве бэкэнда для std::par
, позволяя выполнять стандартные алгоритмы на широком спектре внешних ускорителей, включая графические процессоры Intel, AMD и NVIDIA, а также другие типы ускорителей. [64] Используя возможности SYCL, разработчики могут писать стандартный код C++, который без проблем выполняется в гетерогенных вычислительных средах. Такая интеграция обеспечивает большую гибкость и оптимизацию производительности на различных аппаратных платформах. [64]
Использование SYCL в качестве бэкэнда std::par
зависит от компилятора, то есть требуется компилятор, который поддерживает как SYCL, так и политики параллельного выполнения, представленные в C++17. [64] Примерами таких компиляторов являются DPC++ и другие SYCL-совместимые компиляторы. С помощью этих компиляторов разработчики могут воспользоваться абстракциями SYCL для управления памятью и параллельного выполнения, при этом по-прежнему используя знакомые стандартные алгоритмы и политики выполнения C++. [45]