Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

OpenCL ( Open Computing Language ) - это платформа для написания программ, которые выполняются на разнородных платформах, состоящих из центральных процессоров (CPU), графических процессоров (GPU), процессоров цифровых сигналов (DSP), программируемых вентильных матриц (FPGA) и других процессоры или аппаратные ускорители . OpenCL определяет языки программирования (на основе C99 и C ++ 11 ) для программирования этих устройств и интерфейсов прикладного программирования.(API) для управления платформой и выполнения программ на вычислительных устройствах . OpenCL предоставляет стандартный интерфейс для параллельных вычислений с использованием параллелизма на основе задач и данных .

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

Обзор [ править ]

OpenCL рассматривает вычислительную систему как состоящую из ряда вычислительных устройств , которые могут быть центральными процессорами (ЦП) или «ускорителями», такими как графические процессоры (ГП), подключенные к главному процессору (ЦП). Он определяет C-подобный язык для написания программ. Функции, выполняемые на устройстве OpenCL, называются « ядрами ». [10] : 17 Одно вычислительное устройство обычно состоит из нескольких вычислительных блоков , которые, в свою очередь, содержат несколько элементов обработки.(ЧП). Выполнение одного ядра может выполняться на всех или многих PE параллельно. Как вычислительное устройство подразделяется на вычислительные блоки и PE, зависит от поставщика; вычислительную единицу можно рассматривать как « ядро », но понятие ядра трудно определить для всех типов устройств, поддерживаемых OpenCL (или даже в категории «процессоры»), [11] : 49–50 и количество вычислительных блоков может не соответствовать количеству ядер, заявленному в маркетинговой литературе поставщиков (которая может фактически подсчитывать линии SIMD ). [12]

В дополнение к C-подобному языку программирования OpenCL определяет интерфейс прикладного программирования (API), который позволяет программам, запущенным на хосте, запускать ядра на вычислительных устройствах и управлять памятью устройства, которая (по крайней мере, концептуально) отделена от памяти хоста. Программы на языке OpenCL предназначены для компиляции во время выполнения , так что приложения, использующие OpenCL, могут переноситься между реализациями для различных хост-устройств. [13] Стандарт OpenCL определяет хост-API для C и C ++ ; сторонние API существуют для других языков программирования и платформ, таких как Python , [14] Java , Perl [15] и.NET . [11] : 15 реализация стандарта OpenCL состоит из библиотеки , которая реализует API для C и C ++, а также OpenCL C компилятор для вычислительного устройства (устройств) , ориентированные.

Чтобы открыть модель программирования OpenCL для других языков или защитить исходный код ядра от проверки, стандартное переносимое промежуточное представление (SPIR) [16] может использоваться как независимый от цели способ доставки ядер между интерфейсным компилятором и внутренняя часть OpenCL.

Совсем недавно Khronos Group ратифицировала SYCL , [17] модель программирования более высокого уровня для OpenCL в качестве DSEL с одним исходным кодом, основанного на чистом C ++ 11, для повышения производительности программирования .

Иерархия памяти [ править ]

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

  • глобальная память: используется всеми элементами обработки, но имеет высокую задержку доступа ( __global );
  • постоянная память: меньшего размера, с низкой задержкой, доступная для записи центральному процессору, но не вычислительным устройствам ( __constant );
  • локальная память: общая для группы обрабатывающих элементов ( __local );
  • индивидуальная память на каждый элемент ( регистры ; __private ).

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

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

Язык OpenCL C [ править ]

Язык программирования, который используется для написания вычислительных ядер , называется OpenCL C и основан на C99 , [18], но адаптирован для соответствия модели устройства в OpenCL. Буферы памяти находятся на определенных уровнях иерархии памяти , а указатели помечаются квалификаторами области __global , __local , __constant и __private , отражающими это. Вместо программы устройства, имеющей основную функцию, функции OpenCL C помечены как __kernel, чтобы указать, что они являются точками входа в программу, которая должна быть вызвана из главной программы.Указатели функций , битовые поля и массивы переменной длины опускаются, а рекурсия запрещена. [19] стандартная библиотека C заменяется пользовательским набором стандартных функций, ориентированных в сторону математического программирования.

OpenCL C расширен, чтобы упростить использование параллелизма с векторными типами и операциями, синхронизацией и функциями для работы с рабочими элементами и рабочими группами. [19] В частности, помимо скалярных типов, таких как float и double , которые ведут себя аналогично соответствующим типам в C, OpenCL предоставляет векторные типы фиксированной длины, такие как float4 (4-вектор чисел с плавающей точкой одинарной точности); такие векторные типы доступны в длинах два, три, четыре, восемь и шестнадцать для различных базовых типов. [18] : § 6.1.2 Векторизованные операции над этими типами предназначены для отображения в наборы инструкций SIMD , например SSE или VMX при запуске программ OpenCL на процессорах. [13] К другим специализированным типам относятся двух- и трехмерные изображения. [18] : 10–11

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

Каждый вызов ( рабочий элемент ) ядра берет строку зеленой матрицы ( 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 ;  // Накопитель для скалярного произведения  для  ( size_t  j  =  0 ;  j  <  ncols ;  j ++ )  {  sum  + =  a [ j ]  *  x [ j ];  }  y [ я ]  =  сумма ; }

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

.

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

Пример: вычисление БПФ [ править ]

В этом примере загружается реализация быстрого преобразования Фурье (БПФ) и выполняется ее. Реализация показана ниже. [20] Код запрашивает у библиотеки OpenCL первую доступную графическую карту, создает буферы памяти для чтения и записи (с точки зрения графической карты), JIT-компилирует FFT-ядро и, наконец, асинхронно запускает ядро. Результат преобразования в этом примере не читается.

#include  <stdio.h>#include  <time.h>#include  "CL / opencl.h"#define NUM_ENTRIES 1024int  main ()  // (int argc, const char * argv []) { // КОНСТАНТЫ // Исходный код ядра представлен в виде строки, // расположенной внутри файла: "fft1D_1024_kernel_src.cl". Подробности см. В следующем списке. const  char  * 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 );// создаем контекст вычислений с устройством GPU cl_context  context  =  clCreateContextFromType ( NULL ,  CL_DEVICE_TYPE_GPU ,  NULL ,  NULL ,  NULL );// создать очередь команд clGetDeviceIDs ( NULL ,  CL_DEVICE_TYPE_DEFAULT ,  1 ,  devices ,  NULL ); cl_command_queue  queue  =  clCreateCommandQueue ( контекст ,  устройства [ 0 ],  0 ,  NULL );// выделить память буфера объектов cl_mem  memobjs []  =  {  clCreateBuffer ( контекст ,  CL_MEM_READ_ONLY  |  CL_MEM_COPY_HOST_PTR ,  SizeOf ( поплавок )  *  2  *  NUM_ENTRIES ,  NULL ,  NULL ),  clCreateBuffer ( контекст ,  CL_MEM_READ_WRITE ,  SizeOf ( поплавок )  *  2  *  NUM_ENTRIES ,  NULL ,  NULL )  };// cl_mem memobjs [0] = // ИСПРАВЛЕНО, СМ. ВЫШЕ // cl_mem memobjs [1] = // ИСПРАВЛЕНО, СМОТРИТЕ ВЫШЕ// создание вычислительной программы // const char * fft1D_1024_kernel_src [1] = {}; cl_program  program  =  clCreateProgramWithSource ( контекст ,  1 ,  ( const  char  ** ) и  KernelSource ,  NULL ,  NULL );// создание исполняемого файла вычислительной программы clBuildProgram ( program ,  0 ,  NULL ,  NULL ,  NULL ,  NULL );// создание вычислительного ядра cl_kernel  kernel  =  clCreateKernel ( program ,  "fft1D_1024" ,  NULL );// устанавливаем значения аргументовsize_t  local_work_size [ 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 ,  ПУСТО ); clSetKernelArg ( ядро ,  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 ;  // Nvidia: 192 или 256 clEnqueueNDRangeKernel ( очередь ,  ядро ,  1 ,  NULL ,  global_work_size ,  local_work_size ,  0 ,  NULL ,  NULL ); }

Фактическое вычисление внутри файла "fft1D_1024_kernel_src.cl" (на основе подгонки БПФ к архитектуре G80 ): [21]

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 ;  out  =  out  +  blockIdx ; globalLoads ( данные ,  в ,  64 );  // объединенное глобальное чтение  fftRadix16Pass ( data );  // на месте передаем radix-16  twiddleFactorMul ( data ,  tid ,  1024 ,  0 ); // локальное перемешивание с использованием локальной памяти  localShuffle ( data ,  sMemx ,  sMemy ,  tid ,  ((( tid  &  15 )  *  65 )  +  ( tid  >>  4 )));  fftRadix16Pass ( данные );  // на месте radix-16 передать  twiddleFactorMul ( data ,  tid ,  64 ,  4 );  // умножение коэффициента вращения localShuffle ( данные ,  sMemx ,  sMemy ,  tid ,  ((( tid  >>  4 )  *  64 )  +  ( tid  &  15 ))); // четыре вызова функции radix-4  fftRadix4Pass ( data );  // функция счисления 4 счисления 1  fftRadix4Pass ( data  +  4 );  // функция основания 4 счисления 2  fftRadix4Pass ( data  +  8 );  // функция счисления 4 счисления 3  fftRadix4Pass ( data  +  12 );  // функция счисления 4 счисления 4 // объединенная глобальная запись  globalStores ( data ,  out ,  64 );  } ) "

Полную реализацию OpenCL FFT с открытым исходным кодом можно найти на веб-сайте Apple. [22]

История [ править ]

OpenCL был первоначально разработан Apple Inc. , которая владеет правами на товарный знак , и преобразован в первоначальное предложение в сотрудничестве с техническими группами AMD , IBM , Qualcomm , Intel и Nvidia . Apple представила это первоначальное предложение группе Khronos . 16 июня 2008 г. была сформирована рабочая группа Khronos Compute [23], в которую вошли представители компаний-производителей процессоров, графических процессоров, встроенных процессоров и программного обеспечения. Эта группа в течение пяти месяцев работала над завершением технических деталей спецификации OpenCL 1.0 к 18 ноября 2008 г. [24]Эта техническая спецификация была рассмотрена членами Khronos и утверждена для публичного выпуска 8 декабря 2008 г. [25]

OpenCL 1.0 [ править ]

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

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

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

OpenCL 1.1 [ править ]

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

  • Новые типы данных, включая трехкомпонентные векторы и дополнительные форматы изображений;
  • Обработка команд из нескольких потоков хоста и буферов обработки на нескольких устройствах;
  • Операции с областями буфера, включая чтение, запись и копирование прямоугольных областей 1D, 2D или 3D;
  • Расширенное использование событий для управления выполнением команд;
  • Дополнительные встроенные в OpenCL функции C, такие как целочисленное ограничение, перемешивание и асинхронные копии с последовательным разделением;
  • Улучшенная совместимость OpenGL за счет эффективного совместного использования изображений и буферов путем связывания событий OpenCL и OpenGL.

OpenCL 1.2 [ править ]

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

  • Разделение устройства: возможность разделить устройство на подчиненные устройства, чтобы рабочие задания можно было распределить между отдельными вычислительными модулями. Это полезно для резервирования областей устройства, чтобы уменьшить задержку для критических по времени задач.
  • Раздельная компиляция и компоновка объектов: возможность компилировать OpenCL во внешние библиотеки для включения в другие программы.
  • Расширенная поддержка изображений: 1.2 добавляет поддержку одномерных изображений и массивов одномерных / двухмерных изображений. Кроме того, расширения общего доступа OpenGL теперь позволяют использовать 1D-текстуры OpenGL и массивы 1D / 2D-текстур для создания изображений OpenCL.
  • Встроенные ядра: настраиваемые устройства, содержащие определенные уникальные функции, теперь более тесно интегрированы в структуру OpenCL. Ядра могут быть вызваны для использования специализированных или непрограммируемых аспектов базового оборудования. Примеры включают кодирование / декодирование видео и процессоры цифровых сигналов.
  • Функциональность DirectX: совместное использование поверхностей мультимедиа DX9 обеспечивает эффективное совместное использование поверхностей мультимедиа OpenCL и DX9 или DXVA . Точно так же для DX11 включен беспрепятственный обмен между поверхностями OpenCL и DX11.
  • Возможность принудительного соответствия IEEE 754 для вычислений с плавающей запятой одинарной точности: OpenCL по умолчанию позволяет версиям одинарной точности операций деления, обратного вычисления и извлечения квадратного корня быть менее точными, чем правильно округленные значения, требуемые IEEE 754. [34] Если программист передает компилятору аргумент командной строки «-cl-fp32-правильно-округленно-делить-sqrt», эти три операции будут вычислены в соответствии с требованиями IEEE 754, если реализация OpenCL поддерживает это, и не сможет скомпилировать, если реализация OpenCL не поддерживает вычисление этих операций до их правильно округленных значений, как определено в спецификации IEEE 754. [34]Эта возможность дополняется возможностью запрашивать реализацию OpenCL, чтобы определить, может ли она выполнять эти операции с точностью IEEE 754. [34]

OpenCL 2.0 [ править ]

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

  • Общая виртуальная память
  • Вложенный параллелизм
  • Общее адресное пространство
  • Изображений
  • C11 атомикс
  • Трубы
  • Расширение устанавливаемого клиентского драйвера для Android

OpenCL 2.1 [ править ]

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

  • Дополнительные функции подгруппы
  • Копирование объектов и состояний ядра
  • Запросы таймера устройства с малой задержкой
  • Получение кода SPIR-V во время выполнения
  • Подсказки о приоритете выполнения для очередей
  • Отправки нулевого размера с хоста

AMD, ARM , Intel, HPC и YetiWare заявили о поддержке OpenCL 2.1. [37] [38]

OpenCL 2.2 [ править ]

OpenCL 2.2 включает язык ядра OpenCL C ++ в базовую спецификацию для значительного повышения производительности параллельного программирования. [39] [40] [41] Он был выпущен 16 мая 2017 г. [42] Техническое обновление выпущено в мае 2018 г. с исправлениями. [43]

  • Язык ядра OpenCL C ++ является статическим подмножеством стандарта C ++ 14 и включает классы, шаблоны, лямбда-выражения, перегрузки функций и многие другие конструкции для универсального и метапрограммирования.
  • Использует новый промежуточный язык Khronos SPIR-V 1.1, который полностью поддерживает язык ядра OpenCL C ++.
  • Функции библиотеки OpenCL теперь могут использовать язык C ++ для обеспечения повышенной безопасности и уменьшения неопределенного поведения при доступе к таким функциям, как атомики, итераторы, изображения, семплеры, каналы и встроенные типы и адресные пространства очереди устройств.
  • Хранилище каналов - это новый тип на стороне устройства в OpenCL 2.2, который полезен для реализаций FPGA, так как размер и тип подключения становятся известными во время компиляции, что обеспечивает эффективную связь между ядрами в масштабах устройства.
  • OpenCL 2.2 также включает функции для расширенной оптимизации сгенерированного кода: приложения могут предоставлять значение константы специализации во время компиляции SPIR-V, новый запрос может обнаруживать нетривиальные конструкторы и деструкторы глобальных объектов области программы, а также могут быть установлены обратные вызовы пользователя. во время выпуска программы.
  • Работает на любом оборудовании с поддержкой OpenCL 2.0 (требуется только обновление драйвера)

OpenCL 3.0 [ править ]

OpenCL 3.0 находится в финальном режиме (30.09.2020). OpenCL 1.2 является обязательным. Все модули OpenCL 2.x и новые модули 3.0 не являются обязательными. Новый предпочтительный язык - C ++ для OpenCL со многими функциями C ++ 17. [44] [45] [46]

Дорожная карта [ править ]

Международный семинар по OpenCL (IWOCL) , принадлежащий Группа Khronos

Выпуская OpenCL 2.2, Khronos Group объявила, что OpenCL по возможности объединится с Vulkan, чтобы обеспечить гибкость развертывания программного обеспечения OpenCL для обоих API. [47] [48] Это было продемонстрировано Adobe Premiere Rush с использованием компилятора с открытым исходным кодом clspv [49] для компиляции значительных объемов кода ядра OpenCL C для запуска в среде выполнения Vulkan для развертывания на Android. [50]OpenCL имеет перспективную дорожную карту, независимую от Vulkan, с OpenCL Next в стадии разработки и нацеленной на выпуск в 2020 году. OpenCL Next может интегрировать такие расширения, как Vulkan / OpenCL Interop, Scratch-Pad Memory Management, Extended Subgroups, SPIR-V 1.4. SPIR-V Расширенная отладочная информация. OpenCL также рассматривает загрузчик и уровни, подобные Vulkan, и «гибкий профиль» для гибкости развертывания на нескольких типах ускорителей. [51]

Реализации с открытым исходным кодом [ править ]

OpenCL состоит из набора заголовков и общего объекта, который загружается во время выполнения. Устанавливаемый клиентский драйвер (ICD) должен быть установлен на платформе для каждого класса поставщиков, для которых среда выполнения должна поддерживать. То есть, например, для поддержки устройств Nvidia на платформе Linux необходимо установить Nvidia ICD, чтобы среда выполнения OpenCL (загрузчик ICD) могла найти ICD для поставщика и соответствующим образом перенаправить вызовы. . Стандартный заголовок OpenCL используется приложением-потребителем; затем вызовы каждой функции передаются средой выполнения OpenCL соответствующему драйверу через ICD. Каждый поставщик должен реализовать каждый вызов OpenCL в своем драйвере. [52]

Реализации OpenCL Apple, [53] Nvidia, [54] RapidMind [55] и Gallium3D [56] основаны на технологии компилятора LLVM и используют компилятор Clang в качестве внешнего интерфейса.

MESA Gallium Compute
Реализация OpenCL (фактическая версия 1.1 не завершена, в основном это AMD Radeon GCN ) для ряда платформ поддерживается в рамках проекта Gallium Compute Project [57], который основан на работе проекта Mesa по поддержке нескольких платформ. Раньше это называлось CLOVER. [58]. Фактическая разработка: в основном поддержка запуска неполного фреймворка с реальным LLVM и CLANG, некоторые новые функции, такие как fp16 в 17.3, [59] Целевой полный OpenCL 1.0, 1.1 и 1.2 для AMD и Nvidia. Новая базовая разработка выполняется Red Hat с помощью SPIR-V также для Clover. [60] [61] Новая цель - модульный OpenCL 3.0 с полной поддержкой OpenCL 1.2.
БЕГНЕТ
Реализация на Intel для его Ivy Bridge + аппаратного обеспечения была выпущена в 2013 г. [62] Это программное обеспечение от компании Intel China Team, привлекла критику со стороны разработчиков на AMD и Red Hat , [63] , а также Майкл Ларабел из Phoronix . [64] Актуальная версия 1.3.2 полностью поддерживает OpenCL 1.2 (Ivy Bridge и выше) и OpenCL 2.0, необязательно для Skylake и новее. [65] [66] В Beignet добавлена ​​поддержка Android., [67] актуальные цели разработки: поддержка только 1.2 и 2.0, путь к OpenCL 2.1, 2.2, 3.0 ушел в NEO.
НЕО
Реализация Intel для оборудования Gen 8 Broadwell + Gen 9, выпущенная в 2018 году. [68] Этот драйвер заменяет реализацию Beignet для поддерживаемых платформ. NEO обеспечивает поддержку OpenCL 2.1 на платформах Core и OpenCL 1.2 на платформах Atom. [69] Актуально в 2020 году также поддерживаются Graphic Gen 11 Ice Lake и Gen 12 Tiger Lake. Новый OpenCL 3.0 доступен для Alder Lake, Tiger Lake и Broadwell с версией 20.43.
ROCm
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). [70] [71] В версии 1.9 поддержка в некоторых моментах экспериментально расширена до аппаратного обеспечения с PCIe 2.0 и без атомики. Обзор актуальной работы сделан на XDC2018. [72] [73] ROCm версии 2.0 поддерживает полный OpenCL 2.0, но некоторые ошибки и ограничения включены в список задач. [74] [75] Версия 3.3 улучшается в деталях. [76] Версия 3.5 поддерживает OpenCL 2.2. [77]Актуальна версия 3.10 с улучшениями и новыми API. [78] На SC20 анонсирована ROCm 4.0 с поддержкой AMD Compute Card Instinct MI 100. [79] Актуальная документация доступна на github. [80]
POCL
Портативная реализация, поддерживающая процессоры и некоторые графические процессоры (через CUDA и HSA ). Основываясь на Clang и LLVM . [81] В версии 1.0 OpenCL 1.2 был почти полностью реализован вместе с некоторыми функциями 2.x. [82] Версия 1.2 имеет LLVM / CLANG 6.0, 7.0 и полную поддержку OpenCL 1.2 со всеми закрытыми заявками в Milestone 1.2. [82] [83] OpenCL 2.0 почти полностью реализован. [84] Версия 1.3 поддерживает Mac OS X. [85] Версия 1.4 включает поддержку LLVM 8.0 и 9.0. [86] В версии 1.5 реализована поддержка LLVM / Clang 10. [87]Версия 1.6 реализует поддержку LLVM / Clang 11 и CUDA Acceleration. [88] Фактическими целями являются завершение OpenCL 2.x, OpenCL 3.0 и улучшение производительности.
Трилистник
Порт Mesa Clover для ARM с полной поддержкой OpenCL 1.2, [89] [90] в настоящее время не разрабатывается для 2.0.
FreeOCL
Реализация OpenCL 1.2, ориентированная на центральный процессор, которая реализует внешний компилятор для создания более надежной платформы [91], фактической разработки не было.
MOCL
Реализация OpenCL на основе POCL исследователями NUDT для Matrix-2000 была выпущена в 2018 году. Архитектура Matrix-2000 предназначена для замены ускорителей Intel Xeon Phi суперкомпьютера TianHe-2. Эта среда программирования построена на основе LLVM v5.0 и также повторно использует некоторые фрагменты кода из POCL. Чтобы раскрыть аппаратный потенциал, среда выполнения устройства использует стратегию диспетчеризации задач на основе push, и производительность атомарного ядра ядра значительно улучшается. Эта структура была развернута в системе TH-2A и легко доступна для общественности. [92] Некоторое программное обеспечение будет перенесено в следующий раз для улучшения POCL. [82]

Реализации поставщика [ править ]

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

  • 10 декабря 2008: AMD и Nvidia провели первую публичную демонстрацию OpenCL, 75-минутную презентацию на SIGGRAPH Asia 2008. AMD показала демонстрацию OpenCL с ускорением процессора, объясняющую масштабируемость OpenCL на одном или нескольких ядрах, в то время как Nvidia показала ускорение на GPU демо. [93] [94]
  • 16 марта 2009 г .: на 4-й выставке Multicore Expo компания Imagination Technologies анонсировала PowerVR SGX543MP, первый графический процессор этой компании с поддержкой OpenCL. [95]
  • 26 марта 2009 г .: на GDC 2009 AMD и Havok продемонстрировали первую работающую реализацию OpenCL, ускоряющую ткань Havok на графическом процессоре AMD Radeon HD 4000 . [96]
  • 20 апреля 2009 г .: Nvidia объявила о выпуске драйвера OpenCL и SDK для разработчиков, участвующих в программе раннего доступа OpenCL. [97]
  • 5 августа 2009 г .: AMD представила первые инструменты разработки для своей платформы OpenCL в рамках программы бета-тестирования ATI Stream SDK v2.0. [98]
  • 28 августа 2009 г .: Apple выпустила Mac OS X Snow Leopard , которая содержит полную реализацию OpenCL. [99]
  • 28 сентября 2009 г .: Nvidia выпустила собственные драйверы OpenCL и реализацию SDK.
  • 13 октября 2009 г .: AMD выпустила четвертую бета-версию ATI Stream SDK 2.0, которая обеспечивает полную реализацию OpenCL как на графических процессорах R700 / R800, так и на процессорах с поддержкой SSE3 . SDK доступен как для Linux, так и для Windows. [100]
  • 26 ноября 2009 г .: Nvidia выпустила драйверы для OpenCL 1.0 (версия 48).
  • 27 октября 2009 г .: S3 выпустила свой первый продукт с поддержкой OpenCL 1.0 - встроенный графический процессор Chrome 5400E. [101]
  • 10 декабря 2009 г .: VIA выпустила свой первый продукт с поддержкой OpenCL 1.0 - видеопроцессор ChromotionHD 2.0, включенный в набор микросхем VN1000. [102]
  • 21 декабря 2009 г .: AMD выпустила производственную версию ATI Stream SDK 2.0 [103], которая обеспечивает поддержку OpenCL 1.0 для графических процессоров R800 и бета-поддержку для графических процессоров R700 .
  • 1 июня 2010 г .: ZiiLABS опубликовала подробную информацию о своей первой реализации OpenCL для процессора ZMS для портативных, встраиваемых и цифровых домашних продуктов. [104]
  • 30 июня 2010 г .: IBM выпустила полностью совместимую версию OpenCL 1.0. [4]
  • 13 сентября 2010 г .: Intel опубликовала подробную информацию о своей первой реализации OpenCL для архитектуры чипа Sandy Bridge. Sandy Bridge интегрирует новейшую технологию графических чипов Intel непосредственно в центральный процессор. [105]
  • 15 ноября 2010 г .: Wolfram Research выпустила Mathematica 8 с пакетом OpenCLLink .
  • 3 марта 2011: Khronos Group объявляет о создании рабочей группы WebCL для изучения определения привязки JavaScript к OpenCL. Это создает возможность использовать параллельную обработку графического процессора и многоядерного процессора из веб-браузера . [106] [107]
  • 31 марта 2011 г .: IBM выпустила полностью совместимую версию OpenCL 1.1. [4] [108]
  • 25 апреля 2011 г .: IBM выпустила OpenCL Common Runtime v0.1 для Linux на архитектуре x86. [109]
  • 4 мая 2011 г .: Nokia Research выпускает расширение WebCL с открытым исходным кодом для веб-браузера Firefox , обеспечивающее привязку JavaScript к OpenCL. [110]
  • 1 июля 2011 г .: Samsung Electronics выпускает реализацию прототипа WebCL для WebKit с открытым исходным кодом, обеспечивающую привязку JavaScript к OpenCL. [111]
  • 8 августа 2011 г .: AMD выпустила пакет разработки программного обеспечения (SDK) AMD Accelerated Parallel Processing (APP) v2.5 под управлением OpenCL, заменив ATI Stream SDK как технологию и концепцию. [112]
  • 12 декабря 2011 г .: AMD выпустила AMD APP SDK v2.6 [113], который содержит предварительную версию OpenCL 1.2.
  • 27 февраля 2012 г .: Portland Group выпустила компилятор PGI OpenCL для многоядерных процессоров ARM . [114]
  • 17 апреля 2012 г .: Khronos выпустил рабочий проект WebCL. [115]
  • 6 мая 2013 г .: Altera выпустила Altera SDK для OpenCL версии 13.0. [116] Он соответствует OpenCL 1.0. [117]
  • 18 ноября 2013: Khronos объявил, что спецификация OpenCL 2.0 завершена. [118]
  • 19 марта 2014 г .: Khronos выпускает спецификацию WebCL 1.0 [119] [120]
  • 29 августа 2014 г .: Intel выпускает драйвер HD Graphics 5300, поддерживающий OpenCL 2.0. [121]
  • 25 сентября 2014 г .: AMD выпускает Catalyst 14.41 RC1, который включает драйвер OpenCL 2.0. [122]
  • 14 января 2015 г .: Xilinx Inc. объявляет о выпуске среды разработки SDAccel для OpenCL, C и C ++ и обеспечивает соответствие стандарту Khronos [123]
  • 13 апреля 2015 г .: Nvidia выпускает драйвер WHQL версии 350.12, который включает поддержку OpenCL 1.2 для графических процессоров на базе архитектуры Kepler или более поздних версий. [124] Драйвер 340+ поддерживает OpenCL 1.1 для Tesla и Fermi.
  • 26 августа 2015 г .: AMD выпустила AMD APP SDK v3.0 [125], который содержит полную поддержку OpenCL 2.0 и образец кода.
  • 16 ноября 2015 г .: Khronos объявил о завершении спецификации OpenCL 2.1. [126]
  • 18 апреля 2016: Khronos объявил, что спецификация OpenCL 2.2 была предварительно доработана. [40]
  • 3 ноября 2016 г. Поддержка Intel Gen7 + OpenCL 2.1 в SDK 2016 r3 [127]
  • 17 февраля 2017 г .: Nvidia начинает ознакомительную поддержку OpenCL 2.0 с драйвером 378.66. [128] [129] [130]
  • 16 мая 2017 г .: Khronos объявил, что спецификация OpenCL 2.2 была завершена с выпуском SPIR-V 1.2. [131]
  • 14 мая 2018 г .: Khronos анонсировал обновление для OpenCL 2.2 с исправлением ошибок и унифицированными заголовками. [43]
  • 27 апреля 2020 г .: Khronos анонсировал предварительную версию OpenCL 3.0.
  • 1 июня 2020 г .: Intel Neo Runtime с OpenCL 3.0 для нового Tiger Lake
  • 3 июня 2020 г .: AMD анонсировала RocM 3.5 с поддержкой OpenCL 2.2 [132]
  • 30 сентября 2020 г .: Khronos объявил, что спецификации OpenCL 3.0 завершены.

Устройства [ править ]

По состоянию на 2016 год , OpenCL работает на графических процессоров , процессоры с SIMD инструкций, ПВМ , Movidius Myriad 2 , Adapteva прозрение и ЦСП .

Набор тестов на соответствие Khronos [ править ]

Чтобы быть официально совместимой, реализация должна пройти набор тестов на соответствие Khronos (CTS), а результаты будут отправлены в программу Khronos Adopters. [133] Код Khronos CTS для всех версий OpenCL доступен с открытым исходным кодом с 2017 года. [134]

Соответствующие продукты [ править ]

Группа Khronos поддерживает расширенный список продуктов, совместимых с OpenCL. [4]

Все стандартные реализации можно запросить с помощью одного из инструментов Clinfo (существует несколько инструментов с одинаковым именем и схожим набором функций). [145] [146] [147]

Поддержка версий [ править ]

Продукты и их версия поддержки OpenCL включают: [148]

Поддержка OpenCL 3.0 [ править ]

Возможно использование всего оборудования с OpenCL 1.2+, OpenCL 2.x только опционально, Khronos Test Suite в стадии разработки [149]

  • (2020) Intel NEO Compute: 20.41+ для Gen 12 Tiger Lake до Broadwell [150]
  • (2020) Процессоры Intel 6-го, 7-го, 8-го, 9-го, 10-го, 11-го поколения ( Skylake , Kaby Lake , Coffee Lake , Comet Lake , Ice Lake , Tiger Lake ) с последним графическим драйвером Intel для Windows
  • (2021) Процессоры Intel 11-го, 12-го поколения ( Rocket Lake , Alder Lake ) с последним графическим драйвером Intel для Windows

Поддержка OpenCL 2.2 [ править ]

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

  • Intel NEO Compute: работа над актуальными продуктами продолжается [151]
  • ROCm: в основном версия 3.5+

Поддержка OpenCL 2.1 [ править ]

  • (2018+) Поддержка процессоров Intel 5-го и 6-го поколения ( Broadwell , Skylake )
  • (2017+) Процессоры Intel 7, 8, 9, 10 поколения ( Kaby Lake , Coffee Lake , Comet Lake , Ice Lake )
  • Khronos: с помощью Driver Update все оборудование возможно с поддержкой 2.0

Поддержка OpenCL 2.0 [ править ]

  • (2011+) AMD GCN GPU (HD 7700 + / HD 8000 / Rx 200 / Rx 300 / Rx 400 / Rx 500 / Rx 5000-Series), некоторые GCN 1-го поколения только 1.2 с некоторыми расширениями
  • (2013+) AMD GCN APU (на базе Jaguar , Steamroller , Puma , Excavator и Zen )
  • (2014+) Процессоры Intel 5-го и 6-го поколения ( Broadwell , Skylake )
  • (2015+) Qualcomm Adreno 5xx серии
  • (2018+) Qualcomm Adreno 6xx серии
  • (2017+) ARM Mali (Bifrost) G51 и G71 в Android 7.1 и Linux
  • (2018+) ARM Mali (Bifrost) G31, G52, G72 и G76
  • (2017+) неполная оценочная поддержка: графические процессоры Nvidia Kepler , Maxwell , Pascal , Volta и Turing (серии GeForce 600, 700, 800, 900 и 10, Quadro серии K, M и P, Tesla K-, M- & P-series) с версией драйвера 378.66+

Поддержка OpenCL 1.2 [ править ]

  • (2011+) для некоторых AMD GCN 1-го поколения некоторые функции OpenCL 2.0 сегодня недоступны, но гораздо больше расширений, чем Terascale
  • (2009+) AMD TeraScale 2 и 3 GPU (RV8xx, RV9xx в HD 5000, 6000 и 7000 серий)
  • (2011+) AMD TeraScale APU (на базе K10 , Bobcat и Piledriver )
  • (2012+) Графические процессоры Nvidia Kepler, Maxwell, Pascal, Volta и Turing (GeForce 600, 700, 800, 900, 10, 16, 20 серии, Quadro K-, M- и P-серии, Tesla K-, M- и P-серия)
  • (2012+) Процессоры Intel 3-го и 4-го поколения ( Ivy Bridge , Haswell )
  • (2013+) Qualcomm Adreno 4xx серии
  • (2013+) ARM Mali Midgard 3-го поколения (T760)
  • (2015+) ARM Mali Midgard 4-го поколения (T8xx)

Поддержка OpenCL 1.1 [ править ]

  • (2008+) некоторые графические процессоры AMD TeraScale 1 (RV7xx в серии HD4000)
  • (2008+) Nvidia Tesla, графические процессоры Fermi (серии GeForce 8, 9, 100, 200, 300, 400, 500, серии Quadro или Tesla с графическим процессором Tesla или Fermi )
  • (2011+) Qualcomm Adreno 3xx серии
  • (2012+) ARM Mali Midgard 1-го и 2-го поколения (T-6xx, T720)

Поддержка OpenCL 1.0 [ править ]

  • в основном обновляется до 1.1 и 1.2 после первого драйвера только для 1.0

Переносимость, производительность и альтернативы [ править ]

Ключевой особенностью OpenCL является переносимость за счет его абстрактной памяти и модели выполнения , и программист не может напрямую использовать аппаратно-зависимые технологии, такие как встроенное параллельное выполнение потоков (PTX) для графических процессоров Nvidia, если они не готовы отказаться от прямой переносимости. на других платформах. Любое ядро ​​OpenCL можно запустить в любой соответствующей реализации.

Однако производительность ядра не обязательно переносима между платформами. Тем не менее, существующие реализации показали свою конкурентоспособность, когда код ядра настроен должным образом, а автонастройка была предложена в качестве решения проблемы переносимости производительности [152], обеспечивающей «приемлемые уровни производительности» в экспериментальных ядрах линейной алгебры. [153] Также была изучена переносимость всего приложения, содержащего несколько ядер с различным поведением, и показано, что переносимость требует лишь ограниченных компромиссов. [154]

Исследование, проведенное в Делфтском университете в 2011 году, в котором сравнивались программы CUDA и их прямой перевод на OpenCL C, показало, что CUDA превосходит OpenCL не более чем на 30% по сравнению с реализацией Nvidia. Исследователи отметили, что их сравнение можно было бы сделать более справедливым, применив ручную оптимизацию к программам OpenCL, и в этом случае у OpenCL не было причин получить худшую производительность, чем CUDA. Различия в производительности в основном могут быть связаны с различиями в модели программирования (особенно модели памяти) и оптимизацией компилятора NVIDIA для CUDA по сравнению с оптимизацией для OpenCL. [152]

Другое исследование, проведенное D-Wave Systems Inc., показало, что «производительность ядра OpenCL примерно на 13–63% медленнее, а время сквозной обработки примерно на 16–67% медленнее», чем у CUDA. [155]

Тот факт, что OpenCL позволяет распределять рабочие нагрузки между ЦП и ГП, выполняя одни и те же программы, означает, что программисты могут использовать и то, и другое, распределяя работу между устройствами. [156] Это приводит к проблеме принятия решения о том, как разделить работу, потому что относительные скорости операций различаются между устройствами. Для решения этой проблемы было предложено машинное обучение : Греве и О'Бойл описывают систему машин опорных векторов, обученных функциям программы во время компиляции, которые могут решить проблему разделения устройства статически, без фактического запуска программ для измерения их производительности. [157]

См. Также [ править ]

  • Расширенная библиотека моделирования
  • AMD FireStream
  • BrookGPU
  • C ++ AMP
  • Близко к металлу
  • CUDA
  • DirectCompute
  • ГПГПУ
  • БЕДРО
  • Ларраби
  • Либ Ш
  • Список приложений OpenCL
  • OpenACC
  • OpenGL
  • OpenHMPP
  • OpenMP
  • Металл
  • RenderScript
  • SequenceL
  • SIMD
  • SYCL
  • Вулкан
  • WebCL

Ссылки [ править ]

  1. ^ "Реестр Khronos OpenCL" . Хронос Групп. 27 апреля 2020 . Проверено 27 апреля 2020 года .
  2. ^ «Устройства Android с поддержкой OpenCL» . Документы Google . ArrayFire . Проверено 28 апреля 2015 года .
  3. ^ "FreeBSD Graphics / OpenCL" . FreeBSD . Проверено 23 декабря 2015 года .
  4. ^ a b c d e «Соответствующие продукты» . Хронос Групп . Проверено 9 мая 2015 года .
  5. ^ Sochacki, Бартош (19 июля 2019). «Спецификация OpenCL C ++ 1.0» (PDF) . Рабочая группа Khronos OpenCL . Проверено 19 июля 2019 года .
  6. ^ Мунши, Афтаб; Хоуз, Ли; Сочаки, Барош (27 апреля 2020 г.). «Версия спецификации OpenCL C: 2.0 Версия документа: 33» (PDF) . Рабочая группа Khronos OpenCL . Проверено 27 апреля 2020 года .
  7. ^ "OpenGL, OpenCL устарели в пользу Metal 2 в macOS 10.14 Mojave" . AppleInsider . Проверено 3 июля 2018 года .
  8. ^ «Соответствующие компании» . Хронос Групп . Проверено 8 апреля 2015 года .
  9. ^ Gianelli, Сильвия Е. (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. ^ a b Гастер, Бенедикт; Хоуз, Ли; Каэли, Дэвид Р .; Мистри, Перхаад; Шаа, Дана (2012). Гетерогенные вычисления с OpenCL: пересмотренная версия OpenCL 1.2 . Морган Кауфманн.
  12. ^ Томпсон, Джонатан; Шлахтер, Кристофер (2012). «Введение в модель программирования OpenCL» (PDF) . Лаборатория медиа-исследований Нью-Йоркского университета. Архивировано из оригинального (PDF) 6 июля 2015 года . Проверено 6 июля 2015 года .
  13. ^ a b c d Стоун, Джон Э .; Гохара, Дэвид; Ши, Гочинь (2010). «OpenCL: стандарт параллельного программирования для гетерогенных вычислительных систем» . Вычислительная техника в науке и технике . 12 (3): 66–73. Bibcode : 2010CSE .... 12c..66S . DOI : 10,1109 / MCSE.2010.69 . PMC 2964860 . PMID 21037981 .  
  14. ^ Клёкнер, Андреас; Пинто, Николас; Ли, Юнсуп; Катандзаро, Брайан; Иванов, Павел; Фасих, Ахмед (2012). «PyCUDA и PyOpenCL: основанный на сценариях подход к генерации кода времени выполнения GPU». Параллельные вычисления . 38 (3): 157–174. arXiv : 0911.3456 . DOI : 10.1016 / j.parco.2011.09.001 .
  15. ^ "OpenCL - Открытые привязки к языку вычислений" . metacpan.org . Проверено 18 августа 2018 года .
  16. ^ «SPIR - первый открытый стандартный промежуточный язык для параллельных вычислений и графики» . Хронос Групп . 21 января 2014.
  17. ^ "SYCL - гетерогенное программирование на C ++ с одним исходным кодом для OpenCL" . Хронос Групп . 21 января 2014.
  18. ^ a b c Афтаб Мунши, изд. (2014). «Спецификация OpenCL C, версия 2.0» (PDF) . Проверено 24 июня 2014 года .
  19. ^ a b «Введение в программирование OpenCL 201005» (PDF) . AMD. С. 89–90. Архивировано из оригинального (PDF) 16 мая 2011 года . Проверено 8 августа 2017 года .
  20. ^ "OpenCL" (PDF) . SIGGRAPH2008. 14 августа 2008 года. Архивировано из оригинального (PDF) 19 марта 2012 года . Проверено 14 августа 2008 года .
  21. ^ "Подгонка БПФ к архитектуре G80" (PDF) . Василий Волков и Брайан Казиан, Калифорнийский университет в Беркли, отчет по проекту CS258. Май 2008 . Проверено 14 ноября 2008 года .
  22. ^ "OpenCL на БПФ" . Яблоко. 16 ноября 2009 . Проверено 7 декабря 2009 года .
  23. ^ «Хронос запускает инициативу по гетерогенным вычислениям» (пресс-релиз). Хронос Групп. 16 июня 2008. Архивировано из оригинала на 20 июня 2008 года . Проверено 18 июня 2008 года .
  24. ^ «OpenCL рекламируется в Техасе» . MacWorld. 20 ноября 2008 . Проверено 12 июня 2009 года .
  25. ^ «Группа Khronos выпускает спецификацию OpenCL 1.0» (пресс-релиз). Хронос Групп. 8 декабря 2008 . Проверено 4 декабря 2016 года .
  26. ^ «Apple представляет разработчикам Mac OS X Snow Leopard» (пресс-релиз). Apple , Inc. 9 июня 2008. Архивировано из оригинального 19 марта 2012 года . Проверено 9 июня 2008 года .
  27. ^ «AMD способствует принятию отраслевых стандартов в разработке программного обеспечения GPGPU» (пресс-релиз). AMD. 6 августа 2008 . Проверено 14 августа 2008 года .
  28. ^ «AMD поддерживает OpenCL, Microsoft DirectX 11» . eWeek. 6 августа 2008 . Проверено 14 августа 2008 года .
  29. ^ «HPCWire: RapidMind охватывает проекты с открытым исходным кодом и стандартами» . HPCWire. 10 ноября 2008 года Архивировано из оригинала 18 декабря 2008 года . Проверено 11 ноября 2008 года .
  30. ^ «Nvidia добавляет OpenCL в свой лучший в отрасли набор инструментов для вычислений на GPU» (пресс-релиз). Nvidia. 9 декабря 2008 . Проверено 10 декабря 2008 года .
  31. ^ «Комплект разработчика OpenCL для Linux on Power» . alphaWorks. 30 октября 2009 . Проверено 30 октября 2009 года .
  32. ^ «Хронос развивает импульс стандарта параллельных вычислений с выпуском спецификации OpenCL 1.1» . Архивировано из оригинального 2 - го марта 2016 года . Проверено 24 февраля 2016 года .
  33. ^ "Khronos выпускает спецификацию OpenCL 1.2" . Хронос Групп. 15 ноября 2011 . Проверено 23 июня 2015 года .
  34. ^ a b c «Спецификация OpenCL 1.2» (PDF) . Хронос Групп . Проверено 23 июня 2015 года .
  35. ^ «Хронос завершает спецификацию OpenCL 2.0 для гетерогенных вычислений» . Хронос Групп. 18 ноября 2013 . Проверено 10 февраля 2014 года .
  36. ^ "Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования" . Хронос Групп. 16 ноября 2015 года . Проверено 16 ноября 2015 года .
  37. ^ «Хронос объявляет об OpenCL 2.1: C ++ приходит в OpenCL» . AnandTech. 3 марта 2015 . Проверено 8 апреля 2015 года .
  38. ^ «Khronos выпускает предварительную спецификацию OpenCL 2.1 для публичного рассмотрения» . Хронос Групп. 3 марта 2015 . Проверено 8 апреля 2015 года .
  39. ^ "Обзор OpenCL" . Хронос Групп. 21 июля 2013 г.
  40. ^ a b «Khronos выпускает предварительную спецификацию OpenCL 2.2 с языком ядра OpenCL C ++ для параллельного программирования» . Хронос Групп . 18 апреля 2016 г.
  41. ^ Треветт, Нил (апрель 2016). «OpenCL - состояние Союза» (PDF) . IWOCL . Вена : Группа Хронос . Проверено 2 января 2017 года .
  42. ^ «Khronos выпускает OpenCL 2.2 с SPIR-V 1.2» . Хронос Групп . 16 мая 2017 года.
  43. ^ a b «Выпущено техническое обновление OpenCL 2.2» . Группа Хронос . 14 мая 2018.
  44. ^ https://www.phoronix.com/scan.php?page=article&item=opencl-30-spec&num=1
  45. ^ https://www.khronos.org/news/press/khronos-group-releases-opencl-3.0
  46. ^ https://www.khronos.org/registry/OpenCL/specs/3.0-unified/pdf/OpenCL_API.pdf
  47. ^ «Нарушение: план слияния OpenCL с Vulkan | Перспектива ПК» . www.pcper.com . Архивировано из оригинала на 1 ноября 2017 года . Проверено 17 мая 2017 года .
  48. ^ "SIGGRAPH 2018: OpenCL-Next обретает форму, Vulkan продолжает развиваться - Phoronix" . www.phoronix.com .
  49. ^ Clspv - это прототип компилятора для подмножества вычислительных шейдеров OpenCL C для Vulkan: google / clspv , 17 августа 2019 г. , получено 20 августа 2019 г.
  50. ^ "Vulkan Update SIGGRAPH 2019" (PDF) .
  51. ^ Треветт, Нил (23 мая 2019). "Обзор Khronos и OpenCL, семинар EVS, 19 мая" (PDF) . Хронос Групп .
  52. ^ «Спецификация OpenCL ICD» . Проверено 23 июня 2015 года .
  53. ^ «Запись Apple на странице пользователей LLVM» . Проверено 29 августа 2009 года .
  54. ^ "Запись Nvidia на странице пользователей LLVM" . Проверено 6 августа 2009 года .
  55. ^ "Запись Rapidmind на странице пользователей LLVM" . Проверено 1 октября 2009 года .
  56. ^ "Сообщение в блоге Зака ​​Русина о реализации Gallium3D OpenCL" . Февраль 2009 . Проверено 1 октября 2009 года .
  57. ^ "GalliumCompute" . dri.freedesktop.org . Проверено 23 июня 2015 года .
  58. ^ «Обновление статуса клевера» (PDF) .
  59. ^ «Меса / Меса - Библиотека 3D-графики Меса» . cgit.freedesktop.org .
  60. ^ «Галлиевый клевер с SPIR-V и NIR, открывающий новые вычислительные возможности внутри Mesa - Phoronix» . www.phoronix.com .
  61. ^ https://xdc2018.x.org/slides/clover.pdf
  62. ^ Larabel, Майкл (10 января 2013). «Beignet: OpenCL / GPGPU приходит для Ivy Bridge в Linux» . Фороникс .
  63. ^ Larabel, Майкл (16 апреля 2013). «Больше критики приходит к Intel Beignet OpenCL» . Фороникс .
  64. ^ Larabel, Майкл (24 декабря 2013). «Intel Beignet OpenCL все еще медленно работает» . Фороникс .
  65. ^ "Бенье" . freedesktop.org.
  66. ^ «beignet - Библиотека Beignet OpenCL для Intel Ivy Bridge и новых графических процессоров» . cgit.freedesktop.org .
  67. ^ «Intel приносит Beignet в Android для вычислений OpenCL - Phoronix» . www.phoronix.com .
  68. ^ "01.org Intel Open Source - Compute Runtime" . 7 февраля 2018.
  69. ^ "NEO GitHub README" . 21 марта 2019.
  70. ^ "ROCm" . GitHub . Архивировано из оригинала 8 октября 2016 года.
  71. ^ «RadeonOpenCompute / ROCm: ROCm - платформа с открытым исходным кодом для высокопроизводительных вычислений и сверхмасштабных вычислений на GPU» . GitHub. 21 марта 2019.
  72. ^ "Хороший обзор вычислительного стека ROCm Linux - Phoronix" . www.phoronix.com .
  73. ^ "XDC Lightning.pdf" . Документы Google .
  74. ^ «Radeon ROCm 2.0 официально вышла с поддержкой OpenCL 2.0, TensorFlow 1.12, 48-битная VA Vega - Phoronix» . www.phoronix.com .
  75. ^ «Использование Radeon ROCm 2.0 OpenCL для тестирования производительности - Phoronix» . www.phoronix.com .
  76. ^ https://github.com/RadeonOpenCompute/ROCm/blob/master/AMD_ROCm_Release_Notes_v3.3.pdf
  77. ^ https://www.phoronix.com/scan.php?page=news_item&px=Radeon-ROCm-3.5-Released
  78. ^ https://www.phoronix.com/scan.php?page=news_item&px=Radeon-ROCm-3.10-Released
  79. ^ https://www.phoronix.com/scan.php?page=article&item=amd-mi100-rocm4&num=1
  80. ^ https://rocm-documentation.readthedocs.io/en/latest/
  81. ^ Яэскеляйнен, Пекка; Санчес де ла Лама, Карлос; Шнеттер, Эрик; Райскила, Калле; Такала, Ярмо; Берг, Хейкки (2016). «pocl: высокопроизводительная реализация OpenCL». Int'l J. Параллельное программирование . 43 (5): 752–785. arXiv : 1611.07083 . Bibcode : 2016arXiv161107083J . DOI : 10.1007 / s10766-014-0320-у .
  82. ^ a b c "домашняя страница pocl" . pocl .
  83. ^ "GitHub - pocl / pocl: pocl: Portable Computing Language" . 14 марта 2019 г. - через GitHub.
  84. ^ «Статус реализации поддержки HSA по состоянию на 17 мая 2016 года - Portable Computing Language (pocl) 1.3-pre documentation» . Portablecl.org .
  85. ^ http://portablecl.org/pocl-1.3.html
  86. ^ http://portablecl.org/pocl-1.4.html
  87. ^ http://portablecl.org/pocl-1.5.html
  88. ^ https://www.phoronix.com/scan.php?page=news_item&px=POCL-1.6-RC1-Released
  89. ^ "О" . Git.Linaro.org .
  90. ^ Галл, Т .; Питни, Г. (6 марта 2014 г.). «LCA14-412: GPGPU на ARM SoC» (PDF) . Amazon Web Services . Проверено 22 января 2017 года .
  91. ^ "zuzuf / freeocl" . GitHub . Проверено 13 апреля 2017 года .
  92. ^ Чжан, Пэн; Фанг, Цзяньбинь; Ян, Канкун; Тан, Дао; Хуанг, Чун; Ван, Чжэн (2018). MOCL: эффективная реализация OpenCL для архитектуры Matrix-2000 (PDF) . Proc. Международная конф. на компьютерных границах. DOI : 10.1145 / 3203217.3203244 .
  93. ^ «OpenCL Demo, AMD CPU» . 10 декабря 2008 . Проверено 28 марта 2009 года .
  94. ^ «OpenCL Demo, Nvidia GPU» . 10 декабря 2008 . Проверено 28 марта 2009 года .
  95. ^ "Imagination Technologies выпускает передовое, высокоэффективное семейство IP-адресов мультипроцессорной графики POWERVR SGX543MP" . Воображаемые технологии. 19 марта 2009 . Проверено 30 января 2011 года .
  96. ^ "AMD и Havok демонстрируют ускоренную физику OpenCL" . Перспектива ПК. 26 марта 2009 года в архив с оригинала на 5 апреля 2009 года . Проверено 28 марта 2009 года .
  97. ^ «Nvidia выпускает драйвер OpenCL для разработчиков» . Nvidia. 20 апреля 2009 года Архивировано из оригинального 19 марта 2012 года . Проверено 27 апреля 2009 года .
  98. ^ «AMD реверсирует GPGPU, анонсирует OpenCL SDK для x86» . Ars Technica. 5 августа 2009 . Проверено 6 августа 2009 года .
  99. ^ Морен, Дэн; Снелл, Джейсон (8 июня 2009 г.). «Обновление в реальном времени: основной доклад WWDC 2009» . MacWorld.com . MacWorld . Проверено 12 июня 2009 года .
  100. ^ "Программа разработки программного обеспечения ATI Stream (SDK) v2.0 Beta" . Архивировано из оригинала на 9 августа 2009 года . Проверено 14 октября 2009 года .
  101. ^ «S3 Graphics выпустила встроенный графический процессор Chrome 5400E» . Архивировано из оригинала на 2 декабря 2009 года . Проверено 27 октября 2009 года .
  102. ^ «VIA предлагает усовершенствованный графический процессор VN1000]» . Архивировано из оригинального 15 декабря 2009 года . Проверено 10 декабря 2009 года .
  103. ^ «ATI Stream SDK v2.0 с поддержкой OpenCL 1.0» . Архивировано из оригинала на 1 ноября 2009 года . Проверено 23 октября 2009 года .
  104. ^ "OpenCL" . ZiiLABS . Проверено 23 июня 2015 года .
  105. ^ «Intel раскрывает новые технические подробности Sandy Bridge» . Проверено 13 сентября 2010 года .
  106. ^ "Истории, связанные с WebCL" . Хронос Групп . Проверено 23 июня 2015 года .
  107. ^ "Khronos выпускает окончательную спецификацию WebGL 1.0" . Хронос Групп. Архивировано из оригинала 9 июля 2015 года . Проверено 23 июня 2015 года .
  108. ^ «Сообщество» .
  109. ^ «Добро пожаловать в Вики» . www.ibm.com . 20 октября 2009 г.
  110. ^ «Nokia Research выпускает прототип WebCL» . Хронос Групп. 4 мая 2011 . Проверено 23 июня 2015 года .
  111. ^ KamathK, Sharath. «Прототип Samsung WebCL для WebKit» . Github.com. Архивировано из оригинала 18 февраля 2015 года . Проверено 23 июня 2015 года .
  112. ^ «AMD открывает дроссель производительности APU с помощью обновленной разработки программного обеспечения OpenCL» . Amd.com. 8 августа 2011 . Проверено 16 июня 2013 года .
  113. ^ «AMD APP SDK v2.6» . Forums.amd.com. 13 марта 2015 . Проверено 23 июня 2015 года .
  114. ^ "Portland Group объявляет о выпуске компилятора OpenCL для SoC NovaThor на базе ARM ST-Ericsson" . Проверено 4 мая 2012 года .
  115. ^ "Последняя спецификация WebCL" . Хронос Групп . 7 ноября, 2013. Архивировано из оригинала на 1 августа 2014 года . Проверено 23 июня 2015 года .
  116. ^ «Altera открывает мир FPGA для программистов с широкой доступностью SDK и готовых плат для OpenCL» . Altera.com. Архивировано из оригинала 9 января 2014 года . Проверено 9 января 2014 года .
  117. ^ «Altera SDK для OpenCL является первым в отрасли, достигшим соответствия Khronos для FPGA» . Altera.com. Архивировано из оригинала 9 января 2014 года . Проверено 9 января 2014 года .
  118. ^ «Хронос завершает спецификацию OpenCL 2.0 для гетерогенных вычислений» . Хронос Групп. 18 ноября 2013 . Проверено 23 июня 2015 года .
  119. ^ "Пресс-релиз WebCL 1.0" . Хронос Групп. 19 марта 2014 . Проверено 23 июня 2015 года .
  120. ^ «Спецификация WebCL 1.0» . Хронос Групп. 14 марта 2014 . Проверено 23 июня 2015 года .
  121. ^ «Драйвер Intel OpenCL 2.0» . Архивировано из оригинального 17 сентября 2014 года . Проверено 14 октября 2014 года .
  122. ^ «Драйвер AMD OpenCL 2.0» . Support.AMD.com . 17 июня 2015 года . Проверено 23 июня 2015 года .
  123. ^ "Среда разработки Xilinx SDAccel для OpenCL, C и C ++ достигает соответствия Khronos - новости khronos.org" . Группа Хронос . Проверено 26 июня 2017 года .
  124. ^ «Драйверы графики выпуска 349 для Windows, версия 350.12» (PDF) . 13 апреля 2015 . Проверено 4 февраля, 2016 .
  125. ^ «Выпущен AMD APP SDK 3.0» . Developer.AMD.com . 26 августа 2015 года . Проверено 11 сентября 2015 года .
  126. ^ "Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования" . Хронос Групп . 16 ноября 2015 года.
  127. ^ «Что нового? Intel® SDK для приложений OpenCL ™ 2016, R3» . Программное обеспечение Intel.
  128. ^ «Драйверы NVIDIA 378.66 для Windows предлагают оценочную поддержку OpenCL 2.0» . Хронос Групп . 17 февраля 2017 года.
  129. ^ Szuppe, Якуб (22 февраля 2017). «NVIDIA включает бета-поддержку OpenCL 2.0» .
  130. ^ Szuppe, Якуб (6 марта 2017). «Бета-поддержка NVIDIA для OpenCL 2.0 работает и в Linux» .
  131. ^ "Группа Хронос" . Группа Хронос . 21 марта 2019.
  132. ^ https://github.com/RadeonOpenCompute/ROCm/tree/roc-3.5.0
  133. ^ "Группа Хронос" . Группа Хронос . 20 августа 2019 . Проверено 20 августа 2019 года .
  134. ^ "KhronosGroup / OpenCL-CTL: Тесты на соответствие OpenCL" . GitHub. 21 марта 2019.
  135. ^ «OpenCL и AMD APP SDK» . Центр разработчиков AMD . developer.amd.com. Архивировано из оригинала на 4 августа 2011 года . Проверено 11 августа 2011 года .
  136. ^ «О Intel OpenCL SDK 1.1» . software.intel.com . intel.com . Проверено 11 августа 2011 года .
  137. ^ «Intel® SDK для приложений OpenCL ™ - примечания к выпуску» . software.intel.com . 14 марта 2019.
  138. ^ «Поддержка продукта» . Проверено 11 августа 2011 года .
  139. ^ «Intel OpenCL SDK - Примечания к выпуску» . Архивировано из оригинала 17 июля 2011 года . Проверено 11 августа 2011 года .
  140. ^ "Объявление о выпуске пакета разработки OpenCL для Linux на Power v0.3" . Проверено 11 августа 2011 года .
  141. ^ «IBM выпускает OpenCL Development Kit для Linux на Power v0.3 - доступна версия, совместимая с OpenCL 1.1» . OpenCL Lounge . ibm.com . Проверено 11 августа 2011 года .
  142. ^ «IBM выпускает OpenCL Common Runtime для Linux на архитектуре x86» . 20 октября 2009 . Проверено 10 сентября 2011 года .
  143. ^ «OpenCL и AMD APP SDK» . Центр разработчиков AMD . developer.amd.com. Архивировано из оригинального 6 -го сентября 2011 года . Проверено 10 сентября 2011 года .
  144. ^ «Nvidia выпускает драйвер OpenCL» . 22 апреля 2009 . Проверено 11 августа 2011 года .
  145. ^ "Clinfo Саймона Леблана" . Проверено 27 января 2017 года .
  146. ^ "Клинфо Обломова" . Проверено 27 января 2017 года .
  147. ^ "Clinfo: ИНФОРМАЦИЯ об openCL" . Проверено 27 января 2017 года .
  148. ^ "Продукты Хроноса" . Группа Хронос . Проверено 15 мая 2017 года .
  149. ^ https://github.com/KhronosGroup/OpenCL-CTS/tree/master/test_conformance
  150. ^ https://www.phoronix.com/scan.php?page=news_item&px=Intel-Compute-20.43.18277
  151. ^ "время выполнения вычислений" . 01.org . 7 февраля 2018.
  152. ^ a b Фанг, Цзяньбинь; Варбанеску, Ана Люсия; Глоток, Хенк (2011). Комплексное сравнение производительности CUDA и OpenCL . Proc. Международная конф. по параллельной обработке. DOI : 10.1109 / ICPP.2011.45 .
  153. ^ Ду, Пэн; Вебер, Рик; Лущек, Петр; Томов, Станимире; Петерсон, Грегори; Донгарра, Джек (2012). «От CUDA к OpenCL: на пути к портативному решению для многоплатформенного программирования на GPU». Параллельные вычисления . 38 (8): 391–407. CiteSeerX 10.1.1.193.7712 . DOI : 10.1016 / j.parco.2011.10.002 . 
  154. ^ Dolbeau, Ромен; Боден, Франсуа; де Вердьер, Гийом Колен (7 сентября 2013 г.). «Один OpenCL, чтобы управлять ими всеми?». Шестой международный семинар IEEE 2013 г. по многоядерным вычислительным системам (MuCoCoS) . С. 1–6. DOI : 10.1109 / MuCoCoS.2013.6633603 . ISBN 978-1-4799-1010-6.
  155. ^ Карими, Камран; Диксон, Нил Дж .; Хамзе, Фирас (2011). «Сравнение производительности CUDA и OpenCL». arXiv : 1005.2581v3 [ cs.PF ].
  156. ^ Обзор методов гетерогенных вычислений CPU-GPU, ACM Computing Surveys, 2015.
  157. ^ Греве, Доминик; О'Бойл, Майкл FP (2011). Подход статического разделения задач для гетерогенных систем с использованием OpenCL . Proc. Международная конф. по конструкции компилятора. DOI : 10.1007 / 978-3-642-19861-8_16 .

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Официальный сайт дляWebCL
  • Международный семинар по OpenCL ( IWOCL ), спонсируемый The Khronos Group