OpenCL — открытый стандарт, поддерживаемый Khronos Group , некоммерческой организацией открытых стандартов. Конформные реализации (прошедшие Conformance Test Suite) доступны от ряда компаний, включая AMD , ARM , Cadence , Google , Imagination , Intel , Nvidia , Qualcomm , Samsung , SPI и Verisilicon. [8] [9]
Обзор
OpenCL рассматривает вычислительную систему как состоящую из ряда вычислительных устройств , которые могут быть центральными процессорами (ЦП) или «ускорителями», такими как графические процессоры (ГП), присоединенными к главному процессору (ЦП). Он определяет язык, подобный C, для написания программ. Функции, выполняемые на устройстве OpenCL, называются « ядрами ». [10] : 17 Одно вычислительное устройство обычно состоит из нескольких вычислительных блоков , которые, в свою очередь, включают несколько процессорных элементов (ПЭ). Выполнение одного ядра может выполняться на всех или многих ПЭ параллельно. То, как вычислительное устройство подразделяется на вычислительные блоки и ПЭ, зависит от поставщика; вычислительный блок можно рассматривать как « ядро », но понятие ядра трудно определить для всех типов устройств, поддерживаемых OpenCL (или даже в категории «ЦП»), [11] : 49–50 , а количество вычислительных блоков может не соответствовать количеству ядер, заявленному в маркетинговой литературе поставщиков (которая на самом деле может подсчитывать полосы SIMD ). [12]
В дополнение к своему языку программирования, похожему на C, OpenCL определяет интерфейс прикладного программирования (API), который позволяет программам, работающим на хосте, запускать ядра на вычислительных устройствах и управлять памятью устройства, которая (по крайней мере концептуально) отделена от памяти хоста. Программы на языке OpenCL предназначены для компиляции во время выполнения , так что приложения, использующие OpenCL, переносимы между реализациями для различных хост-устройств. [13] Стандарт OpenCL определяет API хоста для C и C++ ; существуют сторонние API для других языков программирования и платформ, таких как Python , [14] Java , Perl , [15] D [16] и .NET . [11] : 15 Реализация стандарта OpenCL состоит из библиотеки , которая реализует API для C и C++, и компилятора OpenCL C для целевых вычислительных устройств.
Чтобы открыть модель программирования OpenCL для других языков или защитить исходный код ядра от проверки, можно использовать стандартное переносимое промежуточное представление (SPIR) [17] как независимый от цели способ передачи ядер между компилятором front-end и бэкендом OpenCL.
Совсем недавно Khronos Group ратифицировала SYCL , [18] модель программирования более высокого уровня для OpenCL как eDSL с одним источником на основе чистого C++17 для повышения производительности программирования . Люди, заинтересованные в ядрах C++, но не в стиле программирования с одним источником SYCL, могут использовать функции C++ с исходными кодами вычислительного ядра, написанными на языке "C++ для OpenCL". [19]
Иерархия памяти
OpenCL определяет четырехуровневую иерархию памяти для вычислительного устройства: [13]
глобальная память: общая для всех процессорных элементов, но имеет высокую задержку доступа ( __global );
только для чтения: меньшего размера, с низкой задержкой, доступна для записи центральным процессором, но не вычислительными устройствами ( __constant );
локальная память: совместно используемая группой процессорных элементов ( __local );
частная память для каждого элемента ( регистры ; __private ).
Не каждое устройство должно реализовывать каждый уровень этой иерархии в аппаратном обеспечении. Согласованность между различными уровнями в иерархии ослаблена и обеспечивается только явными конструкциями синхронизации , в частности барьерами .
Устройства могут совместно использовать память с центральным процессором хоста, а могут и не использовать ее. [13] API хоста предоставляет дескрипторы буферов памяти устройств и функции для передачи данных между хостом и устройствами.
Язык ядра OpenCL
Язык программирования, который используется для написания вычислительных ядер , называется языком ядра. OpenCL принимает языки на основе C / C++ для указания вычислений ядра, выполняемых на устройстве, с некоторыми ограничениями и дополнениями для облегчения эффективного сопоставления с гетерогенными аппаратными ресурсами ускорителей. Традиционно OpenCL C использовался для программирования ускорителей в стандарте OpenCL, позже был разработан язык ядра C++ для OpenCL, который унаследовал всю функциональность от OpenCL C, но позволил использовать функции C++ в исходных кодах ядра.
OpenCL язык Си
OpenCL C [20] — это диалект языка на основе C99 , адаптированный для соответствия модели устройства в OpenCL. Буферы памяти находятся на определенных уровнях иерархии памяти, а указатели аннотируются квалификаторами регионов __global , __local , __constant и __private , отражающими это. Вместо того, чтобы программа устройства имела основную функцию, функции OpenCL C помечаются как __kernel , чтобы сигнализировать о том, что они являются точками входа в программу, которые должны вызываться из хост-программы. Указатели функций , битовые поля и массивы переменной длины опущены, а рекурсия запрещена. [21] Стандартная библиотека C заменена пользовательским набором стандартных функций, ориентированных на математическое программирование.
OpenCL C расширен для облегчения использования параллелизма с векторными типами и операциями, синхронизацией и функциями для работы с рабочими элементами и рабочими группами. [21] В частности, помимо скалярных типов, таких как float и double , которые ведут себя аналогично соответствующим типам в C, OpenCL предоставляет векторные типы фиксированной длины, такие как float4 (4-вектор чисел с плавающей точкой одинарной точности); такие векторные типы доступны в длинах два, три, четыре, восемь и шестнадцать для различных базовых типов. [20] : § 6.1.2 Векторизованные операции над этими типами предназначены для отображения на наборы инструкций SIMD , например, SSE или VMX , при запуске программ OpenCL на ЦП. [13] Другие специализированные типы включают типы изображений 2-d и 3-d. [20] : 10–11
// Умножает A*x, оставляя результат в y. // A — это строковая матрица, то есть элемент (i,j) находится в A[i*ncols+j]. __kernel void matvec ( __global const float * A , __global const float * x , uint ncols , __global float * y ) { size_t i = get_global_id ( 0 ); // Глобальный идентификатор, используемый как индекс строки __global float const * a = & A [ i * ncols ]; // Указатель на i-ю строку float sum = 0.f ; // Аккумулятор для скалярного произведения for ( size_t j = 0 ; j < ncols ; j ++ ) { sum += a [ j ] * x [ j ]; } y [ i ] = sum ; }
Функция ядра matvec при каждом вызове вычисляет скалярное произведение одной строки матрицы A и вектора x :
Чтобы расширить это до полного умножения матрицы на вектор, среда выполнения OpenCL отображает ядро по строкам матрицы. На стороне хоста это делает функция clEnqueueNDRangeKernel ; она принимает в качестве аргументов ядро для выполнения, его аргументы и количество рабочих элементов, соответствующих количеству строк в матрице A .
Пример: вычисление БПФ
Этот пример загрузит реализацию быстрого преобразования Фурье (FFT) и выполнит ее. Реализация показана ниже. [22] Код запрашивает у библиотеки OpenCL первую доступную графическую карту, создает буферы памяти для чтения и записи (с точки зрения графической карты), JIT-компилирует ядро FFT и затем, наконец, асинхронно запускает ядро. Результат преобразования в этом примере не считывается.
Фактический расчет внутри файла "fft1D_1024_kernel_src.cl" (основан на "Fitting FFT into the G80 Architecture"): [23]
R "( // Это ядро вычисляет БПФ длиной 1024. БПФ длиной 1024 разлагается на // вызовы функции с основанием 16, еще одной функции с основанием 16 и затем функции с основанием 4__kernel void fft1D_1024 ( __global float2 * in , __global float2 * out , __local float * sMemx , __local float * sMemy ) { int tid = get_local_id ( 0 ); int blockIdx = get_group_id ( 0 ) * 1024 + tid ; float2 data [ 16 ];// начальный индекс данных в/из глобальной памяти in = in + blockIdx ; out = out + blockIdx ;globalLoads ( data , in , 64 ); // объединенные глобальные чтения fftRadix16Pass ( data ); // передача на месте по основанию 16 twiddleFactorMul ( data , tid , 1024 , 0 );// локальное перемешивание с использованием локальной памяти localShuffle ( data , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 ))); fftRadix16Pass ( данные ); // на месте передаем twiddleFactorMul ( data , tid , 64 , 4 ) по основанию radix-16; // умножение коэффициента поворотаlocalShuffle ( data , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 )));// четыре вызова функции radix-4 fftRadix4Pass ( data ); // функция radix-4 номер 1 fftRadix4Pass ( data + 4 ); // функция radix-4 номер 2 fftRadix4Pass ( data + 8 ); // функция radix-4 номер 3 fftRadix4Pass ( data + 12 ); // функция radix-4 номер 4// объединенные глобальные записи globalStores ( data , out , 64 ); } ) "
Полную реализацию OpenCL FFT с открытым исходным кодом можно найти на веб-сайте Apple. [24]
C++ для языка OpenCL
В 2020 году Khronos объявила [25] о переходе на поддерживаемый сообществом язык программирования C++ для OpenCL [26] , который предоставляет возможности C++17 в сочетании с традиционными возможностями OpenCL C. Этот язык позволяет использовать богатый набор языковых возможностей стандартного C++, сохраняя при этом обратную совместимость с OpenCL C. Это открывает разработчикам кода ядра OpenCL плавный путь перехода к функциональности C++, поскольку они могут продолжать использовать знакомый поток программирования и даже инструменты, а также использовать существующие расширения и библиотеки, доступные для OpenCL C.
Семантика языка описана в документации, опубликованной в релизах репозитория OpenCL-Docs [27] , размещенного Khronos Group, но в настоящее время не ратифицирована Khronos Group. Язык C++ для OpenCL не документирован в отдельном документе и основан на спецификации C++ и OpenCL C. Компилятор с открытым исходным кодом Clang поддерживает C++ для OpenCL с версии 9. [28]
C++ для OpenCL изначально разрабатывался как расширение компилятора Clang и появился в выпуске 9. [29] Поскольку он был тесно связан с OpenCL C и не содержал никаких специфических для Clang функций, его документация была повторно размещена в репозитории OpenCL-Docs [27] из Khronos Group вместе с источниками других спецификаций и справочных карт. Первый официальный выпуск этого документа, описывающего C++ для OpenCL версии 1.0, был опубликован в декабре 2020 года. [30] C++ для OpenCL 1.0 содержит функции из C++17 и обратно совместим с OpenCL C 2.0. В декабре 2021 года была выпущена новая предварительная версия C++ для OpenCL 2021, которая полностью совместима со стандартом OpenCL 3.0. [31] Рабочий проект последней документации C++ для OpenCL можно найти на веб-сайте Khronos. [32]
Функции
C++ для OpenCL поддерживает большинство функций (синтаксически и семантически) из OpenCL C, за исключением вложенного параллелизма и блоков. [33] Однако есть незначительные различия в некоторых поддерживаемых функциях, в основном связанные с различиями в семантике между C++ и C. Например, C++ более строг с неявными преобразованиями типов и не поддерживает ограничительный квалификатор типа. [33] Следующие функции C++ не поддерживаются C++ для OpenCL: виртуальные функции, оператор dynamic_cast , неразмещаемые операторы new / delete , исключения, указатель на функции-члены, ссылки на функции, стандартные библиотеки C++. [33] C++ для OpenCL расширяет концепцию отдельных областей памяти ( адресных пространств ) из OpenCL C до функций C++ — функциональных приведений, шаблонов, членов классов, ссылок, лямбда-функций и операторов. Большинство функций C++ недоступны для функций ядра, например, перегрузки или шаблонизации, произвольной компоновки классов в типе параметра. [33]
Пример: арифметика комплексных чисел
Следующий фрагмент кода иллюстрирует, как ядра с арифметикой комплексных чисел могут быть реализованы на языке C++ для OpenCL с удобным использованием функций C++.
// Определить класс Complex, который может выполнять вычисления с комплексными числами с // различной точностью при использовании разных типов T — double, float, half. template < typename T > class complex_t { T m_re ; // Действительная составляющая. T m_im ; // Мнимая составляющая.public : complex_t ( T re , T im ) : m_re { re }, m_im { im } {}; // Определить оператор для умножения комплексных чисел. complex_t Operator * ( const complex_t & other ) const { return { m_re * other . m_re - m_im * other . m_im , m_re * other . m_im + m_im * other . m_re }; } T get_re ( ) const { return m_re ; } T get_im () const { return m_im ; } };// Вспомогательная функция для вычисления умножения комплексных чисел, считанных из // входного буфера, и сохранения вычисленного результата в выходном буфере. template < typename T > void compute_helper ( __global T * in , __global T * out ) { auto idx = get_global_id ( 0 ); // Каждый рабочий элемент использует 4 последовательных элемента из входного буфера // - два для каждого комплексного числа. auto offset = idx * 4 ; auto num1 = complex_t { in [ offset ], in [ offset + 1 ]}; auto num2 = complex_t { in [ offset + 2 ], in [ offset + 3 ]}; // Выполнение умножения комплексных чисел. auto res = num1 * num2 ; // Каждый рабочий элемент записывает 2 последовательных элемента в выходной буфер. out [ idx * 2 ] = res . get_re (); из [ idx * 2 + 1 ] = рез . get_im (); }// Это ядро используется для умножения комплексных чисел с одинарной точностью. __kernel void compute_sp ( __global float * in , __global float * out ) { compute_helper ( in , out ); }#ifdef cl_khr_fp16 // Это ядро используется для умножения комплексных чисел с половинной точностью, когда // оно поддерживается устройством. #pragma OPENCL EXTENSION cl_khr_fp16: enable __kernel void compute_hp ( __global half * in , __global half * out ) { compute_helper ( in , out ); } #endif
Инструменты и среда исполнения
Язык C++ для OpenCL может использоваться для тех же приложений или библиотек и таким же образом, как используется язык OpenCL C. Благодаря богатому разнообразию возможностей языка C++, приложения, написанные на C++ для OpenCL, могут выражать сложную функциональность более удобно, чем приложения, написанные на OpenCL C, и в частности универсальная парадигма программирования из C++ очень привлекательна для разработчиков библиотек.
Исходные коды C++ для OpenCL могут быть скомпилированы драйверами OpenCL, которые поддерживают расширение cl_ext_cxx_for_opencl . [34] Arm объявила о поддержке этого расширения в декабре 2020 года. [35] Однако из-за растущей сложности алгоритмов, ускоренных на устройствах OpenCL, ожидается, что больше приложений будут компилировать ядра C++ для OpenCL в автономном режиме с использованием автономных компиляторов, таких как Clang [36], в исполняемый двоичный формат или переносимый двоичный формат, например SPIR-V. [37] Такой исполняемый файл может быть загружен во время выполнения приложений OpenCL с использованием выделенного API OpenCL. [38]
Двоичные файлы, скомпилированные из исходников на C++ для OpenCL 1.0, могут быть выполнены на совместимых с OpenCL 2.0 устройствах. В зависимости от языковых функций, используемых в таких исходниках ядра, они также могут быть выполнены на устройствах, поддерживающих более ранние версии OpenCL или OpenCL 3.0.
Помимо драйверов OpenCL, ядра, написанные на C++ для OpenCL, могут быть скомпилированы для выполнения на устройствах Vulkan с использованием компилятора clspv [39] и среды выполнения clvk [40] точно так же, как и ядра OpenCL C.
Вклады
C++ для OpenCL — это открытый язык, разработанный сообществом участников, перечисленных в его документации. [32] Новые вклады в определение семантики языка или поддержку инструментария с открытым исходным кодом принимаются от всех заинтересованных лиц, как только они соответствуют основной философии дизайна и рассматриваются и одобряются опытными участниками. [19]
История
OpenCL изначально был разработан Apple Inc. , которая владеет правами на товарный знак , и доработан до первоначального предложения в сотрудничестве с техническими группами AMD , IBM , Qualcomm , Intel и Nvidia . Apple представила это первоначальное предложение в Khronos Group . 16 июня 2008 года была сформирована рабочая группа Khronos Compute [41] с представителями компаний, выпускающих CPU, GPU, встроенные процессоры и программное обеспечение. Эта группа работала в течение пяти месяцев, чтобы завершить технические детали спецификации OpenCL 1.0 к 18 ноября 2008 года. [42] Эта техническая спецификация была рассмотрена членами Khronos и одобрена для публичного выпуска 8 декабря 2008 года. [43]
OpenCL 1.0
OpenCL 1.0 был выпущен вместе с Mac OS X Snow Leopard 28 августа 2009 года. Согласно пресс-релизу Apple: [44]
Snow Leopard еще больше расширяет поддержку современного оборудования с помощью Open Computing Language (OpenCL), который позволяет любому приложению использовать огромные гигафлопсы вычислительной мощности GPU, ранее доступные только графическим приложениям. OpenCL основан на языке программирования C и был предложен в качестве открытого стандарта.
AMD решила поддерживать OpenCL вместо ныне устаревшего Close to Metal в своей структуре Stream . [45] [46] RapidMind объявила о принятии OpenCL в рамках своей платформы разработки для поддержки графических процессоров от разных поставщиков с одним интерфейсом. [47] 9 декабря 2008 года Nvidia объявила о намерении добавить полную поддержку спецификации OpenCL 1.0 в свой GPU Computing Toolkit. [48] 30 октября 2009 года IBM выпустила свою первую реализацию OpenCL как часть компиляторов XL. [49]
Ускорение вычислений с коэффициентом до 1000 возможно с OpenCL на графических картах по сравнению с обычными ЦП. [50]
Некоторые важные функции следующей версии OpenCL являются необязательными в 1.0, например, операции двойной или половинной точности. [51]
OpenCL 1.1
OpenCL 1.1 был ратифицирован Khronos Group 14 июня 2010 года [52] и добавляет значительную функциональность для повышения гибкости, функциональности и производительности параллельного программирования, включая:
Новые типы данных, включая 3-компонентные векторы и дополнительные форматы изображений;
Обработка команд из нескольких потоков хоста и обработка буферов на нескольких устройствах;
Операции с областями буфера, включая чтение, запись и копирование прямоугольных областей 1D, 2D или 3D;
Расширенное использование событий для управления и контроля выполнения команд;
Дополнительные встроенные функции OpenCL C, такие как целочисленное закрепление, перемешивание и асинхронные пошаговые копии;
Улучшена совместимость OpenGL за счет эффективного совместного использования изображений и буферов путем связывания событий OpenCL и OpenGL.
OpenCL 1.2
15 ноября 2011 года Khronos Group анонсировала спецификацию OpenCL 1.2, [53] которая добавила значительную функциональность по сравнению с предыдущими версиями с точки зрения производительности и возможностей для параллельного программирования. Наиболее примечательные особенности включают в себя:
Разделение устройств: возможность разбить устройство на подустройства, чтобы рабочие задания можно было распределить по отдельным вычислительным блокам. Это полезно для резервирования областей устройства с целью сокращения задержки для задач, критичных по времени.
Раздельная компиляция и связывание объектов: функциональность компиляции OpenCL во внешние библиотеки для включения в другие программы.
Расширенная поддержка изображений (опционально): 1.2 добавляет поддержку 1D-изображений и массивов 1D/2D-изображений. Кроме того, расширения общего доступа OpenGL теперь позволяют использовать 1D-текстуры OpenGL и массивы 1D/2D-текстур для создания изображений OpenCL.
Встроенные ядра: пользовательские устройства, которые содержат определенные уникальные функции, теперь более тесно интегрированы в фреймворк OpenCL. Ядра могут вызываться для использования специализированных или непрограммируемых аспектов базового оборудования. Примерами являются видеокодирование/декодирование и цифровые сигнальные процессоры.
Функциональность DirectX: Совместное использование медиа-поверхностей DX9 позволяет эффективно делиться между медиа-поверхностями OpenCL и DX9 или DXVA . Аналогично, для DX11 включено бесшовное совместное использование между поверхностями OpenCL и DX11.
Возможность принудительного соответствия IEEE 754 для математики с плавающей точкой с одинарной точностью: OpenCL по умолчанию допускает, чтобы версии с одинарной точностью для деления, обратной величины и операции квадратного корня были менее точными, чем правильно округленные значения, требуемые IEEE 754. [54] Если программист передает компилятору аргумент командной строки "-cl-fp32-correctly-rounded-divide-sqrt", эти три операции будут вычислены в соответствии с требованиями IEEE 754, если реализация OpenCL поддерживает это, и не будут скомпилированы, если реализация OpenCL не поддерживает вычисление этих операций до их правильно округленных значений, как определено в спецификации IEEE 754. [54] Эта возможность дополняется возможностью запрашивать реализацию OpenCL, чтобы определить, может ли она выполнять эти операции с точностью IEEE 754. [54]
OpenCL 2.0
18 ноября 2013 года Khronos Group объявила о ратификации и публичном выпуске финальной спецификации OpenCL 2.0. [55] Обновления и дополнения к OpenCL 2.0 включают в себя:
Общая виртуальная память
Вложенный параллелизм
Общее адресное пространство
Изображения (необязательно, включая 3D-изображение)
атомы C11
Трубы
Расширение драйвера клиента для установки на Android
половинная точность расширена с помощью дополнительного расширения cl_khr_fp16
Ратификация и выпуск предварительной спецификации OpenCL 2.1 были объявлены 3 марта 2015 года на конференции разработчиков игр в Сан-Франциско. Она была выпущена 16 ноября 2015 года. [56] Она представила язык ядра OpenCL C++, основанный на подмножестве C++14 , при этом сохранив поддержку уже существующего языка ядра OpenCL C. Vulkan и OpenCL 2.1 совместно используют SPIR-V в качестве промежуточного представления, позволяя высокоуровневым языковым интерфейсам совместно использовать общую цель компиляции. Обновления API OpenCL включают:
Дополнительные функции подгруппы
Копирование объектов и состояний ядра
Запросы таймера устройства с малой задержкой
Прием кода SPIR-V во время выполнения
Подсказки по приоритету выполнения для очередей
Отправки нулевого размера от хоста
AMD, ARM , Intel, HPC и YetiWare заявили о поддержке OpenCL 2.1. [57] [58]
OpenCL2.2
OpenCL 2.2 добавляет язык ядра OpenCL C++ в основную спецификацию для значительного повышения производительности параллельного программирования. [59] [60] [61] Он был выпущен 16 мая 2017 года. [62] Обновление обслуживания выпущено в мае 2018 года с исправлениями ошибок. [63]
Язык ядра OpenCL C++ является статическим подмножеством стандарта C++14 и включает классы, шаблоны, лямбда-выражения, перегрузки функций и многие другие конструкции для универсального и метапрограммирования.
Использует новый промежуточный язык Khronos SPIR-V 1.1, который полностью поддерживает язык ядра OpenCL C++.
Функции библиотеки OpenCL теперь могут использовать язык C++ для обеспечения повышенной безопасности и сокращения неопределенного поведения при доступе к таким функциям, как атомарные элементы, итераторы, изображения, сэмплеры, каналы и встроенные типы и адресные пространства очередей устройств.
Хранилище каналов — это новый тип на стороне устройства в OpenCL 2.2, который полезен для реализаций ПЛИС, поскольку делает размер и тип подключения известными во время компиляции, обеспечивая эффективную связь между ядрами в области устройства.
OpenCL 2.2 также включает функции для улучшенной оптимизации сгенерированного кода: приложения могут предоставлять значение константы специализации во время компиляции SPIR-V, новый запрос может обнаруживать нетривиальные конструкторы и деструкторы глобальных объектов области действия программы, а пользовательские обратные вызовы могут быть установлены во время выпуска программы.
Работает на любом оборудовании, поддерживающем OpenCL 2.0 (требуется только обновление драйвера).
OpenCL3.0
Спецификация OpenCL 3.0 была выпущена 30 сентября 2020 года после нахождения в предварительном просмотре с апреля 2020 года. Функциональность OpenCL 1.2 стала обязательной базовой линией, в то время как все функции OpenCL 2.x и OpenCL 3.0 стали необязательными. Спецификация сохраняет язык OpenCL C и исключает язык ядра OpenCL C++, заменяя его языком C++ для OpenCL [19] на основе компилятора Clang / LLVM , который реализует подмножество промежуточного кода C++17 и SPIR-V . [64] [65] [66]
Версия 3.0.7 C++ для OpenCL с некоторыми расширениями Khronos openCL была представлена на IWOCL 21. [67] Актуальной является версия 3.0.11 с некоторыми новыми расширениями и исправлениями. NVIDIA, тесно сотрудничая с рабочей группой Khronos OpenCL, улучшила Vulkan Interop с помощью семафоров и совместного использования памяти. [68] Последнее небольшое обновление было 3.0.14 с исправлением ошибок и новым расширением для нескольких устройств. [69]
Дорожная карта
При выпуске OpenCL 2.2 группа Khronos объявила, что OpenCL будет сходиться, где это возможно, с Vulkan, чтобы обеспечить гибкость развертывания программного обеспечения OpenCL через оба API. [70] [71] Теперь это было продемонстрировано Adobe Premiere Rush, использующим компилятор с открытым исходным кодом clspv [39] для компиляции значительных объемов кода ядра OpenCL C для запуска в среде выполнения Vulkan для развертывания на Android. [72] У OpenCL есть перспективная дорожная карта, независимая от Vulkan, с «OpenCL Next», находящимся в разработке и нацеленным на выпуск в 2020 году. OpenCL Next может интегрировать расширения, такие как Vulkan / OpenCL Interop, Scratch-Pad Memory Management, Extended Subgroups, SPIR-V 1.4 ingestion и SPIR-V Extended debug information. OpenCL также рассматривает загрузчик и слои, подобные Vulkan, и «гибкий профиль» для гибкости развертывания на нескольких типах ускорителей. [73]
Реализации с открытым исходным кодом
OpenCL состоит из набора заголовков и общего объекта , который загружается во время выполнения. Устанавливаемый клиентский драйвер (ICD) должен быть установлен на платформе для каждого класса поставщика, для которого среда выполнения должна поддерживаться. То есть, например, для поддержки устройств Nvidia на платформе Linux необходимо установить Nvidia ICD таким образом, чтобы среда выполнения OpenCL (загрузчик ICD) могла найти ICD для поставщика и перенаправить вызовы соответствующим образом. Стандартный заголовок OpenCL используется потребительским приложением; вызовы каждой функции затем проксируются средой выполнения OpenCL в соответствующий драйвер с помощью ICD. Каждый поставщик должен реализовать каждый вызов OpenCL в своем драйвере. [74]
Реализации OpenCL от Apple [75] , Nvidia [76] , ROCm , RapidMind [77] и Gallium3D [78] основаны на технологии компилятора LLVM и используют компилятор Clang в качестве интерфейса.
MESA Галлий Вычислительный
Реализация OpenCL (фактически 1.1 неполная, в основном сделанная AMD Radeon GCN ) для ряда платформ поддерживается как часть проекта Gallium Compute, [79] который основывается на работе проекта Mesa для поддержки нескольких платформ. Ранее это было известно как CLOVER., [80] фактическая разработка: в основном поддержка для запуска неполной структуры с фактическими LLVM и CLANG, некоторые новые функции, такие как fp16 в 17.3, [81] Target полная OpenCL 1.0, 1.1 и 1.2 для AMD и Nvidia. Новая базовая разработка выполняется Red Hat с SPIR-V также для Clover. [82] [83] Новая цель — это модульный OpenCL 3.0 с полной поддержкой OpenCL 1.2. Фактическое состояние доступно в Mesamatrix. Поддержка изображений находится здесь в центре внимания разработки.
RustiCL — это новая реализация для вычислений Gallium с Rust вместо C. В Mesa 22.2 доступна экспериментальная реализация с поддержкой openCL 3.0 и реализацией расширения изображений для таких программ, как Darktable. [84] Intel Xe (Arc) и AMD GCN+ поддерживаются в Mesa 22.3+. AMD R600 и Nvidia Kepler+ также являются целевыми для аппаратной поддержки. [85] [86] [87] RustiCL превосходит AMD ROCM с оборудованием Radeon RX 6700 XT в бенчмарке Luxmark. [88] Mesa 23.1 поддерживает официальный RustiCL. В Mesa 23.2 поддержка важного fp64 находится на экспериментальном уровне.
В Windows 11 на Arm от Microsoft добавлена поддержка OpenCL 1.2 через CLon12, реализацию OpenCL с открытым исходным кодом поверх DirectX 12 через Mesa Gallium . [89] [90] [91]
БЕНЬЕ
Реализация Intel для своего оборудования Ivy Bridge + была выпущена в 2013 году. [92] Это программное обеспечение от китайской команды Intel вызвало критику со стороны разработчиков AMD и Red Hat , [93] а также Майкла Ларабеля из Phoronix . [94] Актуальная версия 1.3.2 полностью поддерживает OpenCL 1.2 (Ivy Bridge и выше) и опционально OpenCL 2.0 для Skylake и новее. [95] [96] поддержка Android была добавлена в Beignet. [97] фактические цели разработки: поддержка только 1.2 и 2.0, путь к OpenCL 2.1, 2.2, 3.0 пройден в NEO.
НЕО
Реализация Intel для оборудования Gen. 8 Broadwell + Gen. 9, выпущенная в 2018 году. [98] Этот драйвер заменяет реализацию Beignet для поддерживаемых платформ (не более старых 6.gen до Haswell). NEO обеспечивает поддержку OpenCL 2.1 на платформах Core и OpenCL 1.2 на платформах Atom. [99] Актуально в 2020 году, также поддерживаются Graphic Gen 11 Ice Lake и Gen 12 Tiger Lake. Новый OpenCL 3.0 доступен для Alder Lake, Tiger Lake до Broadwell с версии 20.41+. Теперь он включает опциональные OpenCL 2.0, 2.1 Features complete и некоторые из 2.2.
ROCм
Созданный как часть AMD GPUOpen , ROCm (Radeon Open Compute) — это проект Linux с открытым исходным кодом, построенный на OpenCL 1.2 с языковой поддержкой 2.0. Система совместима со всеми современными процессорами и гибридными процессорами AMD (фактически частично GFX 7, GFX 8 и 9), а также процессорами Intel Gen7.5+ (только с PCI 3.0). [100] [101] С версией 1.9 поддержка в некоторых точках расширена экспериментально до оборудования с PCIe 2.0 и без атомарных. Обзор фактической работы сделан на XDC2018. [102] [103] Версия ROCm 2.0 поддерживает полный OpenCL 2.0, но некоторые ошибки и ограничения находятся в списке дел. [104] [105] Версия 3.3 улучшается в деталях. [106] Версия 3.5 поддерживает OpenCL 2.2. [107] Версия 3.10 была с улучшениями и новыми API. [108] На SC20 был анонсирован ROCm 4.0 с поддержкой AMD Compute Card Instinct MI 100. [109] Актуальная документация 5.5.1 и более ранних версий доступна на GitHub. [110] [111] [112] Доступен OpenCL 3.0. RocM 5.5.x+ поддерживает только GFX 9 Vega и более поздние версии, поэтому альтернативой являются более старые выпуски RocM или в будущем RustiCL для старого оборудования.
ПОКЛ
Портативная реализация, поддерживающая ЦП и некоторые ГП (через CUDA и HSA ). Основана на Clang и LLVM . [113] В версии 1.0 OpenCL 1.2 был почти полностью реализован вместе с некоторыми функциями 2.x. [114] Версия 1.2 имеет поддержку LLVM/CLANG 6.0, 7.0 и полную поддержку OpenCL 1.2 со всеми закрытыми тикетами в Milestone 1.2. [114] [115] OpenCL 2.0 почти полностью реализован. [116] Версия 1.3 поддерживает Mac OS X. [117] Версия 1.4 включает поддержку LLVM 8.0 и 9.0. [118] Версия 1.5 реализует поддержку LLVM/Clang 10. [119] Версия 1.6 реализует поддержку LLVM/Clang 11 и ускорение CUDA. [120] Фактические цели — полная поддержка OpenCL 2.x, OpenCL 3.0 и улучшение производительности. POCL 1.6 с ручной оптимизацией на том же уровне, что и Intel compute runtime. [121] Версия 1.7 реализует поддержку LLVM/Clang 12 и некоторые новые функции OpenCL 3.0. [122] Версия 1.8 реализует поддержку LLVM/Clang 13. [123] Версия 3.0 реализует OpenCL 3.0 на минимальном уровне и LLVM/Clang 14. [124] Версия 3.1 работает с LLVM/Clang 15 и улучшенной поддержкой Spir-V. [125]
Шемрок
Порт Mesa Clover для ARM с полной поддержкой OpenCL 1.2, [126] [127] фактическая разработка для 2.0 отсутствует.
FreeOCL
Реализация OpenCL 1.2, ориентированная на ЦП, которая реализует внешний компилятор для создания более надежной платформы, [128] фактическая разработка отсутствует.
МОКЛ
Реализация OpenCL на основе POCL исследователями NUDT для Matrix-2000 была выпущена в 2018 году. Архитектура Matrix-2000 разработана для замены ускорителей Intel Xeon Phi суперкомпьютера TianHe-2. Эта программная среда построена на основе LLVM v5.0 и также повторно использует некоторые фрагменты кода из POCL. Чтобы раскрыть аппаратный потенциал, среда выполнения устройства использует стратегию диспетчеризации задач на основе push-уведомлений, а производительность атомарных элементов ядра значительно улучшена. Эта структура была развернута в системе TH-2A и легко доступна для общественности. [129] Часть программного обеспечения будет затем портирована для улучшения POCL. [114]
VC4CL
Реализация OpenCL 1.2 для процессора VideoCore IV (BCM2763), использовавшегося в Raspberry Pi до модели 4. [130]
Реализации поставщиков
Хронология внедрения поставщиками
Июнь 2008 г.: Во время конференции Apple WWDC участникам была предоставлена ранняя бета-версия Mac OS X Snow Leopard , включавшая первую бета-реализацию OpenCL, примерно за 6 месяцев до ратификации окончательной спецификации версии 1.0 в конце 2008 г. Они также показали две демонстрации. Одна представляла собой сетку из отрисованных экранов 8×8, каждый из которых отображал экран эмулируемой машины Apple II — всего 64 независимых экземпляра, каждый из которых запускал известную игру каратэ. Это демонстрировало параллелизм задач на ЦП. Другая демонстрация представляла собой симуляцию N -тел, запущенную на ГП Mac Pro, параллельную задачу по данным.
10 декабря 2008 г.: AMD и Nvidia провели первую публичную демонстрацию OpenCL, 75-минутную презентацию на SIGGRAPH Asia 2008. AMD показала демо OpenCL с ускорением на CPU, объясняющее масштабируемость OpenCL на одном или нескольких ядрах, в то время как Nvidia показала демо с ускорением на GPU. [131] [132]
16 марта 2009 г.: на 4-й выставке Multicore Expo компания Imagination Technologies анонсировала PowerVR SGX543MP — первый графический процессор этой компании с поддержкой OpenCL. [133]
20 апреля 2009 г.: Nvidia объявила о выпуске своего драйвера OpenCL и SDK для разработчиков, участвующих в программе раннего доступа OpenCL. [135]
5 августа 2009 г.: AMD представила первые инструменты разработки для своей платформы OpenCL в рамках своей программы ATI Stream SDK v2.0 Beta. [136]
28 августа 2009 г.: Apple выпустила Mac OS X Snow Leopard , которая содержит полную реализацию OpenCL. [137]
28 сентября 2009 г.: Nvidia выпустила собственные драйверы OpenCL и реализацию SDK.
13 октября 2009 г.: AMD выпустила четвертую бета-версию ATI Stream SDK 2.0, которая обеспечивает полную реализацию OpenCL как на R700 / HD 5000 GPU, так и на SSE3- совместимых CPU. SDK доступен как для Linux, так и для Windows. [138]
26 ноября 2009 г.: Nvidia выпустила драйверы для OpenCL 1.0 (версия 48).
27 октября 2009 г.: S3 выпустила свой первый продукт, поддерживающий собственный OpenCL 1.0 – встроенный графический процессор Chrome 5400E. [139]
10 декабря 2009 г.: VIA выпустила свой первый продукт, поддерживающий OpenCL 1.0 – видеопроцессор ChromotionHD 2.0, включенный в чипсет VN1000. [140]
21 декабря 2009 г.: AMD выпустила производственную версию ATI Stream SDK 2.0, [141] которая обеспечивает поддержку OpenCL 1.0 для графических процессоров HD 5000 и бета-поддержку для графических процессоров R700 .
1 июня 2010 г.: ZiiLABS опубликовала подробности своей первой реализации OpenCL для процессора ZMS для портативных, встраиваемых и цифровых домашних продуктов. [142]
30 июня 2010 г.: IBM выпустила полностью совместимую версию OpenCL 1.0. [4]
13 сентября 2010 г.: Intel опубликовала подробности своей первой реализации OpenCL для архитектуры чипа Sandy Bridge. Sandy Bridge интегрирует новейшую технологию графического чипа Intel непосредственно в центральный процессор. [143]
3 марта 2011 г.: Khronos Group объявляет о формировании рабочей группы WebCL для изучения определения привязки JavaScript к OpenCL. Это создает потенциал для использования параллельной обработки GPU и многоядерных CPU из веб-браузера . [145] [146]
31 марта 2011 г.: IBM выпустила полностью соответствующую версию OpenCL 1.1. [4] [147]
25 апреля 2011 г.: IBM выпустила OpenCL Common Runtime v0.1 для Linux на архитектуре x86. [148]
4 мая 2011 г.: Nokia Research выпускает расширение WebCL с открытым исходным кодом для веб-браузера Firefox , обеспечивающее привязку JavaScript к OpenCL. [149]
1 июля 2011 г.: Samsung Electronics выпускает прототипную реализацию WebCL для WebKit с открытым исходным кодом, обеспечивающую привязку JavaScript к OpenCL. [150]
8 августа 2011 г.: AMD выпустила комплект разработки программного обеспечения (SDK) AMD Accelerated Parallel Processing (APP) v2.5 на основе OpenCL, заменив ATI Stream SDK в качестве технологии и концепции. [151]
12 декабря 2011 г.: AMD выпустила AMD APP SDK v2.6 [152] , который содержит предварительную версию OpenCL 1.2.
27 февраля 2012 г.: Portland Group выпустила компилятор PGI OpenCL для многоядерных процессоров ARM . [153]
17 апреля 2012 г.: Khronos выпустил рабочий проект WebCL. [154]
6 мая 2013 г.: Altera выпустила Altera SDK для OpenCL версии 13.0. [155] Он соответствует OpenCL 1.0. [156]
18 ноября 2013 г.: Khronos объявила о завершении разработки спецификации OpenCL 2.0. [157]
19 марта 2014 г.: Khronos выпускает спецификацию WebCL 1.0. [158] [159]
29 августа 2014 г.: Intel выпускает драйвер HD Graphics 5300, поддерживающий OpenCL 2.0. [160]
25 сентября 2014 г.: AMD выпускает Catalyst 14.41 RC1, который включает драйвер OpenCL 2.0. [161]
14 января 2015 г.: Xilinx Inc. объявляет о выпуске среды разработки SDAccel для OpenCL, C и C++, которая получила соответствие Khronos. [162]
13 апреля 2015 г.: Nvidia выпускает драйвер WHQL v350.12, который включает поддержку OpenCL 1.2 для графических процессоров на базе архитектуры Kepler или более поздних версий. [163] Драйвер 340+ поддерживает OpenCL 1.1 для Tesla и Fermi.
26 августа 2015 г.: AMD выпустила AMD APP SDK v3.0 [164] , который содержит полную поддержку OpenCL 2.0 и примеры кодирования.
16 ноября 2015 г.: Khronos объявила о завершении разработки спецификации OpenCL 2.1. [165]
18 апреля 2016 г.: Khronos объявила, что спецификация OpenCL 2.2 предварительно завершена. [60]
3 ноября 2016 г.: поддержка Intel Gen7+ OpenCL 2.1 в SDK 2016 r3. [166]
17 февраля 2017 г.: Nvidia начинает оценочную поддержку OpenCL 2.0 с драйвером 378.66. [167] [168] [169]
16 мая 2017 г.: Khronos объявила, что спецификация OpenCL 2.2 была завершена с выпуском SPIR-V 1.2. [170]
14 мая 2018 г.: Khronos анонсировал обновление для OpenCL 2.2 с исправлением ошибок и унифицированными заголовками. [63]
27 апреля 2020 г.: Khronos анонсировал предварительную версию OpenCL 3.0.
1 июня 2020 г.: среда выполнения Intel NEO с OpenCL 3.0 для нового Tiger Lake.
3 июня 2020 г.: AMD анонсировала RocM 3.5 с поддержкой OpenCL 2.2. [171]
30 сентября 2020 г.: Khronos объявила о завершении разработки спецификаций OpenCL 3.0 (также доступна CTS).
16 октября 2020 г.: Intel объявила о поддержке OpenCL 3.0 в NEO 20.41 (включая большую часть опционального OpenCL 2.x).
6 апреля 2021 г.: Nvidia поддерживает OpenCL 3.0 для Ampere. Maxwell и более поздние графические процессоры также поддерживают OpenCL 3.0 с драйвером Nvidia 465+. [172]
20 августа 2022 г.: графические процессоры Intel Arc Alchemist (Arc A380, A350M, A370M, A550M, A730M и A770M) совместимы с OpenCL 3.0. [173]
14 октября 2022 г.: Arm Mali-G615 и Mali-G715-Immortalis соответствуют OpenCL 3.0. [173]
11 ноября 2022 г.: библиотека Rusticl OpenCL совместима с OpenCL 3.0. [173] [174]
Чтобы официально соответствовать, реализация должна пройти Khronos Conformance Test Suite (CTS), а результаты должны быть отправлены в Khronos Adopters Program. [175] Код Khronos CTS для всех версий OpenCL доступен в открытом исходном коде с 2017 года. [176]
Конформные продукты
Группа Khronos поддерживает расширенный список продуктов, совместимых с OpenCL. [4]
Все соответствующие стандарту реализации можно запросить с помощью одного из инструментов clinfo (существует несколько инструментов с одинаковым названием и похожим набором функций). [187] [188] [189]
Поддержка версий
Продукты и их версии поддержки OpenCL включают: [190]
Поддержка OpenCL 3.0
Возможно все оборудование с OpenCL 1.2+, OpenCL 2.x только опционально, Khronos Test Suite доступен с 2020-10 [191] [192]
(2020) Intel NEO Compute: 20.41+ для Gen 12 Tiger Lake до Broadwell (включая полную поддержку 2.0 и 2.1 и части 2.2) [193]
(2017+) ARM Mali (Bifrost) G51 и G71 в Android 7.1 и Linux
(2018+) ARM Mali (Bifrost) G31, G52, G72 и G76
(2017+) Поддержка неполной оценки: графические процессоры Nvidia Kepler , Maxwell , Pascal , Volta и Turing (GeForce 600, 700, 800, 900 и 10-й серии, Quadro K-, M- и P-серии, Tesla K-, M- и P-серии) с версией драйвера 378.66+
Поддержка OpenCL 1.2
(2011+) для некоторых AMD GCN 1-го поколения некоторые функции OpenCL 2.0 сегодня недоступны, но гораздо больше расширений, чем Terascale
(2009+) AMD TeraScale 2 и 3 GPU (RV8xx, RV9xx в сериях HD 5000, 6000 и 7000)
(2012+) Графические процессоры Nvidia Kepler, Maxwell, Pascal, Volta и Turing (серии GeForce 600, 700, 800, 900, 10, 16, 20, Quadro серии K, M и P, Tesla серии K, M и P)
(2012+) Процессоры Intel 3-го и 4-го поколений ( Ivy Bridge , Haswell )
(2008+) некоторые графические процессоры AMD TeraScale 1 (RV7xx в серии HD4000)
(2008+) Nvidia Tesla, графические процессоры Fermi (серии GeForce 8, 9, 100, 200, 300, 400, 500, Quadro или Tesla с графическими процессорами Tesla или Fermi )
(2011+) Qualcomm Adreno 3xx серии
(2012+) ARM Mali Midgard 1-го и 2-го поколения (T-6xx, T720)
Поддержка OpenCL 1.0
в основном обновлены до 1.1 и 1.2 после первого драйвера только для 1.0
Портативность, производительность и альтернативы
Ключевой особенностью OpenCL является переносимость, благодаря ее абстрактной памяти и модели выполнения , и программист не может напрямую использовать аппаратно-зависимые технологии, такие как встроенное параллельное выполнение потоков (PTX) для графических процессоров Nvidia, если только он не готов отказаться от прямой переносимости на другие платформы. Можно запустить любое ядро OpenCL на любой соответствующей реализации.
Однако производительность ядра не обязательно переносима между платформами. Существующие реализации показали свою конкурентоспособность, когда код ядра настроен должным образом, и автоматическая настройка была предложена в качестве решения проблемы переносимости производительности, [195] давая «приемлемые уровни производительности» в экспериментальных ядрах линейной алгебры. [196] Также изучалась переносимость всего приложения, содержащего несколько ядер с различным поведением, и было показано, что переносимость требует лишь ограниченных компромиссов. [197]
Исследование, проведенное в Делфтском университете в 2011 году, в котором сравнивались программы CUDA и их прямой перевод в OpenCL C, показало, что CUDA превосходит OpenCL максимум на 30% в реализации Nvidia. Исследователи отметили, что их сравнение можно было бы сделать более справедливым, применив ручную оптимизацию к программам OpenCL, в этом случае «не было бы причин для OpenCL получать худшую производительность, чем CUDA». Различия в производительности можно было бы в основном отнести к различиям в модели программирования (особенно модели памяти) и к оптимизации компилятора NVIDIA для CUDA по сравнению с OpenCL. [195]
Другое исследование, проведенное D-Wave Systems Inc., показало, что «производительность ядра OpenCL примерно на 13–63 % ниже, а время выполнения от начала до конца примерно на 16–67 % ниже», чем производительность CUDA. [198]
Тот факт, что OpenCL позволяет разделять рабочие нагрузки между CPU и GPU, выполняя одни и те же программы, означает, что программисты могут использовать оба, разделяя работу между устройствами. [199] Это приводит к проблеме принятия решения о том, как разделить работу, поскольку относительная скорость операций различается между устройствами. Для решения этой проблемы было предложено машинное обучение : Греве и О'Бойл описывают систему опорных векторных машин, обученных на функциях времени компиляции программы, которые могут статически решать проблему разделения устройств, без фактического запуска программ для измерения их производительности. [200]
В сравнении реальных графических карт AMD RDNA 2 и Nvidia RTX Series есть неопределенный результат по OpenCL-Tests. Возможные увеличения производительности от использования Nvidia CUDA или OptiX не были протестированы. [201]
^ "Устройства Android с поддержкой OpenCL". Google Docs . ArrayFire . Получено 28 апреля 2015 г. .
^ "FreeBSD Graphics/OpenCL". FreeBSD . Получено 23 декабря 2015 г. .
^ abcde "Conformant Products". Khronos Group . Получено 9 мая 2015 г.
^ Sochacki, Bartosz (19 июля 2019 г.). "The OpenCL C++ 1.0 Specification" (PDF) . Khronos OpenCL Working Group . Получено 19 июля 2019 г. .
^ Munshi, Aaftab; Howes, Lee; Sochaki, Barosz (27 апреля 2020 г.). "The OpenCL C Specification Version: 3.0 Document Revision: V3.0.7" (PDF) . Рабочая группа Khronos OpenCL. Архивировано из оригинала (PDF) 20 сентября 2020 г. . Получено 28 апреля 2021 г. .
^ "Документация по языку программирования C++ для OpenCL 1.0 и 2021". Рабочая группа Khronos OpenCL. 20 декабря 2021 г. Получено 2 декабря 2022 г.
^ "Conformant Companies". Khronos Group . Получено 19 сентября 2024 г.
^ Джанелли, Сильвия Э. (14 января 2015 г.). «Среда разработки Xilinx SDAccel для OpenCL, C и C++ достигла соответствия Khronos». PR Newswire . Xilinx . Получено 27 апреля 2015 г. .
^ Хоус, Ли (11 ноября 2015 г.). "Версия спецификации OpenCL: 2.1, редакция документа: 23" (PDF) . Рабочая группа Khronos OpenCL . Получено 16 ноября 2015 г. .
^ ab Гастер, Бенедикт; Хоус, Ли; Каели, Дэвид Р.; Мистри, Перхаад; Шаа, Дана (2012). Гетерогенные вычисления с OpenCL: пересмотренное издание OpenCL 1.2 . Морган Кауфманн.
^ Томпсон, Джонатан; Шлахтер, Кристофер (2012). «Введение в модель программирования OpenCL» (PDF) . Лаборатория медиа-исследований Нью-Йоркского университета. Архивировано из оригинала (PDF) 6 июля 2015 г. . Получено 6 июля 2015 г. .
^ abcd Стоун, Джон Э.; Гохара, Дэвид; Ши, Гуочин (2010). «OpenCL: стандарт параллельного программирования для гетерогенных вычислительных систем». Вычислительная техника в науке и технике . 12 (3): 66–73. Bibcode : 2010CSE....12c..66S. doi : 10.1109/MCSE.2010.69. PMC 2964860. PMID 21037981 .
^ Клёкнер, Андреас; Пинто, Николас; Ли, Юнсуп; Катандзаро, Брайан; Иванов Павел; Фасих, Ахмед (2012). «PyCUDA и PyOpenCL: подход к генерации кода во время выполнения графического процессора на основе сценариев». Параллельные вычисления . 38 (3): 157–174. arXiv : 0911.3456 . doi :10.1016/j.parco.2011.09.001. S2CID 18928397.
^ "OpenCL - Open Computing Language Bindings". metacpan.org . Получено 18 августа 2018 г. .
^ "D binding for OpenCL". dlang.org . Получено 29 июня 2021 г. .
^ "SPIR – Первый открытый стандартный промежуточный язык для параллельных вычислений и графики". Khronos Group . 21 января 2014 г.
^ "SYCL – C++ Single-source Heterogeneous Programming for OpenCL". Khronos Group . 21 января 2014 г. Архивировано из оригинала 18 января 2021 г. Получено 24 октября 2016 г.
^ abc "C++ для OpenCL, OpenCL-Guide". GitHub . Получено 18 апреля 2021 г.
^ abc Munshi, Aaftab, ed. (2014). "Спецификация OpenCL C, версия 2.0" (PDF) . Получено 24 июня 2014 г. .
^ ab "Введение в программирование OpenCL 201005" (PDF) . AMD. стр. 89–90. Архивировано из оригинала (PDF) 16 мая 2011 г. Получено 8 августа 2017 г.
^ "OpenCL" (PDF) . SIGGRAPH2008. 14 августа 2008 г. Архивировано из оригинала (PDF) 16 февраля 2012 г. Получено 14 августа 2008 г.
^ "Fitting FFT upon G80 Architecture" (PDF) . Василий Волков и Брайан Казиан, отчет о проекте CS258 Калифорнийского университета в Беркли. Май 2008 г. Получено 14 ноября 2008 г.
^ "OpenCL_FFT". Apple. 26 июня 2012 г. Получено 18 июня 2022 г.
^ Треветт, Нил (28 апреля 2020 г.). «Объявления и панельная дискуссия Khronos» (PDF) .
^ Стулова, Анастасия; Хики, Нил; ван Хаастрегт, Свен; Антонини, Марко; Пети, Кевин (27 апреля 2020 г.). «Язык программирования C++ для OpenCL». Труды Международного семинара по OpenCL . IWOCL '20. Мюнхен, Германия: Ассоциация вычислительной техники. стр. 1–2. doi :10.1145/3388333.3388647. ISBN978-1-4503-7531-3. S2CID 216554183.
^ ab KhronosGroup/OpenCL-Docs, Khronos Group, 16 апреля 2021 г. , получено 18 апреля 2021 г.
^ "Документация Clang release 9, поддержка OpenCL". releases.llvm.org . Сентябрь 2019 . Получено 18 апреля 2021 .
^ "Clang 9, Language Extensions, OpenCL". releases.llvm.org . Сентябрь 2019 . Получено 18 апреля 2021 .
^ "Выпуск документации по C++ для языка ядра OpenCL, версия 1.0, редакция 1 · KhronosGroup/OpenCL-Docs". GitHub . Декабрь 2020 . Получено 18 апреля 2021 .
^ "Выпуск документации по C++ для языка ядра OpenCL, версии 1.0 и 2021 · KhronosGroup/OpenCL-Docs". GitHub . Декабрь 2021 . Получено 2 декабря 2022 .
^ ab "Документация по языку программирования C++ для OpenCL 1.0". www.khronos.org . Получено 18 апреля 2021 г. .
^ abcd "Выпуск документации по языку ядра C++ для OpenCL, версия 1.0, редакция 2 · KhronosGroup/OpenCL-Docs". GitHub . Март 2021 г. . Получено 18 апреля 2021 г. .
^ "Mali SDK поддерживает компиляцию ядер на C++ для OpenCL". community.arm.com . Декабрь 2020 . Получено 18 апреля 2021 .
^ «Руководство пользователя компилятора Clang — поддержка C++ для OpenCL». clang.llvm.org . Получено 18 апреля 2021 г. .
^ "OpenCL-Guide, Offline Compilation of OpenCL Kernel Sources". GitHub . Получено 18 апреля 2021 г.
^ "OpenCL-Guide, Программирование ядер OpenCL". GitHub . Получено 18 апреля 2021 г.
^ ab Clspv — прототип компилятора для подмножества вычислительных шейдеров OpenCL C в Vulkan: google/clspv, 17 августа 2019 г. , получено 20 августа 2019 г.
^ Пети, Кевин (17 апреля 2021 г.), Экспериментальная реализация OpenCL на Vulkan , получено 18 апреля 2021 г.
^ "Khronos запускает гетерогенную вычислительную инициативу" (пресс-релиз). Khronos Group. 16 июня 2008 г. Архивировано из оригинала 20 июня 2008 г. Получено 18 июня 2008 г.
^ "OpenCL рекламируется в Техасе". MacWorld. 20 ноября 2008 г. Получено 12 июня 2009 г.
^ "The Khronos Group выпускает спецификацию OpenCL 1.0" (пресс-релиз). Khronos Group. 8 декабря 2008 г. Получено 4 декабря 2016 г.
^ "Apple Previews Mac OS X Snow Leopard to Developers" (пресс-релиз). Apple Inc. 9 июня 2008 г. Архивировано из оригинала 18 марта 2012 г. Получено 9 июня 2008 г.
^ "AMD стимулирует принятие отраслевых стандартов в разработке программного обеспечения GPGPU" (пресс-релиз). AMD. 6 августа 2008 г. Получено 14 августа 2008 г.
^ "AMD Backs OpenCL, Microsoft DirectX 11". eWeek. 6 августа 2008 г. Архивировано из оригинала 6 декабря 2012 г. Получено 14 августа 2008 г.
^ "HPCWire: RapidMind поддерживает проекты с открытым исходным кодом и стандартами". HPCWire. 10 ноября 2008 г. Архивировано из оригинала 18 декабря 2008 г. Получено 11 ноября 2008 г.
^ "Nvidia добавляет OpenCL в свой ведущий в отрасли набор вычислительных инструментов для графических процессоров" (пресс-релиз). Nvidia. 9 декабря 2008 г. Получено 10 декабря 2008 г.
^ "OpenCL Development Kit for Linux on Power". alphaWorks. 30 октября 2009 г. Получено 30 октября 2009 г.
^ "Opencl Standard – обзор | Темы ScienceDirect". www.sciencedirect.com .
^ "Khronos стимулирует развитие стандарта параллельных вычислений с выпуском спецификации OpenCL 1.1". Архивировано из оригинала 2 марта 2016 г. Получено 24 февраля 2016 г.
^ "Khronos выпускает спецификацию OpenCL 1.2". Khronos Group. 15 ноября 2011 г. Получено 23 июня 2015 г.
^ abc "Спецификация OpenCL 1.2" (PDF) . Khronos Group . Получено 23 июня 2015 г. .
^ "Khronos завершает спецификацию OpenCL 2.0 для гетерогенных вычислений". Khronos Group. 18 ноября 2013 г. Получено 10 февраля 2014 г.
^ "Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования". Khronos Group. 16 ноября 2015 г. Получено 16 ноября 2015 г.
^ "Khronos объявляет OpenCL 2.1: C++ приходит в OpenCL". AnandTech. 3 марта 2015 г. Получено 8 апреля 2015 г.
^ "Khronos выпускает предварительную спецификацию OpenCL 2.1 для публичного ознакомления". Khronos Group. 3 марта 2015 г. Получено 8 апреля 2015 г.
^ "Обзор OpenCL". Khronos Group. 21 июля 2013 г.
^ ab "Khronos выпускает предварительную спецификацию OpenCL 2.2 с языком ядра OpenCL C++ для параллельного программирования". Khronos Group . 18 апреля 2016 г.
^ Треветт, Нил (апрель 2016 г.). «OpenCL – A State of the Union» (PDF) . IWOCL . Вена : Khronos Group . Получено 2 января 2017 г.
^ "Khronos выпускает OpenCL 2.2 с SPIR-V 1.2". Khronos Group . 16 мая 2017 г.
^ ab "OpenCL 2.2 Maintenance Update Released". Группа Khronos . 14 мая 2018 г.
^ «OpenCL 3.0 обеспечивает большую гибкость, расширения асинхронного DMA». www.phoronix.com .
^ "Khronos Group выпускает OpenCL 3.0". 26 апреля 2020 г.
^ "Спецификация OpenCL" (PDF) . Рабочая группа Khronos OpenCL.
^ Треветт, Нил (2021). «State of the Union: OpenCL Working Group» (PDF) . стр. 9.
^ «Использование расширений семафора и общего доступа к памяти для взаимодействия Vulkan с NVIDIA OpenCL». 24 февраля 2022 г.
^ «OpenCL 3.0.14 выпущен с новым расширением для буфера команд для нескольких устройств».
^ "Breaking: OpenCL Merging Roadmap into Vulkan | PC Perspective". www.pcper.com . Архивировано из оригинала 1 ноября 2017 г. . Получено 17 мая 2017 г. .
^ Треветт, Нил (23 мая 2019 г.). «Обзор Khronos и OpenCL, семинар EVS, 19 мая» (PDF) . Группа Khronos .
^ "Спецификация OpenCL ICD" . Получено 23 июня 2015 г.
^ "Запись Apple на странице LLVM Users" . Получено 29 августа 2009 г. .
^ "Запись Nvidia на странице пользователей LLVM" . Получено 6 августа 2009 г.
^ "Запись Rapidmind на странице пользователей LLVM" . Получено 1 октября 2009 г.
^ "Запись в блоге Зака Русина о реализации OpenCL в Gallium3D". Февраль 2009 г. Получено 1 октября 2009 г.
^ "GalliumCompute". dri.freedesktop.org . Получено 23 июня 2015 г. .
^ «Обновление статуса Clover» (PDF) .
^ "mesa/mesa – Библиотека 3D-графики Mesa". cgit.freedesktop.org .
^ "Gallium Clover With SPIR-V & NIR Opening Up New Compute Options Inside Mesa – Phoronix". www.phoronix.com . Архивировано из оригинала 22 октября 2020 г. . Получено 13 декабря 2018 г. .
^ Кларк, Роб; Хербст, Кароль (2018). «Поддержка OpenCL внутри mesa через SPIR-V и NIR» (PDF) .
^ «Реализация Mesa 'Rusticl' теперь справляется с Darktable OpenCL».
^ «Rusticl от Mesa получил официальное соответствие OpenCL 3.0».
^ «Mesa 22.3 выпущена с RDNA3 Vulkan, Rusticl OpenCL, улучшенной графикой Intel Arc».
^ «Драйвер Rusticl OpenCL от Mesa почти готов с поддержкой графических процессоров AMD Radeon».
^ «Реализация Rusticl OpenCL от Mesa может превзойти вычислительный стек Radeon ROCm».
^ «Состояние Windows на Arm64: перспектива высокого уровня». Chips and Cheese . 13 марта 2022 г. Получено 23 октября 2023 г.
^ "Введение в OpenCL и OpenGL в DirectX". Collabora | Open Source Consulting . Получено 23 октября 2023 г.
^ "Глубокое погружение в OpenGL через слои DirectX". Collabora | Open Source Consulting . Получено 23 октября 2023 г.
^ Ларабель, Майкл (10 января 2013 г.). «Beignet: OpenCL/GPGPU приходит для Ivy Bridge на Linux». Phoronix .
^ Ларабель, Майкл (16 апреля 2013 г.). «Больше критики в адрес Beignet OpenCL от Intel». Phoronix .
^ Ларабель, Майкл (24 декабря 2013 г.). «Intel Beignet OpenCL все еще медленно выпекается». Phoronix .
^ "Бенье". freedesktop.org.
^ "beignet – Библиотека Beignet OpenCL для Intel Ivy Bridge и более новых графических процессоров". cgit.freedesktop.org .
^ «Intel представляет Beignet на Android для вычислений OpenCL – Phoronix». www.phoronix.com .
^ "01.org Intel Open Source – Compute Runtime". 7 февраля 2018 г.
^ «GitHub – pocl/pocl: pocl: Портативный компьютерный язык» . 14 марта 2019 г. – через GitHub.
^ "Состояние реализации поддержки HSA по состоянию на 17.05.2016 — Документация Portable Computing Language (pocl) 1.3-pre". portablecl.org .
^ "Домашняя страница PoCL".
^ "Домашняя страница PoCL".
^ "Домашняя страница PoCL".
^ "POCL 1.6-RC1 выпущен с лучшей производительностью CUDA – Phoronix". Архивировано из оригинала 17 января 2021 г. Получено 3 декабря 2020 г.
^ Бауманн, Тобиас; Ноак, Маттиас; Штайнке, Томас (2021). «Оценка производительности и улучшения реализации PoCL с открытым исходным кодом OpenCL на процессорах Intel» (PDF) . стр. 51.
^ "Домашняя страница PoCL".
^ "Домашняя страница PoCL".
^ "Домашняя страница PoCL".
^ "Домашняя страница PoCL".
^ "О нас". Git.Linaro.org .
^ Gall, T.; Pitney, G. (6 марта 2014 г.). "LCA14-412: GPGPU на ARM SoC" (PDF) . Amazon Web Services . Архивировано из оригинала (PDF) 26 июля 2020 г. . Получено 22 января 2017 г. .
^ "zuzuf/freeocl". GitHub . Получено 13 апреля 2017 г. .
^ Чжан, Пэн; Фан, Цзяньбинь; Ян, Цаньцюнь; Тан, Тао; Хуан, Чунь; Ван, Чжэн (2018). MOCL: Эффективная реализация OpenCL для архитектуры Matrix-2000 (PDF) . Труды Международной конференции по вычислительным рубежам. doi :10.1145/3203217.3203244.
^ "OpenCL Demo, AMD CPU". YouTube . 10 декабря 2008 г. Получено 28 марта 2009 г.
^ "OpenCL Demo, Nvidia GPU". YouTube . 10 декабря 2008 г. Получено 28 марта 2009 г.
^ "Imagination Technologies запускает передовое, высокоэффективное семейство многопроцессорных графических IP-устройств POWERVR SGX543MP". Imagination Technologies. 19 марта 2009 г. Архивировано из оригинала 3 апреля 2014 г. Получено 30 января 2011 г.
^ "AMD и Havok demo OpenCL accelerationed physics". PC Perspective. 26 марта 2009 г. Архивировано из оригинала 5 апреля 2009 г. Получено 28 марта 2009 г.
^ "Nvidia выпускает драйвер OpenCL для разработчиков". Nvidia. 20 апреля 2009 г. Архивировано из оригинала 4 февраля 2012 г. Получено 27 апреля 2009 г.
^ "AMD делает обратный GPGPU, анонсирует OpenCL SDK для x86". Ars Technica. 5 августа 2009 г. Получено 6 августа 2009 г.[ постоянная мертвая ссылка ]
↑ Moren, Dan; Snell, Jason (8 июня 2009 г.). "Live Update: WWDC 2009 Keynote". MacWorld.com . MacWorld . Получено 12 июня 2009 г. .
^ "ATI Stream Software Development Kit (SDK) v2.0 Beta Program". Архивировано из оригинала 9 августа 2009 г. Получено 14 октября 2009 г.
^ "S3 Graphics выпустила встроенный графический процессор Chrome 5400E". Архивировано из оригинала 2 декабря 2009 г. Получено 27 октября 2009 г.
^ "VIA представляет усовершенствованный графический процессор VN1000". Архивировано из оригинала 15 декабря 2009 г. Получено 10 декабря 2009 г.
^ "ATI Stream SDK v2.0 с поддержкой OpenCL 1.0". Архивировано из оригинала 1 ноября 2009 г. Получено 23 октября 2009 г.
^ "OpenCL". ZiiLABS . Получено 23 июня 2015 г.
^ "Intel раскрывает новые технические подробности Sandy Bridge". Архивировано из оригинала 31 октября 2013 г. Получено 13 сентября 2010 г.
^ "WebCL related stories". Khronos Group . Получено 23 июня 2015 г.
^ "Khronos Releases Final WebGL 1.0 Specification". Khronos Group. Архивировано из оригинала 9 июля 2015 г. Получено 23 июня 2015 г.
^ "Разработчик IBM". developer.ibm.com .
^ «Добро пожаловать в Wikis». www.ibm.com . 20 октября 2009 г.
^ "Nokia Research выпускает прототип WebCL". Khronos Group. 4 мая 2011 г. Архивировано из оригинала 5 декабря 2020 г. Получено 23 июня 2015 г.
^ KamathK, Sharath. "Samsung's WebCL Prototype for WebKit". Github.com. Архивировано из оригинала 18 февраля 2015 г. Получено 23 июня 2015 г.
^ "AMD открывает заслонку производительности APU с обновленной разработкой программного обеспечения OpenCL". Amd.com. 8 августа 2011 г. Получено 16 июня 2013 г.
^ "AMD APP SDK v2.6". Forums.amd.com. 13 марта 2015 г. Получено 23 июня 2015 г.[ мертвая ссылка ]
^ "Portland Group анонсирует OpenCL-компилятор для ST-Ericsson ARM-Based NovaThor SoCs" . Получено 4 мая 2012 г.
^ "WebCL Latest Spec". Khronos Group . 7 ноября 2013 г. Архивировано из оригинала 1 августа 2014 г. Получено 23 июня 2015 г.
^ "Altera открывает мир ПЛИС программистам с широкой доступностью SDK и готовых плат для OpenCL". Altera.com. Архивировано из оригинала 9 января 2014 г. Получено 9 января 2014 г.
^ "Altera SDK для OpenCL — первый в отрасли, достигший соответствия Khronos для FPGA". Altera.com. Архивировано из оригинала 9 января 2014 г. Получено 9 января 2014 г.
^ "Khronos завершает спецификацию OpenCL 2.0 для гетерогенных вычислений". Khronos Group. 18 ноября 2013 г. Получено 23 июня 2015 г.
^ "WebCL 1.0 Press Release". Khronos Group. 19 марта 2014 г. Получено 23 июня 2015 г.
^ "Спецификация WebCL 1.0". Khronos Group. 14 марта 2014 г. Получено 23 июня 2015 г.
^ "Intel OpenCL 2.0 Driver". Архивировано из оригинала 17 сентября 2014 г. Получено 14 октября 2014 г.
^ "AMD OpenCL 2.0 Driver". Support.AMD.com . 17 июня 2015 г. . Получено 23 июня 2015 г. .
^ "Среда разработки Xilinx SDAccel для OpenCL, C и C++ получила соответствие Khronos – новости khronos.org". Группа Khronos . Получено 26 июня 2017 г.
^ "Выпуск 349 графических драйверов для Windows, версия 350.12" (PDF) . 13 апреля 2015 г. . Получено 4 февраля 2016 г. .
^ "AMD APP SDK 3.0 Released". Developer.AMD.com . 26 августа 2015 г. . Получено 11 сентября 2015 г. .
^ "Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования". Khronos Group . 16 ноября 2015 г.
^ "Драйверы NVIDIA 378.66 для Windows предлагают поддержку оценки OpenCL 2.0". Khronos Group . 17 февраля 2017 г. Архивировано из оригинала 6 августа 2020 г. Получено 17 марта 2017 г.
^ Шуппе, Якуб (22 февраля 2017 г.). «NVIDIA обеспечивает поддержку бета-версии OpenCL 2.0».
^ Szuppe, Jakub (6 марта 2017 г.). «Бета-поддержка NVIDIA для OpenCL 2.0 работает и на Linux».
^ "Группа Хронос". Группа «Хронос» . 21 марта 2019 г.
^ "GitHub – RadeonOpenCompute/ROCm на roc-3.5.0". GitHub .
^ ab «NVIDIA теперь совместима с OpenCL 3.0». 12 апреля 2021 г.
^ abc "Группа Хронос". Группа «Хронос» . 12 декабря 2022 г. . Проверено 12 декабря 2022 г.
^ "Rusticl от Mesa достиг официального соответствия OpenCL 3.0". www.phoronix.com . Получено 12 декабря 2022 г. .
^ "The Khronos Group". The Khronos Group . 20 августа 2019 г. . Получено 20 августа 2019 г. .
^ "KhronosGroup/OpenCL-CTL: Тесты соответствия OpenCL". GitHub. 21 марта 2019 г.
^ "OpenCL и AMD APP SDK". AMD Developer Central . developer.amd.com. Архивировано из оригинала 4 августа 2011 г. Получено 11 августа 2011 г.
^ "О Intel OpenCL SDK 1.1". software.intel.com . intel.com . Получено 11 августа 2011 г. .
^ "Intel® SDK для приложений OpenCL™ – Заметки о выпуске". software.intel.com . 14 марта 2019 г.
^ "Поддержка продукта" . Получено 11 августа 2011 г.
^ "Intel OpenCL SDK – Release Notes". Архивировано из оригинала 17 июля 2011 г. Получено 11 августа 2011 г.
^ "Анонс OpenCL Development Kit для Linux на Power v0.3". IBM . Получено 11 августа 2011 г. .
^ "IBM выпускает OpenCL Development Kit для Linux на Power v0.3 – доступна версия, соответствующая OpenCL 1.1". OpenCL Lounge . ibm.com . Получено 11 августа 2011 г. .
^ "IBM выпускает OpenCL Common Runtime для Linux на архитектуре x86". IBM . 20 октября 2009 г. . Получено 10 сентября 2011 г. .
^ "OpenCL и AMD APP SDK". AMD Developer Central . developer.amd.com. Архивировано из оригинала 6 сентября 2011 г. Получено 10 сентября 2011 г.
^ "Nvidia выпускает драйвер OpenCL". 22 апреля 2009 г. Получено 11 августа 2011 г.
^ "clinfo by Simon Leblanc". GitHub . Получено 27 января 2017 г. .
^ "Клинфо Обломова". Гитхаб . Проверено 27 января 2017 г.
^ "clinfo: openCL INFOrmation". 2 апреля 2013 г. Получено 27 января 2017 г.
^ "Khronos Products". Группа Khronos . Получено 15 мая 2017 г.
^ "OpenCL-CTS/Test_conformance на главной · KhronosGroup/OpenCL-CTS". GitHub .
^ «Intel Compute-Runtime 20.43.18277 обеспечивает поддержку Alder Lake».
^ "compute-runtime". 01.org . 7 февраля 2018 г.
^ ab Fang, Jianbin; Varbanescu, Ana Lucia; Sips, Henk (2011). "Комплексное сравнение производительности CUDA и OpenCL". Международная конференция по параллельной обработке 2011 г. Proc. Int'l Conf. on Parallel Processing. стр. 216–225. doi :10.1109/ICPP.2011.45. ISBN978-1-4577-1336-1.
^ Ду, Пэн; Вебер, Рик; Лусчек, Петр; Томов, Станимир; Петерсон, Грегори; Донгарра, Джек (2012). «От CUDA к OpenCL: на пути к производительно-переносимому решению для многоплатформенного программирования GPU». Параллельные вычисления . 38 (8): 391–407. CiteSeerX 10.1.1.193.7712 . doi :10.1016/j.parco.2011.10.002.
^ Дольбо, Ромен; Боден, Франсуа; де Вердьер, Гийом Колен (7 сентября 2013 г.). «Один OpenCL, чтобы править всеми?». 2013 IEEE 6-й Международный семинар по многоядерным вычислительным системам (MuCoCoS) . стр. 1–6. doi :10.1109/MuCoCoS.2013.6633603. ISBN978-1-4799-1010-6. S2CID 225784.
^ Карими, Камран; Диксон, Нил Г.; Хамзе, Фирас (2011). «Сравнение производительности CUDA и OpenCL». arXiv : 1005.2581v3 [cs.PF].
^ Обзор методов гетерогенных вычислений на базе CPU-GPU, ACM Computing Surveys, 2015.
^ Grewe, Dominik; O'Boyle, Michael FP (2011). "A Static Task Partitioning Approach for Heterogeneous Systems Using OpenCL". Compiler Construction . Proc. Int'l Conf. on Compiler Construction. Lecture Notes in Computer Science. Vol. 6601. pp. 286–305. doi : 10.1007/978-3-642-19861-8_16 . ISBN978-3-642-19860-1.
^ «Серия Radeon RX 6800 демонстрирует превосходную производительность OpenCL на базе ROCm в Linux». www.phoronix.com .