Автор (ы) | Apple Inc. |
---|---|
Разработчик (и) | Khronos Group |
Первоначальный выпуск | 28 августа 2009 г.; 11 лет назад (28 августа 2009 г.) |
Стабильный выпуск | 3.0 / 27 апреля 2020 г.; 6 месяцев назад (27.04.2020) |
Написано на | C с привязками C ++ |
Операционная система | Android (зависит от производителя), FreeBSD, Linux, macOS, Windows |
Platform | ARMv7, ARMv8, Cell, IA-32, POWER, x86-64 |
Тип | Гетерогенные вычисления API |
Лицензия | Лицензия на спецификация OpenCL |
Веб-сайт | www.khronos.org / opencl / |
Paradigm | Императивный (процедурный ), структурированный, объектно-ориентированный (только C ++) |
---|---|
Семейство | C |
Стабильный выпуск | OpenCL C ++ 1.0 версии V2. 2-11 OpenCL C 3.0 revision V3.0.1 / 27 апреля 2020 г.; 6 месяцев назад (27.04.2020) |
Дисциплина ввода | Статический, слабый, манифест, номинальный |
язык реализации | Зависит от реализации |
Расширения имен файлов | .cl |
Веб-сайт | www.khronos.org / opencl |
Основные реализации | |
AMD, Apple, freeocl, Gallium Compute, IBM, Intel Beignet, Intel SDK, Texas Instruments, Nvidia, pocl | |
Под акту | |
C99, CUDA, C ++ 14 |
OpenCL (Open Computing Language ) - это среда для написания программ, которые выполняются на гетерогенных платформах, состоящих из центральных процессоров. (CPU), графические процессоры (GPU), процессоры цифровых сигналов (DSP), программируемые вентильные матрицы (FPGA) и другие процессоры или аппаратные ускорители. OpenCL определяет языки программирования (на основе C99 и C ++ 11 ) для программирования устройств и интерфейсов прикладного программирования <этих 361>(API) для управления платформой и выполнения программ на вычислительных устройствах. OpenCL стандартный интерфейс для параллельных вычислений с использованием задач- и параллелизма на основе данных.
OpenCL - это открытый стандарт, поддерживаемый некоммерческой технологический консорциум Группа Хронос. Соответствующие доступные реализации от Altera, AMD, Apple (OpenCL вместе с OpenGL является устаревшим для оборудования Apple, в пользу Металл 2), ARM, Creative, IBM, Imagination, Intel, Nvidia, Qualcomm, Samsung, Vivante, Xilinx и ZiiLABS.
OpenCL рассматривает вычислительную систему как состоящую из ряда вычислительных устройств, которые могут быть центральными процессорами (CPU) или «ускорители» », Такие как графические процессоры (GPU), подключенные к главному процессору (CPU). Он определяет C-подобный язык для написания программ. Функции, выполняемые на устройстве OpenCL, называются «ядрами ». Одно вычислительное устройство обычно состоит из нескольких вычислительных блоков, которые, в свою очередь, содержат несколько элементов обработки (PE). Выполнение одного ядра может работать на всех или многих PE параллельно. Как вычислительное устройство подразделяется на вычислительные блоки и PE, зависит от поставщика; вычислительную единицу можно определить как «ядро », но понятие ядра для всех типов устройств, поддерживаемых OpenCL (или даже в категории «ЦП»), и количество вычислительных единиц может не соответствовать количеству ядер, заявленному в маркетинговой литературе поставщиков (которая может фактически подсчитывать SIMD-линии ).
В дополнение к своему C-подобному языку программирования OpenCL содержит приложение программный интерфейс (API), позволяет программам, запущенным на который хосте, запускать ядро на вычислительных устройствах и управлять памятью устройства, которая (по крайней мере, концептуально) отделена от памяти хоста Программы на языке OpenCL предназначены для компилируется во время выполнения, так что приложения, использующие OpenCL, могут переноситься между Стандарт OpenCL определяет хост-API для C и C ++ ; третий - сторонние API существуют для других языков ков программирования и платформ, таких как Python, Java, Perl и .NET. реализация стандарта OpenCL состоит из библиотеки, которая реализует API для C и C ++, и компилятора OpenCL C для целевого вычислительного устройства (ов).
Чтобы открыть модель программирования OpenCL для других языков или защитить исходный код ядра от проверки, Стандартное переносимое промежуточное представление (SPIR) может помочь переносить ядро между интерфейсным компилятором и бэкендом OpenCL.
Совсем недавно Khronos Group ратифицировала SYCL, модель программирования более высокого уровня для OpenCL с одним исходным кодом DSEL, основанную на чистом C ++ 11 для повышения продуктивности программирования.
OpenCL определяет четырехуровневую иерархию памяти для вычислительного устройства:
Не каждое устройство должно аппаратно реализовывать каждый уровень этой иерархии. Согласованность между различными уровнями иерархии ослаблена и обеспечивается только с помощью явных конструкций синхронизации, в частности, барьеров.
Устройство может или не совместно использовать память с центральным процессором. API предоставляет , обрабатывает буферы памяти и функции для передачи данных между хостом и устройствами.
Язык программирования, который используется для записи вычислительных ядер, называется OpenCL C и основан на C99, но адаптирован для соответствия модели устройства в OpenCL. Буферы памяти на определенных уровнях иерархии памяти, а также указатели аннотируются квалификаторами области __global, __local, __constant и __private, отражающий это. Вместо программы устройства, имеющей главную функцию, функции OpenCL C помечаются __kernel, чтобы сигнализировать, что они являются точками входа в программу, которая должна быть вызвана из главной программы. Указатели на функции, битовые поля и массивы значений длины опущены, а рекурсия запрещена. Стандартная библиотека C заменена специальным набором стандартных функций, ориентированное на математическое программирование.
OpenCL C расширен для облегчения использования параллелизма с векторными типами и операциями, синхронизацией и функциями для работы с рабочими элементами и рабочими группами. В частности, помимо скалярных типов, таких как float и double, которые ведут себя так же, как соответствующие типы в C, OpenCL предоставляет типовые фиксированные длины, такие как float4 (4-векторных числа с плавающей запятой одинарной точности); такие типы доступны в длинах два, три, четыре, восемь и шестнадцать для различных базовых типов. Векторизованные операции над этими типами предназначены для отображения наборов инструкций SIMD, например, SSE или VMX при запуске программ OpenCL на процессорах. Другие специализированные типы двумерных и трехмерных изображений.
Ниже представлено алгоритм умножения матрицы на вектор в 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[i] = sum; }
Функция ядра matvec вычисляет при каждом вызове скалярное произведение одной строки матрицы A и вектор х:
Чтобы расширить это до полное умножения матрицы на вектор, среда выполнения OpenCL отображает ядро по строкам матрицы. На стороне хоста это выполняет функцию clEnqueueNDRangeKernel; принимает в качестве аргументов выполняемое ядро, его аргументы и количество рабочих элементов, соответствующее количество строк в матрице A.
В этом тесте будет выполнить быстрое преобразование Фурье (БПФ) и выполнить ее. библиотеки OpenCL доступную графическую карту, буферы памяти для чтения и записи (с точки видеокарта), JIT-компилирует F FT-ядро, а зате м, наконец, асинхронно запускает ядро. Результат преобразования в этом примере не читается.
#include#include #include "CL / opencl.h" #define NUM_ENTRIES 1024 int 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 (context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof (float) * 2 * NUM_ENTRIES, NULL, NULL), clCreateBuffer (context, NUM_MEM_READ_НА_WRITE); // 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, NULL); clSetKernelArg (ядро, 3, sizeof (float) * (local_work_size [0] + 1) * 16, NULL); // создать объект диапазона N-D с размерами рабочего элемента и выполнить ядро 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 ):
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); blockIdx = get_group_id (0) * 1024 + tid; float2 data [16]; // начальный индекс данных в / из глобальной памяти in = in + blockIdx; out = out + blockIdx; globalLoads (data, in, 64); // fftRadix16Pass (data); // передача на месте radix-16 twiddleFactorMul (data, tid, 1024, 0); // локальное перемешивание с использованием локальной памяти localShuffle (data, sMemx, sMemy, tid, (((tid 15) * 65) + (tid>>4))); fftRadix16Pass (data); // на месте передаем radix-16 twiddleFactorMul (data, tid, 64, 4); // умно жение множителя twiddle localShuffle (данные, sMemx, sMemy, tid, (((t id>>4) * 64) + (tid 15))); // четыре вызова функции radix-4 fftRadix4Pass (data); // функция счисления 4 счисления 1 fftRadix4Pass (data + 4); // функция основания 4 счисления 2 fftRadix4Pass (data + 8); // функция счисления 4 счисления 3 fftRadix4Pass (data + 12); // функция счисления 4 по системе счисления // объединенная глобальная запись globalStores (data, out, 64); }) "
Полную работу OpenCL FFT с открытым исходным кодом можно найти на веб-сайте Apple.
Первоначально OpenCL был разработан Apple Inc., которому принадлежат права на товарный знак , и преобразовано в исходное предложение в сотрудничестве с техническими группами в AMD, IBM, Qualcomm, Intel и Nvidia. Apple представила это первоначальное предложение в Khronos Group. 16 июня 2008 года была сформирована рабочая группа Khronos Compute, в которую вошли представленные CPU и GPU., Производители встроенных процессоров и программного обеспечения.Эта группа работала в течение пяти месяцев, чтобы закончить технические детали спецификации для OpenCL 1.0 к 18 ноября 2008 г. Эта техническая спецификация была рассмотрена членами Khronos и одобрена для публичного выпуска 8 декабря 2008 г.
OpenCL 1.0 выпущен с Mac OS X Snow Leopard 28 августа 20 09 года. Согласно пресс-релизу Apple:
Snow Leopard расширяет возможности поддержки современного оборудования с помощью Open Computing Language (OpenCL), который позволяет приложению использовать огромные гигафлопы вычислительной мощности графического процессора, ранее доступных только для графических приложений. OpenCL основан на языке программирования C и был предложен в качестве открытого стандарта.
AMD решила поддерживать OpenCL вместо устаревшего Close to Metal в своей Stream framework. RapidMind объявила о принятии OpenCL в рамках своей платформы разработки, чтобы поддержка графических процессоров от нескольких производителей с помощью одного интерфейса. 9 декабря 2008 года Nvidia заявила о намерении добавить полную спецификацию OpenCL 1.0 в свой набор для вычислений на GPU. 30 октября 2009 г. IBM выпустила свою первую OpenCL как часть.
OpenCL 1.1 был ратифицирован Khronos Group 14 июня 2010 г. Улучшенная гибкость, функциональность и параллельного программирования, включая:
15 ноября 2011 года компания Khronos Group анонсировала спецификацию OpenCL 1.2. Функция, которая значительно увеличила функциональность по сравнению с предыдущими версиями с точки зрения производительности и параллельного программирования. Наиболее примечательные особенности включают:
18 ноября 2013 года Khronos Group объявила о ратификации и публичном выпуск доработанной спецификации Open CL 2.0. Обновления и дополнения к OpenCL 2.0 включают:
О ратификации и выпуске предварительной спецификации OpenCL 2.1 было объявлено 3 марта 2015 года на конференции разработчиков игр в Сан-Франциско.. Он был выпущен 16 ноября 2015 г. Он представил язык ядра OpenCL C ++, основанный на подмножестве C ++ 14, при сохранении поддержки уже существующего языка ядра OpenCL C. Vulkan и OpenCL 2.1 совместно используют SPIR-V как промежуточное представление, позволяя интерфейсным программам на языке высокого уровня использовать общую цель компиляции. Обновления OpenCL API включают:
AMD, ARM, Intel, HPC и заявлена поддержка OpenCL 2.1.
OpenCL 2.2 включает язык ядра OpenCL C ++ в базовую спецификацию для значительного повышения производительности параллельного программирования. Он был выпущен 16 мая 2017 года. Техническое обновление выпущено в мае 2018 года с исправлениями ошибок.
OpenCL 3.0 находится в предварительном режиме. OpenCL 1.2 является обязательным. Все модули OpenCL 2.x и новые модули 3.0 не являются обязательными. Новый предпочтительный язык - C ++ для OpenCL со многими функциями C ++ 17.
При выпуске OpenCL 2.2, Khronos Group объявила, что OpenCL по возможности объединится с Vulkan, чтобы обеспечить гибкость развертывания программного обеспечения OpenCL для обоих API. Теперь это было продемонстрировано Adobe Premiere Rush с использованием компилятора с открытым исходным кодом clspv для компиляции значительных объемов кода ядра OpenCL C для запуска в среде выполнения Vulkan для развертывания на Android. OpenCL имеет перспективную дорожную карту, независимую от Vulkan, с OpenCL Next в стадии разработки и нацеленной на выпуск в 2020 году. OpenCL Next может интегрировать такие расширения, как Vulkan / OpenCL Interop, Scratch-Pad Memory Management, Extended Subgroups, SPIR-V 1.4. SPIR-V Расширенная отладочная информация. OpenCL также рассматривает Vulkan-подобный загрузчик и уровни и «гибкий профиль» для гибкости развертывания на нескольких типах ускорителей.
OpenCL состоит из набора заголовков и общий объект, который загружается во время выполнения. Устанавливаемый клиентский драйвер (ICD) должен быть установлен на платформе для каждого класса поставщиков, для которых среда выполнения должна поддерживать. То есть, например, для поддержки устройств Nvidia на платформе Linux необходимо установить Nvidia ICD, чтобы среда выполнения OpenCL (загрузчик ICD) могла найти ICD для поставщика и соответствующим образом перенаправить вызовы.. Стандартный заголовок OpenCL используется приложением-потребителем; затем вызовы каждой функции передаются средой выполнения OpenCL через прокси соответствующему драйверу с помощью ICD. Каждый поставщик должен реализовать каждый вызов OpenCL в своем драйвере.
Реализации OpenCL Apple, Nvidia, RapidMind и Gallium3D основаны на LLVM Компилятор и используйте компилятор Clang в качестве интерфейса.
По состоянию на 2016 год OpenCL работает на графических процессорах, ЦП с инструкциями SIMD, FPGA, Movidius Myriad 2, Adapteva Epiphany и DSP.
Khronos Group поддерживает расширенный список OpenCL-совместимых продуктов.
Краткое содержание продуктов, совместимых с OpenCL, | ||||
---|---|---|---|---|
AMD SDK (поддерживает OpenCL CPU и устройство ускоренной обработки Devices), (GPU: Terascale 1: OpenCL 1.1, Terascale 2 : 1.2, GCN 1: 1.2+, GCN 2+: 2.0+) | X86 + SSE2 (или выше) совместимые процессоры 64-битные и 32-битные, ПК с Linux 2.6, ПК с Windows Vista / 7 / 8.x / 10 | AMD Fusion E-350, E-240, C-50, C-30 с HD 6310 / HD 6250 | AMD Radeon / Mobility HD 6800, GPU серии HD 5x00, iGPU HD 6310 / HD 6250, HD 7xxx, HD 8xxx, R2xx, R3xx, RX 4xx, RX 5xx, Vega Series | Графический процессор AMD FirePro серии Vx800 и более поздние версии, Radeon Pro |
Intel SDK для приложений OpenCL 2013 (поддерживает процессоры Intel Core и Intel HD Graphics 4000/2500) актуальный 2017 R2 с OpenCL 2.1 (Gen7 +), SDK 2019 в бета-версии, | Intel процессоры с поддержкой SSE 4.1, SSE 4.2 или AVX. Microsoft Windows, Linux | Intel Core i7, i5, i3 ; Intel Core i7 / 5/3 2-го поколения, Intel 3-го поколения
Последняя правка сделана 2021-06-01 12:36:26
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное). |