язык параллельных вычислений OpenCL

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 372 просмотров

  •  
  •  
  •  
  •  
  •  
  •  
  •  
Метки: , ,
Опубликовано в майнинг, распределенные вычисления
5 комментариев на “язык параллельных вычислений OpenCL
  1. Надежда:

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

  2. sanchez778:

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

  3. ReMixx:

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

  4. Брутфорс:

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

*

Регистрация в майнинг пуле с моментальным выводом на WebMoney!

новости
Подписка на madcash.ru