OpenCL | это... Что такое OpenCL? (original) (raw)

OpenCL

Тип API
Разработчик Apple Inc., Khronos Group
Операционная система Кроссплатформенное программное обеспечение
Первый выпуск 9 декабря 2008
Последняя версия 1.2 (15 ноября 2011)
Лицензия Свободная
Сайт http://www.khronos.org/opencl/

OpenCL (от англ. Open Computing Language — открытый язык вычислений) — фреймворк для написания компьютерных программ, связанных с параллельными вычислениями на различных графических (англ. GPU) и центральных процессорах (англ. CPU). В фреймворк OpenCL входят язык программирования, который базируется на стандарте C99, и интерфейс программирования приложений (англ. API). OpenCL обеспечивает параллелизм на уровне инструкций и на уровне данных и является реализацией техники GPGPU. OpenCL является полностью открытым стандартом, его использование не облагается лицензионными отчислениями.

Цель OpenCL состоит в том, чтобы дополнить OpenGL и OpenAL, которые являются открытыми отраслевыми стандартами для трёхмерной компьютерной графики и звука, пользуясь возможностями GPU. OpenCL разрабатывается и поддерживается некоммерческим консорциумом Khronos Group, в который входят много крупных компаний, включая Apple, AMD, Intel, Nvidia, ARM, Sun Microsystems, Sony Computer Entertainment и другие.

Содержание

История

OpenCL первоначально был разработан в компании Apple Inc. Apple внесла предложения по разработке спецификации в комитет Khronos. Вскоре компания AMD решила поддержать разработку OpenCL (и DirectX 11), который должен заменить фреймворк Close to Metal. [1] [2]

16 июня 2008 года была сформирована рабочая группа Khronos Compute для разработки спецификаций OpenCL. В нее вошли Apple, nVidia, AMD, IBM, Intel, ARM, Motorola и другие компании, в том числе специализирующиеся на создании компьютерных игр. Работа велась в течение пяти месяцев, по истечении которых 9 декабря 2008 года организация Khronos Group представила первую версию стандарта.

OpenCL 1.0 была выпущена вместе с Mac OS X 10.6. [3]

5 апреля 2009 года компания AMD анонсировала доступность для загрузки beta-версии комплекта разработчика ATI Stream SDK v2.0 в который входит язык мультипроцессорного программирования OpenCL.

20 апреля 2009 года nVidia представила бета-драйвер и комплект для разработки программного обеспечения (SDK) с поддержкой открытого GPGPU-стандарта OpenCL. Данный бета-драйвер предназначен для разработчиков, участвующих в программе «OpenCL Early Access», которые уже с 20 апреля могут принять участие в тестировании бета-версии. Для участников программы «GPU Computing Registered Developers» бета-версия драйвера OpenCL будет доступна позже.[4][5][6]

26 ноября 2009 года компания nVidia выпустила драйвер с поддержкой OpenCL 1.0 (rev 48).

Для получения наглядного представления, как технология OpenCL использует возможности 24-ядерной системы для отрисовки видеоэффектов, рекомендуется посмотреть следующий демо-ролик: [1].

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

OpenCL 1.2 увидел свет 15 ноября 2011 года. В новой версии отмечено множество небольших улучшений, связанных с увеличением гибкости языка и оптимизацией производительности. Из добавленных в OpenCL 1.2 значительных новшеств отмечается:

События

Особенности языка

Ключевыми отличиями используемого языка от Си (стандарт ISO 1999 года) являются:

Примеры

Пример вычисления БПФ: [9]

// создание вычислительного контекста для GPU (видеокарты) context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);

// создание очереди команд queue = clCreateCommandQueue(context, NULL, 0, NULL);

// выделение памяти в виде буферов memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)2num_entries, srcA, NULL); memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)2num_entries, NULL, NULL);

// создание программы из исходных текстов program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);

// компиляция программы clBuildProgram(program, 0, NULL, NULL, NULL, NULL);

// создание объекта kernel из скомпилированной программы kernel = clCreateKernel(program, "fft1D_1024", NULL);

// подготовка аргументов 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);

// задание N-D диапазона с размерностями work-item и отправка в очередь исполнения global_work_size[0] = num_entries; local_work_size[0] = 64; clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

Непосредственные вычисления (Основаны на отчете «Fitting FFT onto the G80 Architecture»)[10]

// Данный код вычисляет FFT длины 1024, путем разбиения на 16, 16 и 4

__kernel void fft1D_1024 (__global float2 *in, __global float2 *out, __local float *sMemx, __local float *sMemy) { int tid = get_local_id(0); int blockIdx = get_group_id(0) * 1024 + tid; float2 data[16];

// адрес начала обрабатываемых данных в глобальной памяти
in = in + blockIdx;  out = out + blockIdx;

globalLoads(data, in, 64); // coalesced global reads
fftRadix16Pass(data);      // in-place radix-16 pass
twiddleFactorMul(data, tid, 1024, 0);

// локальная перестановка с использованием локальной памяти
localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));
fftRadix16Pass(data);               // in-place radix-16 pass
twiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplication

localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));

// 4 вызова БПФ порядка 4
fftRadix4Pass(data);      // radix-4 function number 1
fftRadix4Pass(data + 4);  // radix-4 function number 2
fftRadix4Pass(data + 8);  // radix-4 function number 3
fftRadix4Pass(data + 12); // radix-4 function number 4

// coalesced global writes
globalStores(data, out, 64);

}

Полноценная реализация БПФ на OpenCL доступна на сайте Apple[11]

Применение

OpenCL находит применение, как одна из реализаций концепции GPU общего назначения, в различном ПО.

См. также

Примечания

  1. AMD Drives Adoption of Industry Standards in GPGPU Software Development. AMD. Архивировано из первоисточника 19 марта 2012.
  2. AMD Backs OpenCL, Microsoft DirectX 11. eWeek. Архивировано из первоисточника 19 марта 2012.
  3. Apple Previews Mac OS X Snow Leopard to Developers. Apple. Архивировано из первоисточника 19 марта 2012.
  4. Andrew Humber NVIDIA Releases OpenCL Driver To Developers (англ.). NVIDIA (20 апреля 2009 года). — Оригинальная новость на официальном сайте NVIDIA Corporation. Архивировано из первоисточника 19 марта 2012. Проверено 21 апреля 2009.
  5. Павел Шубский NVIDIA открыла GPGPU для разработчиков под OpenCL. Игромания (журнал) (21 апреля 2009 года).(недоступная ссылка — история) Проверено 21 апреля 2009.
  6. Сергей и Марина Бондаренко Драйвер OpenCL для разработчиков от NVIDIA. 3DNews (21 апреля 2009 года). Проверено 21 апреля 2009.
  7. 1 2 3 Для WebKit представлена реализация технологии WebCL (рус.). opennet.ru (4 июля 2011 года). Архивировано из первоисточника 19 марта 2012. Проверено 31 октября 2011.
  8. 1 2 AMD. Introduction to OpenCL Programming 201005, page 89-90
  9. OpenCL. SIGGRAPH2008 (14 августа 2008). Архивировано из первоисточника 19 марта 2012. Проверено 14 августа 2008.
  10. Fitting FFT onto G80 Architecture (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report (May 2008). Архивировано из первоисточника 19 марта 2012. Проверено 14 ноября 2008.
  11. . OpenCL on FFT. Apple (16 Nov 2009). Проверено 7 декабря 2009.
  12. AMD Trinity: тесты — OpenCL // THG

Ссылки

Просмотр этого шаблона Стандарты The Khronos Group
COLLADA · EGL · OpenCL · OpenGL · OpenGL ES · OpenGL SC · OpenKODE · OpenMAX · OpenML · OpenSL ES · OpenVG · OpenWF · WebGL