Введение

Архитектура современных процессоров для увеличения производительности основывается на принципах параллелизма. Сталкиваясь с техническими проблемами высоких тактовых частот при фиксированном диапазоне электрического напряжения, центральные процессоры (CPU, Central Processing Units) сейчас улучшают свою производительность с помощью дополнительных процессорных ядер. Графические процессоры (GPU, Graphics Processing Units) так же развились из устройств фиксированной функциональности построения графических сцен в программируемые параллельные процессоры. Ввиду того, что современные компьютеры часто включают высоко параллельные CPU, GPU и другие типы процессоров, важно дать возможность разработчикам программного обеспечения (ПО) использовать эти гетерогенные процессорные системы в полной мере.

Создание приложений для гетерогенных параллельных вычислительных платформ является сложным процессом, поскольку классические подходы к программированию для многоядерных CPU и GPU значительно различаются. Модели программирования CPU хотя в большинстве случаев и основаны на стандартах, но обычно они предполагают наличие общего адресного пространства и не учитывают возможность векторных операций.
 
Модели программирования GPU общего назначения, включая сложные иерархии памяти и векторные операции, традиционно остаются платформо-зависимыми. Эти ограничения затрудняют доступ разработчиков к обширной базе исходных кодов для CPU, GPU и других типов процессоров. Как никогда, сейчас требуется предоставить возможность разработчикам программного обеспечения эффективно использовать все преимущества гетерогенных вычислительных платформ - от высокопроизводительных вычислительных серверов, через персональные компьютеры к мобильным устройствам, которые включают разнообразные параллельные CPU, GPU и другие процессоры, такие как сигнальные (DSP) и процессоры Cell/B.E.  
 
OpenCL (Open Computing Language) - открытый, не требующий лицензионных отчислений стандарт для универсального параллельного программирования различных типов процессоров, таких как CPU, GPU и другие. Стандарт предоставляет программистам переносимый и эффективный доступ ко всей мощи гетерогенных вычислительных платформ. OpenCL поддерживает широкий круг ПО: от встроенных и клиентских приложений до высокопроизводительных решений через достаточно низкоуровневневый, пригодный для использования в высокопроизводительных решениях, переносимый программный интерфейс. 
 
В результате создания эффективного, учитывающего аппаратные особенности платформы программного интерфейса, OpenCL способен сформировать базовый уровень параллельного вычислительного кода независимых от аппаратной платформы программных инструментов, промежуточного ПО и других видов приложений.

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

Стандарт OpenCL описывает API для управления процессом параллельных вычислений среди гетерогенных процессоров; так же кросс-платформенный язык программирования с детально описанным вычислительным окружением. Стандарт OpenCL:

  • поддерживает различные модели параллелизма;
  • использует подмножество стандарта С99 с расширениями поддержки параллелизма;
  • поддерживает стандарт арифметики чисел с плавающей точкой IEEE 754;
  • определяет профили конфигураций для переносных и встраиваемых устройств.

Данный документ начинается с обзора основных концепций и архитектуры OpenCL, за которым следует детальное описание моделей выполнения и памяти, а так же поддержка синхронизации. Следом идет обсуждение платформы OpenCL и API времени выполнения. Затем следует детальное описание языка программирования OpenCL C. Будут приведены примеры, чтобы показать как будут выглядеть вывчисления с использованием OpenCL. Стандарт разделен на базовую часть, которую должна поддерживать любая OpenCL-совместимая реализация; переносную/встраиваемую часть, которая ослабляет требования совместимости для переносных и встраиваемых устройств; и множество дополнительных расширений, которые возможно перейдут в базовую часть в следующих версиях стандарта.