stringtranslate.com

OpenCL

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

OpenCL — это открытый стандарт, поддерживаемый некоммерческим технологическим консорциумом Khronos Group . Соответствующие реализации доступны от Altera , AMD , ARM , Creative , IBM , Imagination , Intel , Nvidia , Qualcomm , Samsung , Vivante , Xilinx и ZiiLABS . [8] [9]

Обзор

OpenCL рассматривает вычислительную систему как состоящую из ряда вычислительных устройств , которые могут быть центральными процессорами (ЦП) или «ускорителями», такими как графические процессоры (ГП), подключенными к главному процессору (ЦП). Он определяет C-подобный язык для написания программ. Функции, выполняемые на устройстве OpenCL, называются « ядрами ». [10] : 17  Одно вычислительное устройство обычно состоит из нескольких вычислительных блоков , которые, в свою очередь, содержат множество процессорных элементов (PE). Одно выполнение ядра может выполняться на всех или многих PE параллельно. То, как вычислительное устройство подразделяется на вычислительные блоки и PE, зависит от поставщика; вычислительный блок можно рассматривать как « ядро », но понятие ядра трудно определить для всех типов устройств, поддерживаемых 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] как независимый от цели способ передачи ядер между интерфейсным компилятором и серверная часть OpenCL.

Совсем недавно группа Khronos ратифицировала SYCL , [18] модель программирования более высокого уровня для OpenCL как eDSL с одним исходным кодом , основанную на чистом C++17, для повышения производительности программирования . Люди, интересующиеся ядрами C++, но не стилем программирования с одним исходным кодом SYCL, могут использовать функции C++ с исходными кодами вычислительного ядра, написанными на языке «C++ for OpenCL». [19]

Иерархия памяти

OpenCL определяет четырехуровневую иерархию памяти для вычислительного устройства: [13]

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

Устройства могут совместно использовать или не использовать память с центральным процессором. [13] API хоста предоставляет дескрипторы буферов памяти устройства и функции для передачи данных туда и обратно между хостом и устройствами.

Язык ядра OpenCL

Язык программирования, который используется для написания вычислительных ядер , называется языком ядра. OpenCL использует языки на основе C / C++ для определения вычислений ядра, выполняемых на устройстве, с некоторыми ограничениями и дополнениями для облегчения эффективного сопоставления с гетерогенными аппаратными ресурсами ускорителей. Традиционно OpenCL C использовался для программирования ускорителей в стандарте OpenCL, позже был разработан язык ядра C++ для OpenCL, который унаследовал всю функциональность от OpenCL C, но позволил использовать возможности C++ в исходных текстах ядра.

OpenCL язык C

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-мерные и 3-мерные типы изображений. [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 [ я ] знак равно сумма ; }                                                  

Функция ядра matvec при каждом вызове вычисляет скалярное произведение одной строки матрицы A и вектора x :

Чтобы расширить это до полного умножения матрицы на вектор, среда выполнения OpenCL сопоставляет ядро ​​со строками матрицы. На стороне хоста это делает функция clEnqueueNDRangeKernel ; в качестве аргументов он принимает ядро, которое необходимо выполнить, его аргументы и количество рабочих элементов, соответствующее количеству строк в матрице A.

Пример: вычисление БПФ

В этом примере загрузится реализация быстрого преобразования Фурье (БПФ) и выполнится ее. Реализация показана ниже. [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" ;// Ищем доступные графические процессорыconst 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 );    // создаем контекст вычислений с устройством графического процессораcl_context 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 ( context , 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 ( контекст , 1 , ( const char ** ) & KernelSource , NULL , NULL );          // создаем исполняемый файл вычислительной программыclBuildProgram ( программа , 0 , NULL , NULL , NULL , NULL );     // создаем вычислительное ядроcl_kernel kernel = clCreateKernel ( программа , «fft1D_1024» , NULL );     // устанавливаем значения аргументовsize_t local_work_size [ 1 ] = { 256 };     clSetKernelArg ( kernel , 0 , sizeof ( cl_mem ), ( void * ) & memobjs [ 0 ]);    clSetKernelArg ( kernel , 1 , sizeof ( cl_mem ), ( void * ) & memobjs [ 1 ]);    clSetKernelArg ( kernel , 2 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );       clSetKernelArg ( kernel , 3 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );       // создаем объект диапазона ND с размерами рабочего элемента и выполняем ядроsize_t global_work_size [ 1 ] = { 256 };     global_work_size [ 0 ] = NUM_ENTRIES ;  local_work_size [ 0 ] = 64 ; //Нвидиа: 192 или 256   clEnqueueNDRangeKernel ( очередь , ядро , 1 , NULL , global_work_size , local_work_size , 0 , NULL , NULL );        }

Фактический расчет внутри файла «fft1D_1024_kernel_src.cl» (на основе «Подгонка БПФ к архитектуре G80»): [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 [ 16 ];                              // начальный индекс данных в/из глобальной памяти in = in + blockIdx ; выход = выход + BlockIdx ;           globalLoads ( данные , в , 64 ); // объединенные глобальные чтения fftRadix16Pass ( data ); // на месте передается система счисления radix-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 ); // функция счисления-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. Это открывает плавный путь перехода к функциональности C++ для разработчиков кода ядра OpenCL, поскольку они могут продолжать использовать знакомый процесс программирования и даже инструменты в качестве а также использовать существующие расширения и библиотеки, доступные для 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: виртуальные функции, оператор динамического приведения , операторы создания / удаления без размещения , исключения, указатель на функции-члены, ссылки на функции, стандартные библиотеки C++. [33] C++ для OpenCL расширяет концепцию отдельных областей памяти ( адресных пространств ) из OpenCL C на возможности C++ — функциональные приведения, шаблоны, члены классов, ссылки, лямбда-функции и операторы. Большинство функций C++ недоступны для функций ядра, например, перегрузка или шаблонизация, произвольное расположение классов в типе параметра. [33]

Пример: арифметика комплексных чисел

Следующий фрагмент кода иллюстрирует, как ядра с арифметикой комплексных чисел могут быть реализованы на C++ для языка OpenCL с удобным использованием функций C++.

// Определим класс Complex, который может выполнять вычисления комплексных чисел с // различной точностью, когда используются разные типы T - double, float, half. шаблон < имя типа T > class complex_t { T m_re ; // Реальный компонент. Т м_им ; // Мнимая компонента.         public : complex_t ( T re , T im ) : m_re { re }, m_im { im } {}; // Определить оператор для умножения комплексных чисел. complex_t оператор * ( const complex_t и другое ) const { return { m_re * другое . m_re - m_im * другое . м_им , м_ре * другое . m_im + m_im * другое . м_ре }; } T get_re () const { return m_re ; } T get_im () const { return m_im ; } };                                             // Вспомогательная функция для вычисления умножения комплексных чисел, считанных из // входного буфера, и сохранения вычисленного результата в выходном буфере. шаблон < имя типа T > void Compute_helper ( __global T * in , __global T * out ) { auto idx = get_global_id ( 0 ); // Каждый рабочий элемент использует 4 последовательных элемента из входного буфера // - по два для каждого комплексного числа. автоматическое смещение = idx * 4 ; auto num1 = complex_t { в [ смещение ], в [ смещение + 1 ]}; auto num2 = complex_t { в [ смещение + 2 ], в [ смещение + 3 ]}; // Выполняем умножение комплексных чисел. автоматическое разрешение = число1 * число2 ; // Каждый рабочий элемент записывает 2 последовательных элемента в выходной буфер. выход [ idx * 2 ] = рез . получить_ре (); out [ idx * 2 + 1 ] = рез . получить_им (); }                                                         // Это ядро ​​используется для умножения комплексных чисел с одинарной точностью. __kernel void Compute_sp ( __global float * in , __global float * out ) { compute_helper ( in , out ); }          #ifdef cl_khr_fp16 // Это ядро ​​используется для умножения комплексных чисел с половинной точностью, если // оно поддерживается устройством. #pragma OPENCL EXTENSION cl_khr_fp16: включить __kernel void Compute_hp ( __global half * in , __global half * out ) { Compute_helper ( in , out ); } #конециф           

Инструментарий и среда выполнения

Язык 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] из представителей компаний, занимающихся процессорами, графическими процессорами, встроенными процессорами и программным обеспечением. Эта группа работала в течение пяти месяцев, чтобы завершить технические детали спецификации OpenCL 1.0 к 18 ноября 2008 г. [42] Эта техническая спецификация была рассмотрена участниками Khronos и одобрена для публичного выпуска 8 декабря 2008 г. [43]

ОпенCL 1.0

OpenCL 1.0 выпущен вместе с Mac OS X Snow Leopard 28 августа 2009 года. Согласно пресс-релизу Apple: [44]

Snow Leopard дополнительно расширяет поддержку современного оборудования с помощью Open Computing Language (OpenCL), который позволяет любому приложению использовать огромные гигафлопс вычислительной мощности графического процессора, ранее доступной только графическим приложениям. OpenCL основан на языке программирования C и был предложен в качестве открытого стандарта.

AMD решила поддерживать OpenCL вместо устаревшего Close to Metal в своем фреймворке Stream . [45] [46] RapidMind объявили о внедрении OpenCL в свою платформу разработки для поддержки графических процессоров от нескольких поставщиков с одним интерфейсом. [47] 9 декабря 2008 года Nvidia объявила о своем намерении добавить полную поддержку спецификации OpenCL 1.0 в свой набор инструментов для вычислений на графическом процессоре. [48] ​​30 октября 2009 года IBM выпустила свою первую реализацию OpenCL как часть компиляторов XL. [49]

Ускорение вычислений с коэффициентом до 1000 возможно с помощью OpenCL в графических картах по сравнению с обычным процессором. [50] Некоторые важные функции следующей версии OpenCL являются необязательными в версии 1.0, например, операции с двойной или половинной точностью. [51]

ОпенCL 1.1

OpenCL 1.1 был ратифицирован Khronos Group 14 июня 2010 г. [52] и добавляет значительные функциональные возможности для повышения гибкости, функциональности и производительности параллельного программирования, включая:

ОпенCL 1.2

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

ОпенCL 2.0

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

ОпенCL 2.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]

ОпенCL 2.2

OpenCL 2.2 включает язык ядра OpenCL C++ в базовую спецификацию, что значительно повышает производительность параллельного программирования. [59] [60] [61] Оно было выпущено 16 мая 2017 года. [62] В мае 2018 года выпущено техническое обновление с исправлениями ошибок. [63]

ОпенCL 3.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 и расширенная отладочная информация SPIR-V. OpenCL также рассматривает загрузчик и уровни, подобные Vulkan, а также «гибкий профиль» для гибкого развертывания на нескольких типах ускорителей. [73]

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

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

OpenCL состоит из набора заголовков и общего объекта , загружаемого во время выполнения. Устанавливаемый клиентский драйвер (ICD) должен быть установлен на платформе для каждого класса поставщиков, которого должна поддерживать среда выполнения. То есть, например, для поддержки устройств Nvidia на платформе Linux необходимо установить ICD Nvidia так, чтобы среда выполнения 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 Project, [79] который основан на работе проекта Mesa для поддержки нескольких платформ. Раньше это было известно как CLOVER., [80] фактическая разработка: в основном поддержка запуска неполной среды с реальными LLVM и CLANG, некоторые новые функции, такие как fp16 в 17.3, [81] Целевая полная версия 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 Benchmark. [88] Mesa 23.1 поддерживает официальный RustiCL. В Mesa 23.2 поддержка важного fp64 находится на экспериментальном уровне.
В Windows 11 от Microsoft на Arm добавлена ​​поддержка 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] В Beignet добавлена ​​поддержка Android. [97] Фактические цели разработки: поддержка только 1.2 и 2.0, путь к OpenCL 2.1, 2.2, 3.0 пройден в NEO.
НЕО
Реализация Intel для аппаратного обеспечения Broadwell 8-го поколения + 9-го поколения, выпущенного в 2018 году. [98] Этот драйвер заменяет реализацию Beignet для поддерживаемых платформ (не старше 6.gen на Haswell). NEO обеспечивает поддержку OpenCL 2.1 на платформах Core и OpenCL 1.2 на платформах Atom. [99] В 2020 году также будут поддерживаться графические процессоры Gen 11 Ice Lake и Gen 12 Tiger Lake. Новый OpenCL 3.0 доступен для Alder Lake, Tiger Lake и Broadwell с версией 20.41+. Теперь он включает в себя дополнительные функции OpenCL 2.0, 2.1 и некоторые функции 2.2.
РПЦм
ROCm (Radeon Open Compute) , созданный как часть AMD GPUOpen , представляет собой проект Linux с открытым исходным кодом, построенный на OpenCL 1.2 с поддержкой языка 2.0. Система совместима со всеми современными процессорами и APU 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. [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- инструкциями, FPGA , Movidius Myriad 2 , Adapteva Epiphany и DSP .

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

Чтобы быть официально соответствующей, реализация должна пройти набор тестов на соответствие Khronos (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 Test Suite готов, с возможностью обновления драйверов всего оборудования с поддержкой версий 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 позволяет распределять рабочую нагрузку между ЦП и ГП, выполняя одни и те же программы, означает, что программисты могут использовать оба варианта, разделяя работу между устройствами. [199] Это приводит к проблеме принятия решения о том, как разделить работу, поскольку относительная скорость операций различается между устройствами. Для решения этой проблемы было предложено машинное обучение : Греве и О'Бойл описывают систему машин опорных векторов, обученных функциям времени компиляции программы, которые могут решать проблему разделения устройств статически, без фактического запуска программ для измерения их производительности. [200]

При сравнении реальных видеокарт серий AMD RDNA 2 и Nvidia RTX результаты OpenCL-Tests неопределенны. Возможное увеличение производительности за счет использования Nvidia CUDA или OptiX не тестировалось. [201]

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

Рекомендации

  1. ^ «Спецификация OpenCL».
  2. ^ «Устройства Android с поддержкой OpenCL» . Гугл документы . МассивОгонь . Проверено 28 апреля 2015 г.
  3. ^ «Графика FreeBSD/OpenCL». FreeBSD . Проверено 23 декабря 2015 г.
  4. ^ abcde «Соответствующие продукты». Группа компаний «Хронос» . Проверено 9 мая 2015 г.
  5. Сочацкий, Бартош (19 июля 2019 г.). «Спецификация OpenCL C++ 1.0» (PDF) . Рабочая группа Khronos OpenCL . Проверено 19 июля 2019 г.
  6. ^ Мунши, Аафтаб; Хоуз, Ли; Сочаки, Барош (27 апреля 2020 г.). «Версия спецификации OpenCL C: 3.0. Версия документа: V3.0.7» (PDF) . Рабочая группа Khronos OpenCL. Архивировано из оригинала (PDF) 20 сентября 2020 г. Проверено 28 апреля 2021 г.
  7. ^ «C++ для OpenCL 1.0 и документация по языку программирования 2021» . Рабочая группа Khronos OpenCL. 20 декабря 2021 г. . Проверено 2 декабря 2022 г.
  8. ^ «Соответствующие компании». Группа компаний «Хронос» . Проверено 8 апреля 2015 г.
  9. Джанелли, Сильвия Э. (14 января 2015 г.). «Среда разработки Xilinx SDAccel для OpenCL, C и C++ соответствует требованиям Khronos». Пиар-новости . Ксилинкс . Проверено 27 апреля 2015 г.
  10. ^ Хоуз, Ли (11 ноября 2015 г.). «Версия спецификации OpenCL: 2.1 Версия документа: 23» (PDF) . Рабочая группа Khronos OpenCL . Проверено 16 ноября 2015 г.
  11. ^ аб Гастер, Бенедикт; Хоуз, Ли; Каэли, Дэвид Р .; Мистри, Перхаад; Шаа, Дана (2012). Гетерогенные вычисления с OpenCL: пересмотренная версия OpenCL 1.2 . Морган Кауфманн.
  12. ^ Томпсон, Джонатан; Шлахтер, Кристофер (2012). «Введение в модель программирования OpenCL» (PDF) . Лаборатория медиа-исследований Нью-Йоркского университета. Архивировано из оригинала (PDF) 6 июля 2015 года . Проверено 6 июля 2015 г.
  13. ^ abcd Stone, Джон Э.; Гохара, Дэвид; Ши, Гочин (2010). «OpenCL: стандарт параллельного программирования для гетерогенных вычислительных систем». Вычисления в науке и технике . 12 (3): 66–73. Бибкод : 2010CSE....12c..66S. дои : 10.1109/MCSE.2010.69. ПМЦ 2964860 . ПМИД  21037981. 
  14. ^ Клёкнер, Андреас; Пинто, Николас; Ли, Юнсуп; Катандзаро, Брайан; Иванов Павел; Фасих, Ахмед (2012). «PyCUDA и PyOpenCL: подход к генерации кода во время выполнения графического процессора на основе сценариев». Параллельные вычисления . 38 (3): 157–174. arXiv : 0911.3456 . doi :10.1016/j.parco.2011.09.001. S2CID  18928397.
  15. ^ «OpenCL — привязки открытого вычислительного языка» . Metacpan.org . Проверено 18 августа 2018 г.
  16. ^ «Привязка D для OpenCL». dlang.org . Проверено 29 июня 2021 г.
  17. ^ «SPIR - первый промежуточный язык открытого стандарта для параллельных вычислений и графики» . Группа компаний «Хронос» . 21 января 2014.
  18. ^ «SYCL - гетерогенное программирование на C ++ с одним исходным кодом для OpenCL» . Группа компаний «Хронос» . 21 января 2014 года. Архивировано из оригинала 18 января 2021 года . Проверено 24 октября 2016 г.
  19. ^ abc «C++ для OpenCL, OpenCL-Guide». Гитхаб . Проверено 18 апреля 2021 г.
  20. ^ abc Munshi, Аафтаб, изд. (2014). «Спецификация OpenCL C, версия 2.0» (PDF) . Проверено 24 июня 2014 г.
  21. ^ ab «Введение в программирование OpenCL 201005» (PDF) . АМД. стр. 89–90. Архивировано из оригинала (PDF) 16 мая 2011 года . Проверено 8 августа 2017 г.
  22. ^ «OpenCL» (PDF) . СИГГРАФ2008. 14 августа 2008 г. Архивировано из оригинала (PDF) 16 февраля 2012 г. . Проверено 14 августа 2008 г.
  23. ^ «Подгонка БПФ к архитектуре G80» (PDF) . Василий Волков и Брайан Казян, отчет о проекте CS258 Калифорнийского университета в Беркли. Май 2008 года . Проверено 14 ноября 2008 г.
  24. ^ "OpenCL_FFT". Яблоко. 26 июня 2012 года . Проверено 18 июня 2022 г.
  25. Треветт, Нил (28 апреля 2020 г.). «Объявления Хроноса и панельная дискуссия» (PDF) .
  26. ^ Стулова, Анастасия; Хикки, Нил; ван Хаастрегт, Свен; Антоньини, Марко; Пети, Кевин (27 апреля 2020 г.). «C++ для языка программирования OpenCL». Материалы международного семинара по OpenCL . IWOCL '20. Мюнхен, Германия: Ассоциация вычислительной техники. стр. 1–2. дои : 10.1145/3388333.3388647. ISBN 978-1-4503-7531-3. S2CID  216554183.
  27. ^ ab KhronosGroup/OpenCL-Docs, The Khronos Group, 16 апреля 2021 г. , получено 18 апреля 2021 г.
  28. ^ «Документация Clang Release 9, поддержка OpenCL» . Releases.llvm.org . Сентябрь 2019 года . Проверено 18 апреля 2021 г.
  29. ^ «Clang 9, Языковые расширения, OpenCL». Releases.llvm.org . Сентябрь 2019 года . Проверено 18 апреля 2021 г.
  30. ^ «Выпуск документации C++ для языка ядра OpenCL, версия 1.0, редакция 1 · KhronosGroup/OpenCL-Docs» . Гитхаб . декабрь 2020 года . Проверено 18 апреля 2021 г.
  31. ^ «Выпуск документации C++ для языка ядра OpenCL, версии 1.0 и 2021 · KhronosGroup/OpenCL-Docs» . Гитхаб . Декабрь 2021 года . Проверено 2 декабря 2022 г.
  32. ^ ab «Документация по языку программирования C++ для OpenCL 1.0». www.khronos.org . Проверено 18 апреля 2021 г.
  33. ^ abcd «Выпуск C++ для документации по языку ядра OpenCL, версия 1.0, редакция 2 · KhronosGroup/OpenCL-Docs». Гитхаб . Март 2021 года . Проверено 18 апреля 2021 г.
  34. ^ "cl_ext_cxx_for_opencl". www.khronos.org . Сентябрь 2020 года . Проверено 18 апреля 2021 г.
  35. ^ «Mali SDK, поддерживающий компиляцию ядер на C++ для OpenCL» . сообщество.arm.com . декабрь 2020 года . Проверено 18 апреля 2021 г.
  36. ^ «Руководство пользователя компилятора Clang — C++ для поддержки OpenCL» . clang.llvm.org . Проверено 18 апреля 2021 г.
  37. ^ «Руководство OpenCL, автономная компиляция исходных кодов ядра OpenCL» . Гитхаб . Проверено 18 апреля 2021 г.
  38. ^ «Руководство по OpenCL, Программирование ядер OpenCL» . Гитхаб . Проверено 18 апреля 2021 г.
  39. ^ ab Clspv — прототип компилятора подмножества вычислительных шейдеров OpenCL C для Vulkan: google/clspv, 17 августа 2019 г. , получено 20 августа 2019 г.
  40. Пети, Кевин (17 апреля 2021 г.), Экспериментальная реализация OpenCL на Vulkan , получено 18 апреля 2021 г.
  41. ^ «Хронос запускает инициативу в области гетерогенных вычислений» (пресс-релиз). Группа компаний «Хронос». 16 июня 2008 года. Архивировано из оригинала 20 июня 2008 года . Проверено 18 июня 2008 г.
  42. ^ «OpenCL рекламируется в Техасе» . МакВорлд. 20 ноября 2008 года . Проверено 12 июня 2009 г.
  43. ^ «Группа Khronos выпускает спецификацию OpenCL 1.0» (пресс-релиз). Группа компаний «Хронос». 8 декабря 2008 года . Проверено 4 декабря 2016 г.
  44. ^ «Apple представляет разработчикам Mac OS X Snow Leopard» (пресс-релиз). Apple Inc., 9 июня 2008 г. Архивировано из оригинала 18 марта 2012 г. . Проверено 9 июня 2008 г.
  45. ^ «AMD способствует принятию отраслевых стандартов в разработке программного обеспечения GPGPU» (пресс-релиз). АМД. 6 августа 2008 года . Проверено 14 августа 2008 г.
  46. ^ «AMD поддерживает OpenCL, Microsoft DirectX 11» . электронная неделя. 6 августа 2008 года. Архивировано из оригинала 19 марта 2012 года . Проверено 14 августа 2008 г.
  47. ^ «HPCWire: RapidMind использует проекты с открытым исходным кодом и стандартами» . HPCWire. 10 ноября 2008 года. Архивировано из оригинала 18 декабря 2008 года . Проверено 11 ноября 2008 г.
  48. ^ «Nvidia добавляет OpenCL в свой ведущий в отрасли набор инструментов для вычислений на графических процессорах» (пресс-релиз). Нвидиа. 9 декабря 2008 года . Проверено 10 декабря 2008 г.
  49. ^ «Комплект разработки OpenCL для Linux on Power» . АльфаВоркс. 30 октября 2009 года . Проверено 30 октября 2009 г.
  50. ^ «Стандарт Opencl – обзор | Темы ScienceDirect» . www.sciencedirect.com .
  51. ^ «Версия спецификации OpenCL: 1.0 Версия документа: 48» (PDF) . Рабочая группа Khronos OpenCL.
  52. ^ «Хронос стимулирует развитие стандарта параллельных вычислений с выпуском спецификации OpenCL 1.1» . Архивировано из оригинала 2 марта 2016 года . Проверено 24 февраля 2016 г.
  53. ^ «Хронос выпускает спецификацию OpenCL 1.2» . Группа компаний «Хронос». 15 ноября 2011 года . Проверено 23 июня 2015 г.
  54. ^ abc «Спецификация OpenCL 1.2» (PDF) . Группа компаний «Хронос» . Проверено 23 июня 2015 г.
  55. ^ «Хронос завершает разработку спецификации OpenCL 2.0 для гетерогенных вычислений» . Группа компаний «Хронос». 18 ноября 2013 года . Проверено 10 февраля 2014 г.
  56. ^ «Хронос выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования» . Группа компаний «Хронос». 16 ноября 2015 года . Проверено 16 ноября 2015 г.
  57. ^ «Хронос объявляет об OpenCL 2.1: C++ переходит в OpenCL» . АнандТех. 3 марта 2015 года . Проверено 8 апреля 2015 г.
  58. ^ «Хронос выпускает предварительную спецификацию OpenCL 2.1 для публичного рассмотрения» . Группа компаний «Хронос». 3 марта 2015 года . Проверено 8 апреля 2015 г.
  59. ^ «Обзор OpenCL» . Группа компаний «Хронос». 21 июля 2013 г.
  60. ^ ab «Khronos выпускает предварительную спецификацию OpenCL 2.2 с языком ядра OpenCL C++ для параллельного программирования». Группа компаний «Хронос» . 18 апреля 2016 г.
  61. ^ Треветт, Нил (апрель 2016 г.). «OpenCL – состояние страны» (PDF) . ИВОКЛ . Вена : Группа Хронос . Проверено 2 января 2017 г.
  62. ^ «Хронос выпускает OpenCL 2.2 с SPIR-V 1.2» . Группа компаний «Хронос» . 16 мая 2017 г.
  63. ^ ab «Выпущено техническое обновление OpenCL 2.2» . Группа «Хронос» . 14 мая 2018 г.
  64. ^ «OpenCL 3.0 обеспечивает большую гибкость, асинхронные расширения DMA» . www.phoronix.com .
  65. ^ «Группа Хронос выпускает OpenCL 3.0» . 26 апреля 2020 г.
  66. ^ «Спецификация OpenCL» (PDF) . Рабочая группа Khronos OpenCL.
  67. ^ https://www.iwocl.org/wp-content/uploads/k03-iwocl-syclcon-2021-trevett-updated.mp4.pdf [ пустой URL-адрес PDF ]
  68. ^ «Использование расширений семафора и совместного использования памяти для взаимодействия Vulkan с NVIDIA OpenCL» . 24 февраля 2022 г.
  69. ^ «Выпущен OpenCL 3.0.14 с новым расширением для нескольких устройств с командным буфером» .
  70. ^ «Срочное: Дорожная карта слияния OpenCL с Vulkan | Перспектива ПК» . 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) . Группа компаний «Хронос» .
  74. ^ «Спецификация OpenCL ICD» . Проверено 23 июня 2015 г.
  75. ^ «Запись Apple на странице пользователей LLVM» . Проверено 29 августа 2009 г.
  76. ^ «Запись Nvidia на странице пользователей LLVM» . Проверено 6 августа 2009 г.
  77. ^ «Запись Rapidmind на странице пользователей LLVM» . Проверено 1 октября 2009 г.
  78. ^ «Сообщение в блоге Зака ​​Русина о реализации Gallium3D OpenCL» . Февраль 2009 года . Проверено 1 октября 2009 г.
  79. ^ "ГаллийКомпьютер". dri.freedesktop.org . Проверено 23 июня 2015 г.
  80. ^ «Обновление статуса клевера» (PDF) .
  81. ^ "mesa/mesa - Библиотека 3D-графики Mesa" . cgit.freedesktop.org .
  82. ^ «Галлиевый клевер с SPIR-V и NIR открывают новые возможности вычислений внутри Месы - Фороникс» . www.phoronix.com . Архивировано из оригинала 22 октября 2020 года . Проверено 13 декабря 2018 г.
  83. ^ Кларк, Роб; Хербст, Кароль (2018). «Поддержка OpenCL внутри Mesa через SPIR-V и NIR» (PDF) .
  84. ^ «Реализация Rusticl от Mesa теперь позволяет обрабатывать Darktable OpenCL» .
  85. ^ «Рустикл от 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: общий взгляд». Чипсы и сыр . 13 марта 2022 г. Проверено 23 октября 2023 г.
  90. ^ «Представляем OpenCL и OpenGL в DirectX». Сотрудничество | Консультации по открытому исходному коду . Проверено 23 октября 2023 г.
  91. ^ «Глубокое погружение в OpenGL поверх слоев DirectX». Сотрудничество | Консультации по открытому исходному коду . Проверено 23 октября 2023 г.
  92. Ларабель, Майкл (10 января 2013 г.). «Бенье: OpenCL/GPGPU появится для Ivy Bridge в Linux». Фороникс .
  93. Ларабель, Майкл (16 апреля 2013 г.). «Больше критики поступает в адрес Beignet OpenCL от Intel». Фороникс .
  94. Ларабель, Майкл (24 декабря 2013 г.). «Beignet OpenCL от Intel все еще медленно готовится» . Фороникс .
  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 с открытым исходным кодом - среда выполнения вычислений» . 7 февраля 2018 г.
  99. ^ "README NEO GitHub" . Гитхаб . 21 марта 2019 г.
  100. ^ "РОКм". Гитхаб . Архивировано из оригинала 8 октября 2016 года.
  101. ^ «RadeonOpenCompute/ROCm: ROCm - платформа с открытым исходным кодом для высокопроизводительных вычислений и сверхмасштабных вычислений на графических процессорах» . Гитхаб. 21 марта 2019 г.
  102. ^ «Хороший обзор вычислительного стека ROCm Linux - Phoronix» . www.phoronix.com .
  103. ^ "XDC Lightning.pdf" . Гугл документы .
  104. ^ «Официально выпущена Radeon ROCm 2.0 с поддержкой OpenCL 2.0, TensorFlow 1.12, 48-битной VA Vega – 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 Documentation 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 мая 2016 г. — документация Portable Computing Language (pocl) 1.3-pre» . Портативныйcl.org .
  117. ^ "Домашняя страница PoCL" .
  118. ^ "Домашняя страница PoCL" .
  119. ^ "Домашняя страница PoCL" .
  120. ^ «Выпущен POCL 1.6-RC1 с лучшей производительностью CUDA - Phoronix» . Архивировано из оригинала 17 января 2021 года . Проверено 3 декабря 2020 г.
  121. ^ https://www.iwocl.org/wp-content/uploads/30-iwocl-syclcon-2021-baumann-slides.pdf [ пустой URL-адрес PDF ]
  122. ^ "Домашняя страница PoCL" .
  123. ^ "Домашняя страница PoCL" .
  124. ^ "Домашняя страница PoCL" .
  125. ^ "Домашняя страница PoCL" .
  126. ^ «О» . Git.Linaro.org .
  127. ^ Галл, Т.; Питни, Дж. (6 марта 2014 г.). «LCA14-412: GPGPU на SoC ARM» (PDF) . Веб-сервисы Amazon . Архивировано из оригинала (PDF) 26 июля 2020 г. Проверено 22 января 2017 г.
  128. ^ "зузуф/фриокл". Гитхаб . Проверено 13 апреля 2017 г.
  129. ^ Чжан, Пэн; Фанг, Цзяньбинь; Ян, Канкун; Тан, Дао; Хуан, Чун; Ван, Чжэн (2018). MOCL: эффективная реализация OpenCL для архитектуры Matrix-2000 (PDF) . Учеб. Международная конференция. на передовых компьютерных технологиях. дои : 10.1145/3203217.3203244.
  130. ^ «Статус». Гитхаб . 16 марта 2022 г.
  131. ^ «Демо OpenCL, процессор AMD» . YouTube . 10 декабря 2008 года . Проверено 28 марта 2009 г.
  132. ^ «Демо OpenCL, графический процессор Nvidia» . YouTube . 10 декабря 2008 года . Проверено 28 марта 2009 г.
  133. ^ «Imagination Technologies выпускает усовершенствованное высокоэффективное семейство IP-многопроцессорных графических процессоров POWERVR SGX543MP» . Технологии воображения. 19 марта 2009 года. Архивировано из оригинала 3 апреля 2014 года . Проверено 30 января 2011 г.
  134. ^ «AMD и Havok демонстрируют ускоренную физику OpenCL» . Перспектива ПК. 26 марта 2009 года. Архивировано из оригинала 5 апреля 2009 года . Проверено 28 марта 2009 г.
  135. ^ «Nvidia выпускает драйвер OpenCL для разработчиков» . Нвидиа. 20 апреля 2009 года. Архивировано из оригинала 4 февраля 2012 года . Проверено 27 апреля 2009 г.
  136. ^ «AMD выполняет реверс GPGPU и анонсирует OpenCL SDK для x86» . Арс Техника. 5 августа 2009 года . Проверено 6 августа 2009 г.[ постоянная мертвая ссылка ]
  137. ^ Морен, Дэн; Снелл, Джейсон (8 июня 2009 г.). «Постоянное обновление: основной доклад WWDC 2009». MacWorld.com . МакВорлд . Проверено 12 июня 2009 г.
  138. ^ «Бета-программа ATI Stream Software Development Kit (SDK) v2.0» . Архивировано из оригинала 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. Ссылки _ ЗииЛАБС . Проверено 23 июня 2015 г.
  143. ^ «Intel раскрывает новые технические подробности Sandy Bridge» . Архивировано из оригинала 31 октября 2013 года . Проверено 13 сентября 2010 г.
  144. ^ http://reference.wolfram.com/mathematica/OpenCLLink/tutorial/Overview.html
  145. ^ «Истории, связанные с WebCL» . Группа компаний «Хронос» . Проверено 23 июня 2015 г.
  146. ^ «Хронос выпускает окончательную спецификацию WebGL 1.0» . Группа компаний «Хронос». Архивировано из оригинала 9 июля 2015 года . Проверено 23 июня 2015 г.
  147. ^ «Разработчик IBM». разработчик.ibm.com .
  148. ^ «Добро пожаловать в Вики». www.ibm.com . 20 октября 2009 г.
  149. ^ «Nokia Research выпускает прототип WebCL» . Группа компаний «Хронос». 4 мая 2011 г. Архивировано из оригинала 5 декабря 2020 г. . Проверено 23 июня 2015 г.
  150. ^ КаматК, Шарат. «Прототип WebCL от Samsung для WebKit». Гитхаб.com. Архивировано из оригинала 18 февраля 2015 года . Проверено 23 июня 2015 г.
  151. ^ «AMD увеличивает производительность APU с помощью обновленной разработки программного обеспечения OpenCL» . Amd.com. 8 августа 2011 года . Проверено 16 июня 2013 г.
  152. ^ «AMD APP SDK v2.6» . Форумы.amd.com. 13 марта 2015 года . Проверено 23 июня 2015 г.[ мертвая ссылка ]
  153. ^ «Портлендская группа анонсирует компилятор OpenCL для SoC NovaThor на базе ARM ST-Ericsson» . Проверено 4 мая 2012 г.
  154. ^ «Последняя спецификация WebCL» . Группа компаний «Хронос» . 7 ноября 2013. Архивировано из оригинала 1 августа 2014 года . Проверено 23 июня 2015 г.
  155. ^ «Altera открывает мир FPGA для программистов с широкой доступностью SDK и готовыми платами для OpenCL» . Альтера.com. Архивировано из оригинала 9 января 2014 года . Проверено 9 января 2014 г.
  156. ^ «Altera SDK для OpenCL — первая в отрасли компания, достигшая соответствия Khronos для FPGA» . Альтера.com. Архивировано из оригинала 9 января 2014 года . Проверено 9 января 2014 г.
  157. ^ «Хронос завершает разработку спецификации OpenCL 2.0 для гетерогенных вычислений» . Группа компаний «Хронос». 18 ноября 2013 года . Проверено 23 июня 2015 г.
  158. ^ "Пресс-релиз WebCL 1.0" . Группа компаний «Хронос». 19 марта 2014 года . Проверено 23 июня 2015 г.
  159. ^ «Спецификация WebCL 1.0» . Группа компаний «Хронос». 14 марта 2014 года . Проверено 23 июня 2015 г.
  160. ^ «Драйвер Intel OpenCL 2.0» . Архивировано из оригинала 17 сентября 2014 года . Проверено 14 октября 2014 г.
  161. ^ «Драйвер AMD OpenCL 2.0» . Поддержка.AMD.com . 17 июня 2015 г. Проверено 23 июня 2015 г.
  162. ^ «Среда разработки Xilinx SDAccel для OpenCL, C и C++ соответствует требованиям Khronos - новости khronos.org» . Группа «Хронос» . Проверено 26 июня 2017 г.
  163. ^ «Выпуск 349 графических драйверов для Windows, версия 350.12» (PDF) . 13 апреля 2015 года . Проверено 4 февраля 2016 г.
  164. ^ «Выпущен AMD APP SDK 3.0» . Разработчик.AMD.com . 26 августа 2015 года . Проверено 11 сентября 2015 г.
  165. ^ «Хронос выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования» . Группа компаний «Хронос» . 16 ноября 2015 г.
  166. ^ «Что нового? Intel® SDK для приложений OpenCL™ 2016, R3» . Программное обеспечение Intel.
  167. ^ «Драйверы NVIDIA 378.66 для Windows предлагают оценочную поддержку OpenCL 2.0» . Группа компаний «Хронос» . 17 февраля 2017 года. Архивировано из оригинала 6 августа 2020 года . Проверено 17 марта 2017 г.
  168. Шуппе, Якуб (22 февраля 2017 г.). «NVIDIA включает бета-поддержку OpenCL 2.0».
  169. Шуппе, Якуб (6 марта 2017 г.). «Бета-поддержка NVIDIA для OpenCL 2.0 работает и в Linux».
  170. ^ "Группа Хронос". Группа «Хронос» . 21 марта 2019 г.
  171. ^ «GitHub – RadeonOpenCompute/ROCm в roc-3.5.0» . Гитхаб .
  172. ^ ab «NVIDIA теперь совместима с OpenCL 3.0» . 12 апреля 2021 г.
  173. ^ abc "Группа Хронос". Группа «Хронос» . 12 декабря 2022 г. . Проверено 12 декабря 2022 г.
  174. ^ «Рустикл от Mesa достиг официального соответствия OpenCL 3.0» . www.phoronix.com . Проверено 12 декабря 2022 г.
  175. ^ "Группа Хронос". Группа «Хронос» . 20 августа 2019 года . Проверено 20 августа 2019 г.
  176. ^ «KhronosGroup/OpenCL-CTL: Тесты на соответствие OpenCL» . Гитхаб. 21 марта 2019 г.
  177. ^ «OpenCL и AMD APP SDK» . Центр разработчиков AMD . http://developer.amd.com. Архивировано из оригинала 4 августа 2011 года . Проверено 11 августа 2011 г.
  178. ^ «О Intel OpenCL SDK 1.1» . программное обеспечение.intel.com . intel.com . Проверено 11 августа 2011 г.
  179. ^ «Intel® SDK для приложений OpenCL™ – Примечания к выпуску» . программное обеспечение.intel.com . 14 марта 2019 г.
  180. ^ «Поддержка продукта» . Проверено 11 августа 2011 г.
  181. ^ «Intel OpenCL SDK – Примечания к выпуску» . Архивировано из оригинала 17 июля 2011 года . Проверено 11 августа 2011 г.
  182. ^ «Анонсируем комплект разработки OpenCL для Linux on Power v0.3» . ИБМ . Проверено 11 августа 2011 г.
  183. ^ «IBM выпускает комплект разработки OpenCL для Linux on Power v0.3 - доступна версия, соответствующая OpenCL 1.1» . OpenCL гостиная . IBM.com . Проверено 11 августа 2011 г.
  184. ^ «IBM выпускает общую среду выполнения OpenCL для Linux на архитектуре x86» . ИБМ . 20 октября 2009 года . Проверено 10 сентября 2011 г.
  185. ^ «OpenCL и AMD APP SDK» . Центр разработчиков AMD . http://developer.amd.com. Архивировано из оригинала 6 сентября 2011 года . Проверено 10 сентября 2011 г.
  186. ^ «Nvidia выпускает драйвер OpenCL» . 22 апреля 2009 года . Проверено 11 августа 2011 г.
  187. ^ "Клинфо Саймона Леблана" . Гитхаб . Проверено 27 января 2017 г.
  188. ^ "Клинфо Обломова". Гитхаб . Проверено 27 января 2017 г.
  189. ^ "clinfo: ИНФОРМАЦИЯ об openCL" . 2 апреля 2013 года . Проверено 27 января 2017 г.
  190. ^ "Продукты Хроноса" . Группа «Хронос» . Проверено 15 мая 2017 г.
  191. ^ «OpenCL-CTS/Test_conformance в главной · KhronosGroup/OpenCL-CTS» . Гитхаб .
  192. ^ «Проблемы · KhronosGroup/OpenCL-CTS» . Гитхаб .
  193. ^ «Intel Compute-Runtime 20.43.18277 обеспечивает поддержку Alder Lake» .
  194. ^ "время выполнения вычислений" . 01.org . 7 февраля 2018 г.
  195. ^ аб Фанг, Цзяньбинь; Варбанеску, Ана Лусия; Сипс, Хенк (2011). «Комплексное сравнение производительности CUDA и OpenCL». 2011 Международная конференция по параллельной обработке . Учеб. Международная конференция. по параллельной обработке. стр. 216–225. дои :10.1109/ICPP.2011.45. ISBN 978-1-4577-1336-1.
  196. ^ Ду, Пэн; Вебер, Рик; Лущек, Петр; Томов, Станимир; Петерсон, Грегори; Донгарра, Джек (2012). «От CUDA к OpenCL: на пути к портативному решению для многоплатформенного программирования на графических процессорах». Параллельные вычисления . 38 (8): 391–407. CiteSeerX 10.1.1.193.7712 . doi :10.1016/j.parco.2011.10.002. 
  197. ^ Дольбо, Ромен; Боден, Франсуа; де Вердьер, Гийом Колен (7 сентября 2013 г.). «Один OpenCL, чтобы управлять ими всеми?». 2013 6-й международный семинар IEEE по многоядерным вычислительным системам (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. ^ Греве, Доминик; О'Бойл, Майкл Ф.П. (2011). «Подход к статическому разделению задач для гетерогенных систем с использованием OpenCL». Конструкция компилятора . Учеб. Международная конференция. по построению компилятора. Конспекты лекций по информатике. Том. 6601. стр. 286–305. дои : 10.1007/978-3-642-19861-8_16 . ISBN 978-3-642-19860-1.
  201. ^ «Серия Radeon RX 6800 имеет отличную производительность OpenCL на основе ROCm в Linux» . www.phoronix.com .

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