Принцип действия этого движка представлен на упрощенной схеме ниже:
Здесь можно увидеть, что существует хозяин-хост и дополнительные ускорители. Более пристально взглянув на схему, можно заметить, что хост посылает пакеты с информацией и исполнительные команды на ускорители и получает готовые данные.
Как это работает?
Хост, как обычно, обрабатывает и выполняет программный код, используя 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.
Код в текстовом варианте можно скачать здесь.
Параллельная обработка:
Так в чем же подвох? Почему движок OpenCL так полезен для вычислений? Потому что он может сделать обработку параллельно-многопоточной. Рассмотрим это на примере суммирования двух n-мерных векторов. Давайте напишем формулу вначале на C#.
Код в виде текста здесь.
Что происходит внутри цикла? Программа рассчитывает вектор v3 [0], потом v3 [1] и так далее, до v3 [п-1]. Теперь давайте посмотрим на версию с использованием OpenCL. Это всего лишь псевдокод.
OpenCL код:
Текстовый вариант кода здесь.
Этапы псевдокода хоста:
- Инициализация OpenCL.
- Создание векторов v1, v2 и v3.
- Копирование v1, v2 и v3 для OpenCL обработки в память ускорителя.
- Установка v1, v2 и v3 в качестве аргументов floatVectorSum.
- Указание движку OpenCL, что будет 1000 потоков для выполнения floatVectorSum.
- Чтение информации из v3.
Почувствовали разницу? Используя OpenCL мы можем разбивать небольшую часть задачи на множество потоков, которые обрабатываются ускорителями параллельно, а без OpenCL задача выполняется полностью последовательно в один поток. Но следует иметь в виду, что использование OpenCL возможно только потому, что все значения вектора v3 [i] зависят только от значений векторов v1 и v2.
Давайте сравним стандартный код и код OpenCL:
Описание | Стандартный код | OpenCL |
Потоки исполняемого кода | Обычно один | Обычно тысячи |
Возможность аппаратного ускорения векторных функций | Нет | Да, с помощью графических процессоров и специальных ускорителей |
Возможность использования всех доступных в системе устройств для обработки в операциях вычисления | Нет | Да |
Блокировка многопоточности (или недоступность по умолчанию) | Да | Нет |
Необходимость ручной установки аргументов и количества потоков | Нет | Да |
Простота в использовании существующих алгоритмов | Да | Нет |
Необходимость в специальных навыках для создания условий параллельности — многопоточности | Нет | Да |
Широкая доступность и поддержка | Да | Нет |
Ожидается, что параллельная обработка с использованием устройств — ускорителей станет очень популярной уже в недалеком будущем. Инженеры и ученые могут получить удивительные результаты, используя OpenCL, и если вы используете свой компьютер для математических расчетов, OpenCL для вас является правильным выбором. С другой стороны, если вы разрабатываете веб-компоненты и интерфейсы, особой выгоды от использования OpenCL вы не получите.
1 637 просмотров
Параллельная обработка данных известна давно. Например язык пролог, так же использует параллельную обработку данных, только написание программы на нем более «сложна», для тех кто привык писать программу последовательно. А OpenCL я так поняла выход из этой ситуации. Программа пишется традиционно-последовательно, но осуществляет параллельную обработку данных. Ну и плюс его, язык современный, много дополнительных функций.
Я аплодирую стоя, удивлен такими знаниями девушки.
Программирование с OpenCL было бы еще проще, если бы производители железа поменьше экспериментировали с этим движком, ну хотя бы с его визуальным представлением: а то у NVIDIA — это Cuda, у AMD — это ATI Stream, только на Mac OS X Snow Leopard OpenCL в чистом виде представлен, встроенным в ось. Просто пользователь иногда даже и не знает, что у него на компьютере уже все установлено вместе с драйверами, а потом тратит много времени на поиски спец. ПО для разработки (например, Cuda Toolkit).
Я буквально удивлен, ОТКУДА ДЕВУШКА СТОЛЬКО ЗНАЕТ? Статья полезная, для новичков, а девчонка умничка, спасибо! А сайт удачный!
Однозначно лучшая статья которую я читал о языке параллельных вычислений OpenCL. Даже наверное самая уникальная и информативная, написана доступным и понятным языком, любопытна будет как профессионалам так и любителям.