stringtranslate.com

OpenCL

OpenCL ( открытый язык вычислений ) — это фреймворк для написания программ, которые выполняются на гетерогенных платформах, состоящих из центральных процессоров (ЦП), графических процессоров (ГП), цифровых сигнальных процессоров (ЦСП), программируемых пользователем вентильных матриц (ПЛИС) и других процессоров или аппаратных ускорителей . OpenCL определяет язык программирования (на основе C99 ) для программирования этих устройств и интерфейсов прикладного программирования (API) для управления платформой и выполнения программ на вычислительных устройствах . OpenCL предоставляет стандартный интерфейс для параллельных вычислений с использованием параллелизма на основе задач и данных .

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]

Не каждое устройство должно реализовывать каждый уровень этой иерархии в аппаратном обеспечении. Согласованность между различными уровнями в иерархии ослаблена и обеспечивается только явными конструкциями синхронизации , в частности барьерами .

Устройства могут совместно использовать память с центральным процессором хоста, а могут и не использовать ее. [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 

Пример: умножение матрицы на вектор

Каждый вызов ( work-item ) ядра берет строку зеленой матрицы ( A в коде), умножает эту строку на красный вектор ( x ) и помещает результат в запись синего вектора ( y ). Количество столбцов n передается ядру как ncols ; количество строк подразумевается в количестве рабочих элементов, созданных хостовой программой.

Ниже представлен алгоритм умножения матрицы на вектор в OpenCL C.

// Умножает 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 и затем, наконец, асинхронно запускает ядро. Результат преобразования в этом примере не считывается.

#include <stdio.h> #include <время.h> #include "CL/opencl.h" #define NUM_ENTRIES 1024int main () // (int argc, const char* argv[])  {// КОНСТАНТЫ// Исходный код ядра представлен в виде строки// находится внутри файла: "fft1D_1024_kernel_src.cl". Подробности см. в следующем листинге.константный символ * KernelSource =   #include "fft1D_1024_kernel_src.cl" ;// Поиск доступных графических процессоровконстанта cl_uint num = 1 ;    clGetDeviceIDs ( NULL , CL_DEVICE_TYPE_GPU , 0 , NULL , ( cl_uint * ) & num );    cl_device_id устройства [ 1 ]; clGetDeviceIDs ( NULL , CL_DEVICE_TYPE_GPU , num , devices , NULL );    // создаем вычислительный контекст с устройством GPUконтекст cl_context = clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL );       // создаем очередь командclGetDeviceIDs ( NULL , CL_DEVICE_TYPE_DEFAULT , 1 , устройства , NULL );    очередь cl_command_queue = clCreateCommandQueue ( контекст , устройства [ 0 ], 0 , NULL );      // выделить объекты буферной памятиcl_mem memobjs [] = { clCreateBuffer ( контекст , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , sizeof ( float ) * 2 * NUM_ENTRIES , NULL , NULL ),               clCreateBuffer ( контекст , CL_MEM_READ_WRITE , sizeof ( float ) * 2 * NUM_ENTRIES , NULL , NULL ) };         // создаем вычислительную программу// const char* fft1D_1024_kernel_src[1] = { };программа cl_program = clCreateProgramWithSource ( context , 1 , ( const char ** ) & KernelSource , NULL , NULL );          // построить исполняемый файл вычислительной программыclBuildProgram ( программа , 0 , NULL , NULL , NULL , NULL );     // создаем вычислительное ядроcl_kernel ядро ​​= clCreateKernel ( программа , "fft1D_1024" , NULL );     // устанавливаем значения аргументовразмер_t локальный_рабочий_размер [ 1 ] = { 256 };     clSetKernelArg ( ядро ​​, 0 , sizeof ( cl_mem ), ( void * ) & memobjs [ 0 ]);    clSetKernelArg ( ядро ​​, 1 , sizeof ( cl_mem ), ( void * ) & memobjs [ 1 ]);    clSetKernelArg ( ядро , 2 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );       clSetKernelArg ( ядро , 3 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );       // создаем объект диапазона ND с размерами рабочего элемента и выполняем ядроразмер_t глобальный_рабочий_размер [ 1 ] = { 256 };     global_work_size [ 0 ] = NUM_ENTRIES ;  local_work_size [ 0 ] = 64 ; //Nvidia: 192 или 256   clEnqueueNDRangeKernel ( очередь , ядро , 1 , NULL , global_work_size , local_work_size , 0 , NULL , NULL );        }

Фактический расчет внутри файла "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] и добавляет значительную функциональность для повышения гибкости, функциональности и производительности параллельного программирования, включая:

OpenCL 1.2

15 ноября 2011 года Khronos Group анонсировала спецификацию OpenCL 1.2, [53] которая добавила значительную функциональность по сравнению с предыдущими версиями с точки зрения производительности и возможностей для параллельного программирования. Наиболее примечательные особенности включают в себя:

OpenCL 2.0

18 ноября 2013 года Khronos Group объявила о ратификации и публичном выпуске финальной спецификации OpenCL 2.0. [55] Обновления и дополнения к OpenCL 2.0 включают в себя:

OpenCL2.1

Ратификация и выпуск предварительной спецификации OpenCL 2.1 были объявлены 3 марта 2015 года на конференции разработчиков игр в Сан-Франциско. Она была выпущена 16 ноября 2015 года. [56] Она представила язык ядра OpenCL C++, основанный на подмножестве C++14 , при этом сохранив поддержку уже существующего языка ядра OpenCL C. Vulkan и OpenCL 2.1 совместно используют SPIR-V в качестве промежуточного представления, позволяя высокоуровневым языковым интерфейсам совместно использовать общую цель компиляции. Обновления API OpenCL включают:

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]

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 (IWOCL), организованный Khronos Group

При выпуске 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]

Реализации с открытым исходным кодом

clinfo, инструмент командной строки для просмотра информации OpenCL

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]

Реализации поставщиков

Хронология внедрения поставщиками

Устройства

По состоянию на 2016 год OpenCL работает на графических процессорах (GPU), центральных процессорах с инструкциями SIMD , ПЛИС , Movidius Myriad 2 , Adapteva Epiphany и цифровых сигнальных процессорах .

Набор тестов на соответствие Khronos

Чтобы официально соответствовать, реализация должна пройти 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]

Поддержка OpenCL 2.2

Пока нет : готовый тестовый пакет Khronos с возможностью обновления драйверов для всего оборудования с поддержкой версий 2.0 и 2.1

Поддержка OpenCL 2.1

Поддержка OpenCL 2.0

Поддержка OpenCL 1.2

Поддержка OpenCL 1.1

Поддержка OpenCL 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]

Смотрите также

Ссылки

  1. ^ «Спецификация OpenCL».
  2. ^ "Android-устройства с поддержкой OpenCL". Google Docs . ArrayFire . Получено 28 апреля 2015 г. .
  3. ^ "FreeBSD Graphics/OpenCL". FreeBSD . Получено 23 декабря 2015 г. .
  4. ^ abcde "Conformant Products". Khronos Group . Получено 9 мая 2015 г.
  5. ^ Sochacki, Bartosz (19 июля 2019 г.). "The OpenCL C++ 1.0 Specification" (PDF) . Khronos OpenCL Working Group . Получено 19 июля 2019 г. .
  6. ^ 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 г. .
  7. ^ "Документация по языку программирования C++ для OpenCL 1.0 и 2021". Рабочая группа Khronos OpenCL. 20 декабря 2021 г. Получено 2 декабря 2022 г.
  8. ^ "Conformant Companies". Khronos Group . Получено 19 сентября 2024 г.
  9. ^ Джанелли, Сильвия Э. (14 января 2015 г.). «Среда разработки Xilinx SDAccel для OpenCL, C и C++ достигла соответствия Khronos». PR Newswire . Xilinx . Получено 27 апреля 2015 г. .
  10. ^ Хоус, Ли (11 ноября 2015 г.). "Версия спецификации OpenCL: 2.1, редакция документа: 23" (PDF) . Рабочая группа Khronos OpenCL . Получено 16 ноября 2015 г. .
  11. ^ ab Гастер, Бенедикт; Хоус, Ли; Каели, Дэвид Р.; Мистри, Перхаад; Шаа, Дана (2012). Гетерогенные вычисления с OpenCL: пересмотренное издание OpenCL 1.2 . Морган Кауфманн.
  12. ^ Томпсон, Джонатан; Шлахтер, Кристофер (2012). «Введение в модель программирования OpenCL» (PDF) . Лаборатория медиа-исследований Нью-Йоркского университета. Архивировано из оригинала (PDF) 6 июля 2015 г. . Получено 6 июля 2015 г. .
  13. ^ abcd Стоун, Джон Э.; Гохара, Дэвид; Ши, Гуочин (2010). «OpenCL: стандарт параллельного программирования для гетерогенных вычислительных систем». Вычислительная техника в науке и технике . 12 (3): 66–73. Bibcode : 2010CSE....12c..66S. doi : 10.1109/MCSE.2010.69. PMC 2964860. PMID  21037981 . 
  14. ^ Клёкнер, Андреас; Пинто, Николас; Ли, Юнсуп; Катандзаро, Брайан; Иванов Павел; Фасих, Ахмед (2012). «PyCUDA и PyOpenCL: подход к генерации кода во время выполнения графического процессора на основе сценариев». Параллельные вычисления . 38 (3): 157–174. arXiv : 0911.3456 . doi :10.1016/j.parco.2011.09.001. S2CID  18928397.
  15. ^ "OpenCL - Open Computing Language Bindings". metacpan.org . Получено 18 августа 2018 г. .
  16. ^ "D binding for OpenCL". dlang.org . Получено 29 июня 2021 г. .
  17. ^ "SPIR – Первый открытый стандартный промежуточный язык для параллельных вычислений и графики". Khronos Group . 21 января 2014 г.
  18. ^ "SYCL – C++ Single-source Heterogeneous Programming for OpenCL". Khronos Group . 21 января 2014 г. Архивировано из оригинала 18 января 2021 г. Получено 24 октября 2016 г.
  19. ^ abc "C++ для OpenCL, OpenCL-Guide". GitHub . Получено 18 апреля 2021 г.
  20. ^ abc Munshi, Aaftab, ed. (2014). "Спецификация OpenCL C, версия 2.0" (PDF) . Получено 24 июня 2014 г. .
  21. ^ ab "Введение в программирование OpenCL 201005" (PDF) . AMD. стр. 89–90. Архивировано из оригинала (PDF) 16 мая 2011 г. Получено 8 августа 2017 г.
  22. ^ "OpenCL" (PDF) . SIGGRAPH2008. 14 августа 2008 г. Архивировано из оригинала (PDF) 16 февраля 2012 г. Получено 14 августа 2008 г.
  23. ^ "Fitting FFT upon G80 Architecture" (PDF) . Василий Волков и Брайан Казиан, отчет о проекте CS258 Калифорнийского университета в Беркли. Май 2008 г. Получено 14 ноября 2008 г.
  24. ^ "OpenCL_FFT". Apple. 26 июня 2012 г. Получено 18 июня 2022 г.
  25. ^ Треветт, Нил (28 апреля 2020 г.). «Объявления и панельная дискуссия Khronos» (PDF) .
  26. ^ Стулова, Анастасия; Хики, Нил; ван Хаастрегт, Свен; Антонини, Марко; Пети, Кевин (27 апреля 2020 г.). «Язык программирования C++ для OpenCL». Труды Международного семинара по OpenCL . IWOCL '20. Мюнхен, Германия: Ассоциация вычислительной техники. стр. 1–2. doi :10.1145/3388333.3388647. ISBN 978-1-4503-7531-3. S2CID  216554183.
  27. ^ ab KhronosGroup/OpenCL-Docs, Khronos Group, 16 апреля 2021 г. , получено 18 апреля 2021 г.
  28. ^ "Документация Clang release 9, поддержка OpenCL". releases.llvm.org . Сентябрь 2019 . Получено 18 апреля 2021 .
  29. ^ "Clang 9, Language Extensions, OpenCL". releases.llvm.org . Сентябрь 2019 . Получено 18 апреля 2021 .
  30. ^ "Выпуск документации по C++ для языка ядра OpenCL, версия 1.0, редакция 1 · KhronosGroup/OpenCL-Docs". GitHub . Декабрь 2020 . Получено 18 апреля 2021 .
  31. ^ "Выпуск документации по C++ для языка ядра OpenCL, версии 1.0 и 2021 · KhronosGroup/OpenCL-Docs". GitHub . Декабрь 2021 . Получено 2 декабря 2022 .
  32. ^ ab "Документация по языку программирования C++ для OpenCL 1.0". www.khronos.org . Получено 18 апреля 2021 г. .
  33. ^ abcd "Выпуск документации по языку ядра C++ для OpenCL, версия 1.0, редакция 2 · KhronosGroup/OpenCL-Docs". GitHub . Март 2021 г. . Получено 18 апреля 2021 г. .
  34. ^ "cl_ext_cxx_for_opencl". www.khronos.org . Сентябрь 2020 . Получено 18 апреля 2021 .
  35. ^ "Mali SDK поддерживает компиляцию ядер на C++ для OpenCL". community.arm.com . Декабрь 2020 . Получено 18 апреля 2021 .
  36. ^ «Руководство пользователя компилятора Clang — поддержка C++ для OpenCL». clang.llvm.org . Получено 18 апреля 2021 г. .
  37. ^ "OpenCL-Guide, Offline Compilation of OpenCL Kernel Sources". GitHub . Получено 18 апреля 2021 г.
  38. ^ "OpenCL-Guide, Программирование ядер OpenCL". GitHub . Получено 18 апреля 2021 г.
  39. ^ ab Clspv — прототип компилятора для подмножества вычислительных шейдеров OpenCL C в Vulkan: google/clspv, 17 августа 2019 г. , получено 20 августа 2019 г.
  40. ^ Пети, Кевин (17 апреля 2021 г.), Экспериментальная реализация OpenCL на Vulkan , получено 18 апреля 2021 г.
  41. ^ "Khronos запускает гетерогенную вычислительную инициативу" (пресс-релиз). Khronos Group. 16 июня 2008 г. Архивировано из оригинала 20 июня 2008 г. Получено 18 июня 2008 г.
  42. ^ "OpenCL рекламируется в Техасе". MacWorld. 20 ноября 2008 г. Получено 12 июня 2009 г.
  43. ^ "The Khronos Group выпускает спецификацию OpenCL 1.0" (пресс-релиз). Khronos Group. 8 декабря 2008 г. Получено 4 декабря 2016 г.
  44. ^ "Apple Previews Mac OS X Snow Leopard to Developers" (пресс-релиз). Apple Inc. 9 июня 2008 г. Архивировано из оригинала 18 марта 2012 г. Получено 9 июня 2008 г.
  45. ^ "AMD стимулирует принятие отраслевых стандартов в разработке программного обеспечения GPGPU" (пресс-релиз). AMD. 6 августа 2008 г. Получено 14 августа 2008 г.
  46. ^ "AMD Backs OpenCL, Microsoft DirectX 11". eWeek. 6 августа 2008 г. Архивировано из оригинала 6 декабря 2012 г. Получено 14 августа 2008 г.
  47. ^ "HPCWire: RapidMind поддерживает проекты с открытым исходным кодом и стандартами". HPCWire. 10 ноября 2008 г. Архивировано из оригинала 18 декабря 2008 г. Получено 11 ноября 2008 г.
  48. ^ "Nvidia добавляет OpenCL в свой ведущий в отрасли набор вычислительных инструментов для графических процессоров" (пресс-релиз). Nvidia. 9 декабря 2008 г. Получено 10 декабря 2008 г.
  49. ^ "OpenCL Development Kit for Linux on Power". alphaWorks. 30 октября 2009 г. Получено 30 октября 2009 г.
  50. ^ "Opencl Standard – обзор | Темы ScienceDirect". www.sciencedirect.com .
  51. ^ "Версия спецификации OpenCL: 1.0. Редакция документа: 48" (PDF) . Рабочая группа Khronos OpenCL.
  52. ^ "Khronos стимулирует развитие стандарта параллельных вычислений с выпуском спецификации OpenCL 1.1". Архивировано из оригинала 2 марта 2016 г. Получено 24 февраля 2016 г.
  53. ^ "Khronos выпускает спецификацию OpenCL 1.2". Khronos Group. 15 ноября 2011 г. Получено 23 июня 2015 г.
  54. ^ abc "Спецификация OpenCL 1.2" (PDF) . Khronos Group . Получено 23 июня 2015 г. .
  55. ^ "Khronos завершает спецификацию OpenCL 2.0 для гетерогенных вычислений". Khronos Group. 18 ноября 2013 г. Получено 10 февраля 2014 г.
  56. ^ "Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования". Khronos Group. 16 ноября 2015 г. Получено 16 ноября 2015 г.
  57. ^ "Khronos объявляет OpenCL 2.1: C++ приходит в OpenCL". AnandTech. 3 марта 2015 г. Получено 8 апреля 2015 г.
  58. ^ "Khronos выпускает предварительную спецификацию OpenCL 2.1 для публичного ознакомления". Khronos Group. 3 марта 2015 г. Получено 8 апреля 2015 г.
  59. ^ "Обзор OpenCL". Khronos Group. 21 июля 2013 г.
  60. ^ ab "Khronos выпускает предварительную спецификацию OpenCL 2.2 с языком ядра OpenCL C++ для параллельного программирования". Khronos Group . 18 апреля 2016 г.
  61. ^ Треветт, Нил (апрель 2016 г.). «OpenCL – A State of the Union» (PDF) . IWOCL . Вена : Khronos Group . Получено 2 января 2017 г.
  62. ^ "Khronos выпускает OpenCL 2.2 с SPIR-V 1.2". Khronos Group . 16 мая 2017 г.
  63. ^ ab "OpenCL 2.2 Maintenance Update Released". Группа Khronos . 14 мая 2018 г.
  64. ^ «OpenCL 3.0 обеспечивает большую гибкость, расширения асинхронного DMA». www.phoronix.com .
  65. ^ "Khronos Group выпускает OpenCL 3.0". 26 апреля 2020 г.
  66. ^ "Спецификация OpenCL" (PDF) . Рабочая группа Khronos OpenCL.
  67. ^ Треветт, Нил (2021). «State of the Union: OpenCL Working Group» (PDF) . стр. 9.
  68. ^ «Использование расширений семафора и общего доступа к памяти для взаимодействия Vulkan с NVIDIA OpenCL». 24 февраля 2022 г.
  69. ^ «OpenCL 3.0.14 выпущен с новым расширением для буфера команд для нескольких устройств».
  70. ^ "Breaking: OpenCL Merging Roadmap into Vulkan | PC Perspective". www.pcper.com . Архивировано из оригинала 1 ноября 2017 г. . Получено 17 мая 2017 г. .
  71. ^ «SIGGRAPH 2018: OpenCL-Next обретает форму, Vulkan продолжает развиваться – Phoronix». www.phoronix.com .
  72. ^ «Обновление Vulkan SIGGRAPH 2019» (PDF) .
  73. ^ Треветт, Нил (23 мая 2019 г.). «Обзор Khronos и OpenCL, семинар EVS, 19 мая» (PDF) . Группа Khronos .
  74. ^ "Спецификация OpenCL ICD" . Получено 23 июня 2015 г.
  75. ^ "Запись Apple на странице LLVM Users" . Получено 29 августа 2009 г. .
  76. ^ "Запись Nvidia на странице пользователей LLVM" . Получено 6 августа 2009 г.
  77. ^ "Запись Rapidmind на странице пользователей LLVM" . Получено 1 октября 2009 г.
  78. ^ "Запись в блоге Зака ​​Русина о реализации OpenCL в Gallium3D". Февраль 2009 г. Получено 1 октября 2009 г.
  79. ^ "GalliumCompute". dri.freedesktop.org . Получено 23 июня 2015 г. .
  80. ^ «Обновление статуса Clover» (PDF) .
  81. ^ "mesa/mesa – Библиотека 3D-графики Mesa". cgit.freedesktop.org .
  82. ^ "Gallium Clover With SPIR-V & NIR Opening Up New Compute Options Inside Mesa – Phoronix". www.phoronix.com . Архивировано из оригинала 22 октября 2020 г. . Получено 13 декабря 2018 г. .
  83. ^ Кларк, Роб; Хербст, Кароль (2018). «Поддержка OpenCL внутри mesa через SPIR-V и NIR» (PDF) .
  84. ^ «Реализация Mesa 'Rusticl' теперь справляется с Darktable OpenCL».
  85. ^ «Rusticl от Mesa получил официальное соответствие OpenCL 3.0».
  86. ^ «Mesa 22.3 выпущена с RDNA3 Vulkan, Rusticl OpenCL, улучшенной графикой Intel Arc».
  87. ^ «Драйвер Rusticl OpenCL от Mesa почти готов с поддержкой графических процессоров AMD Radeon».
  88. ^ «Реализация Rusticl OpenCL от Mesa может превзойти вычислительный стек Radeon ROCm».
  89. ^ «Состояние Windows на Arm64: перспектива высокого уровня». Chips and Cheese . 13 марта 2022 г. Получено 23 октября 2023 г.
  90. ^ "Введение в OpenCL и OpenGL в DirectX". Collabora | Open Source Consulting . Получено 23 октября 2023 г.
  91. ^ "Глубокое погружение в OpenGL через слои DirectX". Collabora | Open Source Consulting . Получено 23 октября 2023 г.
  92. ^ Ларабель, Майкл (10 января 2013 г.). «Beignet: OpenCL/GPGPU приходит для Ivy Bridge на Linux». Phoronix .
  93. ^ Ларабель, Майкл (16 апреля 2013 г.). «Больше критики в адрес Beignet OpenCL от Intel». Phoronix .
  94. ^ Ларабель, Майкл (24 декабря 2013 г.). «Intel Beignet OpenCL все еще медленно выпекается». Phoronix .
  95. ^ "Бенье". freedesktop.org.
  96. ^ "beignet – Библиотека Beignet OpenCL для Intel Ivy Bridge и более новых графических процессоров". cgit.freedesktop.org .
  97. ^ «Intel представляет Beignet на Android для вычислений OpenCL – Phoronix». www.phoronix.com .
  98. ^ "01.org Intel Open Source – Compute Runtime". 7 февраля 2018 г.
  99. ^ "NEO GitHub README". GitHub . 21 марта 2019 г.
  100. ^ "ROCm". GitHub . Архивировано из оригинала 8 октября 2016 года.
  101. ^ "RadeonOpenCompute/ROCm: ROCm – платформа с открытым исходным кодом для высокопроизводительных вычислений и сверхмасштабных вычислений на GPU". GitHub. 21 марта 2019 г.
  102. ^ «Хороший обзор вычислительного стека ROCm Linux – Phoronix». www.phoronix.com .
  103. ^ "XDC Lightning.pdf". Google Docs .
  104. ^ "Официально выпущен Radeon ROCm 2.0 с поддержкой OpenCL 2.0, TensorFlow 1.12, Vega 48-bit VA – Phoronix". www.phoronix.com .
  105. ^ «Использование Radeon ROCm 2.0 OpenCL для сравнительного тестирования – Phoronix». www.phoronix.com .
  106. ^ https://github.com/RadeonOpenCompute/ROCm/blob/master/AMD_ROCm_Release_Notes_v3.3.pdf [ мертвая ссылка ]
  107. ^ «Radeon ROCm 3.5 выпущен с новыми функциями, но по-прежнему без поддержки Navi – Phoronix».
  108. ^ «Выпущен Radeon ROCm 3.10 с улучшениями инструментов центра обработки данных и новыми API – Phoronix».
  109. ^ «AMD запускает Arcturus как Instinct MI100, Radeon ROCm 4.0 – Phoronix».
  110. ^ «Добро пожаловать в платформу AMD ROCm™ — документация ROCm 1.0.0».
  111. ^ "Главная". docs.amd.com .
  112. ^ «Документация AMD – Портал».
  113. ^ Яаскеляйнен, Пекка; Санчес де ла Лама, Карлос; Шнеттер, Эрик; Райскила, Калле; Такала, Ярмо; Берг, Хейкки (2016). «pocl: портативная реализация OpenCL». Международный Дж. Параллельное программирование . 43 (5): 752–785. arXiv : 1611.07083 . Бибкод : 2016arXiv161107083J. дои : 10.1007/s10766-014-0320-y. S2CID  9905244.
  114. ^ abc "домашняя страница pocl". покл .
  115. ^ «GitHub – pocl/pocl: pocl: Портативный компьютерный язык» . 14 марта 2019 г. – через GitHub.
  116. ^ "Состояние реализации поддержки HSA по состоянию на 17.05.2016 — Документация Portable Computing Language (pocl) 1.3-pre". portablecl.org .
  117. ^ "Домашняя страница PoCL".
  118. ^ "Домашняя страница PoCL".
  119. ^ "Домашняя страница PoCL".
  120. ^ "POCL 1.6-RC1 выпущен с лучшей производительностью CUDA – Phoronix". Архивировано из оригинала 17 января 2021 г. Получено 3 декабря 2020 г.
  121. ^ Бауманн, Тобиас; Ноак, Маттиас; Штайнке, Томас (2021). «Оценка производительности и улучшения реализации PoCL с открытым исходным кодом OpenCL на процессорах Intel» (PDF) . стр. 51.
  122. ^ "Домашняя страница PoCL".
  123. ^ "Домашняя страница PoCL".
  124. ^ "Домашняя страница PoCL".
  125. ^ "Домашняя страница PoCL".
  126. ^ "О нас". Git.Linaro.org .
  127. ^ Gall, T.; Pitney, G. (6 марта 2014 г.). "LCA14-412: GPGPU на ARM SoC" (PDF) . Amazon Web Services . Архивировано из оригинала (PDF) 26 июля 2020 г. . Получено 22 января 2017 г. .
  128. ^ "zuzuf/freeocl". GitHub . Получено 13 апреля 2017 г. .
  129. ^ Чжан, Пэн; Фан, Цзяньбинь; Ян, Цаньцюнь; Тан, Тао; Хуан, Чунь; Ван, Чжэн (2018). MOCL: Эффективная реализация OpenCL для архитектуры Matrix-2000 (PDF) . Труды Международной конференции по вычислительным рубежам. doi :10.1145/3203217.3203244.
  130. ^ "Статус". GitHub . 16 марта 2022 г.
  131. ^ "OpenCL Demo, AMD CPU". YouTube . 10 декабря 2008 г. Получено 28 марта 2009 г.
  132. ^ "OpenCL Demo, Nvidia GPU". YouTube . 10 декабря 2008 г. Получено 28 марта 2009 г.
  133. ^ "Imagination Technologies запускает передовое, высокоэффективное семейство многопроцессорных графических IP-устройств POWERVR SGX543MP". Imagination Technologies. 19 марта 2009 г. Архивировано из оригинала 3 апреля 2014 г. Получено 30 января 2011 г.
  134. ^ "AMD и Havok demo OpenCL accelerationed physics". PC Perspective. 26 марта 2009 г. Архивировано из оригинала 5 апреля 2009 г. Получено 28 марта 2009 г.
  135. ^ "Nvidia выпускает драйвер OpenCL для разработчиков". Nvidia. 20 апреля 2009 г. Архивировано из оригинала 4 февраля 2012 г. Получено 27 апреля 2009 г.
  136. ^ "AMD делает обратный GPGPU, анонсирует OpenCL SDK для x86". Ars Technica. 5 августа 2009 г. Получено 6 августа 2009 г.[ постоянная мертвая ссылка ]
  137. Moren, Dan; Snell, Jason (8 июня 2009 г.). "Live Update: WWDC 2009 Keynote". MacWorld.com . MacWorld . Получено 12 июня 2009 г. .
  138. ^ "ATI Stream Software Development Kit (SDK) v2.0 Beta Program". Архивировано из оригинала 9 августа 2009 г. Получено 14 октября 2009 г.
  139. ^ "S3 Graphics выпустила встроенный графический процессор Chrome 5400E". Архивировано из оригинала 2 декабря 2009 г. Получено 27 октября 2009 г.
  140. ^ "VIA представляет усовершенствованный графический процессор VN1000". Архивировано из оригинала 15 декабря 2009 г. Получено 10 декабря 2009 г.
  141. ^ "ATI Stream SDK v2.0 с поддержкой OpenCL 1.0". Архивировано из оригинала 1 ноября 2009 г. Получено 23 октября 2009 г.
  142. ^ "OpenCL". ZiiLABS . Получено 23 июня 2015 г.
  143. ^ "Intel раскрывает новые технические подробности Sandy Bridge". Архивировано из оригинала 31 октября 2013 г. Получено 13 сентября 2010 г.
  144. ^ http://reference.wolfram.com/mathematica/OpenCLLink/tutorial/Overview.html [ пустой URL ]
  145. ^ "WebCL related stories". Khronos Group . Получено 23 июня 2015 г.
  146. ^ "Khronos Releases Final WebGL 1.0 Specification". Khronos Group. Архивировано из оригинала 9 июля 2015 г. Получено 23 июня 2015 г.
  147. ^ "Разработчик IBM". developer.ibm.com .
  148. ^ «Добро пожаловать в Wikis». www.ibm.com . 20 октября 2009 г.
  149. ^ "Nokia Research выпускает прототип WebCL". Khronos Group. 4 мая 2011 г. Архивировано из оригинала 5 декабря 2020 г. Получено 23 июня 2015 г.
  150. ^ KamathK, Sharath. "Samsung's WebCL Prototype for WebKit". Github.com. Архивировано из оригинала 18 февраля 2015 г. Получено 23 июня 2015 г.
  151. ^ "AMD открывает заслонку производительности APU с обновленной разработкой программного обеспечения OpenCL". Amd.com. 8 августа 2011 г. Получено 16 июня 2013 г.
  152. ^ "AMD APP SDK v2.6". Forums.amd.com. 13 марта 2015 г. Получено 23 июня 2015 г.[ мертвая ссылка ]
  153. ^ "Portland Group анонсирует OpenCL-компилятор для ST-Ericsson ARM-Based NovaThor SoCs" . Получено 4 мая 2012 г.
  154. ^ "WebCL Latest Spec". Khronos Group . 7 ноября 2013 г. Архивировано из оригинала 1 августа 2014 г. Получено 23 июня 2015 г.
  155. ^ "Altera открывает мир ПЛИС программистам с широкой доступностью SDK и готовых плат для OpenCL". Altera.com. Архивировано из оригинала 9 января 2014 г. Получено 9 января 2014 г.
  156. ^ "Altera SDK для OpenCL — первый в отрасли, достигший соответствия Khronos для FPGA". Altera.com. Архивировано из оригинала 9 января 2014 г. Получено 9 января 2014 г.
  157. ^ "Khronos завершает спецификацию OpenCL 2.0 для гетерогенных вычислений". Khronos Group. 18 ноября 2013 г. Получено 23 июня 2015 г.
  158. ^ "WebCL 1.0 Press Release". Khronos Group. 19 марта 2014 г. Получено 23 июня 2015 г.
  159. ^ "Спецификация WebCL 1.0". Khronos Group. 14 марта 2014 г. Получено 23 июня 2015 г.
  160. ^ "Intel OpenCL 2.0 Driver". Архивировано из оригинала 17 сентября 2014 г. Получено 14 октября 2014 г.
  161. ^ "AMD OpenCL 2.0 Driver". Support.AMD.com . 17 июня 2015 г. . Получено 23 июня 2015 г. .
  162. ^ "Среда разработки Xilinx SDAccel для OpenCL, C и C++ получила соответствие Khronos – новости khronos.org". Группа Khronos . Получено 26 июня 2017 г.
  163. ^ "Выпуск 349 графических драйверов для Windows, версия 350.12" (PDF) . 13 апреля 2015 г. . Получено 4 февраля 2016 г. .
  164. ^ "AMD APP SDK 3.0 Released". Developer.AMD.com . 26 августа 2015 г. . Получено 11 сентября 2015 г. .
  165. ^ "Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования". Khronos Group . 16 ноября 2015 г.
  166. ^ "Что нового? Intel® SDK для приложений OpenCL™ 2016, R3". Intel Software.
  167. ^ "Драйверы NVIDIA 378.66 для Windows предлагают поддержку оценки OpenCL 2.0". Khronos Group . 17 февраля 2017 г. Архивировано из оригинала 6 августа 2020 г. Получено 17 марта 2017 г.
  168. ^ Шуппе, Якуб (22 февраля 2017 г.). «NVIDIA обеспечивает поддержку бета-версии OpenCL 2.0».
  169. ^ Szuppe, Jakub (6 марта 2017 г.). «Бета-поддержка NVIDIA для OpenCL 2.0 работает и на Linux».
  170. ^ "Группа Хронос". Группа «Хронос» . 21 марта 2019 г.
  171. ^ "GitHub – RadeonOpenCompute/ROCm на roc-3.5.0". GitHub .
  172. ^ ab «NVIDIA теперь совместима с OpenCL 3.0». 12 апреля 2021 г.
  173. ^ abc "Группа Хронос". Группа «Хронос» . 12 декабря 2022 г. . Проверено 12 декабря 2022 г.
  174. ^ "Rusticl от Mesa достиг официального соответствия OpenCL 3.0". www.phoronix.com . Получено 12 декабря 2022 г. .
  175. ^ "The Khronos Group". The Khronos Group . 20 августа 2019 г. . Получено 20 августа 2019 г. .
  176. ^ "KhronosGroup/OpenCL-CTL: Тесты соответствия OpenCL". GitHub. 21 марта 2019 г.
  177. ^ "OpenCL и AMD APP SDK". AMD Developer Central . developer.amd.com. Архивировано из оригинала 4 августа 2011 г. Получено 11 августа 2011 г.
  178. ^ "О Intel OpenCL SDK 1.1". software.intel.com . intel.com . Получено 11 августа 2011 г. .
  179. ^ "Intel® SDK для приложений OpenCL™ – Заметки о выпуске". software.intel.com . 14 марта 2019 г.
  180. ^ "Поддержка продукта" . Получено 11 августа 2011 г.
  181. ^ "Intel OpenCL SDK – Release Notes". Архивировано из оригинала 17 июля 2011 г. Получено 11 августа 2011 г.
  182. ^ "Анонс OpenCL Development Kit для Linux на Power v0.3". IBM . Получено 11 августа 2011 г. .
  183. ^ "IBM выпускает OpenCL Development Kit для Linux на Power v0.3 – доступна версия, соответствующая OpenCL 1.1". OpenCL Lounge . ibm.com . Получено 11 августа 2011 г. .
  184. ^ "IBM выпускает OpenCL Common Runtime для Linux на архитектуре x86". IBM . 20 октября 2009 г. . Получено 10 сентября 2011 г. .
  185. ^ "OpenCL и AMD APP SDK". AMD Developer Central . developer.amd.com. Архивировано из оригинала 6 сентября 2011 г. Получено 10 сентября 2011 г.
  186. ^ "Nvidia выпускает драйвер OpenCL". 22 апреля 2009 г. Получено 11 августа 2011 г.
  187. ^ "clinfo by Simon Leblanc". GitHub . Получено 27 января 2017 г. .
  188. ^ "Клинфо Обломова". Гитхаб . Проверено 27 января 2017 г.
  189. ^ "clinfo: openCL INFOrmation". 2 апреля 2013 г. Получено 27 января 2017 г.
  190. ^ "Khronos Products". Группа Khronos . Получено 15 мая 2017 г.
  191. ^ "OpenCL-CTS/Test_conformance на главной · KhronosGroup/OpenCL-CTS". GitHub .
  192. ^ "Проблемы · KhronosGroup/OpenCL-CTS". GitHub .
  193. ^ «Intel Compute-Runtime 20.43.18277 обеспечивает поддержку Alder Lake».
  194. ^ "compute-runtime". 01.org . 7 февраля 2018 г.
  195. ^ 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. ISBN 978-1-4577-1336-1.
  196. ^ Ду, Пэн; Вебер, Рик; Лусчек, Петр; Томов, Станимир; Петерсон, Грегори; Донгарра, Джек (2012). «От CUDA к OpenCL: на пути к производительно-переносимому решению для многоплатформенного программирования GPU». Параллельные вычисления . 38 (8): 391–407. CiteSeerX 10.1.1.193.7712 . doi :10.1016/j.parco.2011.10.002. 
  197. ^ Дольбо, Ромен; Боден, Франсуа; де Вердьер, Гийом Колен (7 сентября 2013 г.). «Один OpenCL, чтобы править всеми?». 2013 IEEE 6-й Международный семинар по многоядерным вычислительным системам (MuCoCoS) . стр. 1–6. doi :10.1109/MuCoCoS.2013.6633603. ISBN 978-1-4799-1010-6. S2CID  225784.
  198. ^ Карими, Камран; Диксон, Нил Г.; Хамзе, Фирас (2011). «Сравнение производительности CUDA и OpenCL». arXiv : 1005.2581v3 [cs.PF].
  199. ^ Обзор методов гетерогенных вычислений на базе CPU-GPU, ACM Computing Surveys, 2015.
  200. ^ 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 . ISBN 978-3-642-19860-1.
  201. ^ «Серия Radeon RX 6800 демонстрирует превосходную производительность OpenCL на базе ROCm в Linux». www.phoronix.com .

Внешние ссылки