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

Принцип действия этого движка представлен на упрощенной схеме ниже:

схема параллельных вычислений open cl

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

Как это работает?

Хост, как обычно, обрабатывает и выполняет программный код, используя C #, C + + или другие языки по вашему выбору. Это само тело программы, которое работает на процессоре, находясь в среде управления операционной системы и т. п.

Ускорители выполняют OpenCL код, написанный в OpenCL C99 (о котором мы поговорим позже). Существует определенный OpenCL компилятор для центрального процессора, для графического процессора и для специальных карт-ускорителей (на данный момент это NVIDIA Tesla и AMD FireStream).

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

Ниже представлен принцип работы интерфейса (есть несколько шагов, которых мы будем придерживаться):

OpenCL код:

  • Создание OpenCL кода, который нужно выполнять с помощью OpenCL C99 языка;

Хост Код:

  • Создание своей программы (с использованием C #, например);
  • Создание данных, которые вы хотите обработать;
  • Использование API OpenCL для передачи данных на ускорители;
  • Использование API OpenCL для операций вычисления-исполнения;
  • Заключительная генерация всех необходимых данных.

Сэмплы кода:

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

код параллельных вычислений open cl

Код в текстовом варианте можно скачать здесь.

Параллельная обработка:

Так в чем же подвох? Почему движок OpenCL так полезен для вычислений? Потому что он может сделать обработку параллельно-многопоточной. Рассмотрим это на примере суммирования двух n-мерных векторов. Давайте напишем формулу вначале на C#.

параллельные вычисления С++

Код в виде текста здесь.

Что происходит внутри цикла? Программа рассчитывает вектор v3 [0], потом v3 [1] и так далее, до v3 [п-1]. Теперь давайте посмотрим на версию с использованием OpenCL. Это всего лишь псевдокод.

OpenCL код:

параллельные вычисления open cl

Текстовый вариант кода здесь.

Этапы псевдокода хоста:

  1. Инициализация OpenCL.
  2. Создание векторов v1, v2 и v3.
  3. Копирование v1, v2 и v3 для OpenCL обработки в память ускорителя.
  4. Установка v1, v2 и v3 в качестве аргументов floatVectorSum.
  5. Указание движку OpenCL, что будет 1000 потоков для выполнения floatVectorSum.
  6. Чтение информации из v3.

Почувствовали разницу? Используя OpenCL мы можем разбивать небольшую часть задачи на множество потоков, которые обрабатываются ускорителями параллельно, а без OpenCL задача выполняется полностью последовательно в один поток. Но следует иметь в виду, что использование OpenCL возможно только потому, что все значения вектора v3 [i] зависят только от значений векторов v1 и v2.

Давайте сравним стандартный код и код OpenCL:

Описание

Стандартный код

OpenCL

Потоки исполняемого кодаОбычно одинОбычно тысячи
Возможность аппаратного ускорения векторных функцийНетДа, с помощью графических процессоров и  специальных ускорителей
Возможность использования всех доступных в системе устройств для обработки   в операциях вычисленияНетДа
Блокировка многопоточности (или недоступность по умолчанию)ДаНет
Необходимость ручной установки аргументов и количества потоковНетДа
Простота в использовании существующих алгоритмовДаНет
Необходимость в специальных навыках для создания условий параллельности   — многопоточностиНетДа
Широкая доступность и поддержкаДаНет

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (10 оценок, среднее: 5,00 из 5)
Загрузка... 1 603 просмотров

5 отзыва(ов) на “язык параллельных вычислений OpenCL

  1. Параллельная обработка данных известна давно. Например язык пролог, так же использует параллельную обработку данных, только написание программы на нем более «сложна», для тех кто привык писать программу последовательно. А OpenCL я так поняла выход из этой ситуации. Программа пишется традиционно-последовательно, но осуществляет параллельную обработку данных. Ну и плюс его, язык современный, много дополнительных функций.

  2. Программирование с OpenCL было бы еще проще, если бы производители железа поменьше экспериментировали с этим движком, ну хотя бы с его визуальным представлением: а то у NVIDIA — это Cuda, у AMD — это ATI Stream, только на Mac OS X Snow Leopard OpenCL в чистом виде представлен, встроенным в ось. Просто пользователь иногда даже и не знает, что у него на компьютере уже все установлено вместе с драйверами, а потом тратит много времени на поиски спец. ПО для разработки (например, Cuda Toolkit).

  3. Я буквально удивлен, ОТКУДА ДЕВУШКА СТОЛЬКО ЗНАЕТ? Статья полезная, для новичков, а девчонка умничка, спасибо! А сайт удачный!

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

Понравилась статья? Оставь комментарий