Четверг, 02.05.2024, 02:53
Приветствую Вас Гость | RSS
_nast
Главная | Каталог статей | Регистрация | Вход
Форма входа

Меню сайта
Категории раздела
Статейки [4]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Друзья сайта
  • Природа Орловщины
  • Главная » Статьи » OpenCL » Статейки

    Архитектура OpenCL

    Архитектура OpenCL

    OpenCL открытый индустриальный стандарт для программирования гетерогенных (неоднородных) коллекций CPU, GPU и других дискретных (отдельных, обособленных) устройств организованных в единую платформу. Это больше чем язык. OpenCL это фреймворк для параллельного программирования, содержащий язык (программирования), API, библиотеки и ран тайм. К примеру, используя OpenCL, программист может писать универсальные программы, которые выполняются на GPU без вставки в них  APIграфических библиотек, такие как OpenGL или DirectX.

    Целевая аудитория OpenCL – это опытные программисты, желающие писать переносимый и кроме того эффективный код.

    Что бы описать основные идеи OpenCL, мы будем использовать иерархию моделей:

    • Модель платформы;
    • Модель памяти;
    • Модель выполнения;
    • Программная модель;

    Модель платформы

    Модель платформы OpenCLописана на рисунке ниже. Она содержит хост (host), связанный с одним или несколькими устройствами OpenCL  (OpenCLdevices). Устройство OpenCL состоит из одного или нескольких вычислительных модулей (computerunitsCU), которые далее разделены на обрабатывающие элементы (процессорные элементы, processingelementsPE). Расчеты на устройствах ведутся внутри процессорных элементов.

    Приложение OpenCLвыполняется на хосте согласно модели нативной (родной) для платформы хоста. Приложение OpenCLпередает команды, для выполнения расчетов, от хоста к процессорным элементам внутри устройства. Процессорные элементы внутри вычислительного модуля работают как SIMDмодули (когда процессорные элементы CU выполняют один и тот же поток команд, но с различными данными, single instruction, multiple data) либо как SPMDмодули (разновидность MIMD, каждый PEимеет свой собственный счетчик команд (programcounter)).

    модель платформы

    OpenCLспроектирован чтобы поддерживать устройства с различными возможностями.  Устройства в платформе могут поддерживать различные спецификации OpenCL. Для OpenCL важны версия платформы, версия устройства и версию Cподобного языка программирования OpenCL(OpenCLC) поддерживаемого устройством.

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

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

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

    Модель выполнения

    OpenCLприложение состоит из двух частей: ядер, которые выполняются на              устройстве(ах) и хост-программы (ведущей программы), которая выполняется на хосте. Ведущая программа определяет контексты для ядер и выполняет их управление.

    Модель выполнения OpenCLопределяет, как будет выполняться ядро. Ядро выполняется не позже, чем хост определит пространство индексов. Экземпляр ядра выполняется для каждой точки пространства индексов. Этот экземпляр ядра называется рабочим элементом (work-item), он отождествляется с точкой пространства индексов, которое предоставляет ему глобальный идентификатор (globalID). Каждый рабочий элемент выполняет один и тот же код, но путь его выполнения (например, ветвления) и данные с которыми он оперирует, могут быть различными (вспомним SIMD).

    Рабочие элементы организованы в рабочие группы. Рабочие группы предоставляют более крупное разбиение пространства индексов. Каждая группа получает уникальный ID, такой же размерности что и индексное пространство служащие рабочим элементам. В пределах группы рабочий элемент получает локальный ID (localID), таким образом, рабочий элемент может быть идентифицирован как по глобальному ID, так и по комбинации локального и группового ID. Рабочие элементы в данной группе выполняются одновременно на процессорных элементах одного вычислительного модуля.

    Индексное пространство, поддерживаемое в OpenCL называется NDRange. NDRange – N-мерное индексное пространство, где N равняется единице, двум или трем (т.е. это самое пространство может быть одно, двух или трехмерным). Оно определяется как целочисленный массив длины N определяющей размерность пространства индексов, каждое измерение начинается со смещения F (по умолчанию равного нулю). Глобальный и локальный ID каждого рабочего элемента это N-мерный кортеж. Составляющие глобального ID  - это значения лежащие в диапазоне от F до F плюс число элементов в этом измерении минус единица.

    В назначении ID рабочим группам используется подобный подход что и в назначении глобального ID рабочего элемента. Массив длины N определяет число рабочих групп в каждом измерении. Рабочему элементу в группе дается локальный ID с компонентами лежащими в диапазоне от нуля до размера группы в этом измерении минус один. Следовательно, комбинация ID группы и локального ID однозначно определяет рабочий элемент. Каждый рабочий элемент идентифицируется двумя способами: через глобальный индекс и через индекс рабочей группы плюс локальный индекс в пределах (этой) группы.

    Для примера рассмотрим двухмерное индексное пространство на рисунке ниже. Мы вводим индексное пространство для рабочих элементов (Gx,Gy), размер каждой рабочей группы (Sx,Sy) и смещения (Fx,Fy). Глобальный индекс определяется через Gx и Gy, откуда общее число рабочих элементов равно произведению Gx на Gy. Локальный индекс определяется через Sx и Sy, откуда число рабочих элементов в группе есть произведение Sx на Sy. Зная размер каждой группы и число рабочих элементов мы можем рассчитать число рабочих групп. Каждый рабочий элемент идентифицируется через глобальный ID (gx,gy) или через комбинацию ID группы (wx,wy) с размерностью (Sx,Sy) и локальный ID (sx,sy) рабочего элемента внутри группы.

              (gx,gy)=(wx*Sx+sx+Fx, wy*Sy+sy+Fy)

    Число рабочих групп можно вычислить так:

    (Wx, Wy) = (Gx / Sx, Gy / Sy)

    Учитывая глобальный ID и размер рабочей группы, ID рабочей группы  рабочего элемента вычисляется так:

    (wx, wy) = ( (gx – sx – Fx) / Sx, (gy – sy – Fy) / Sy )



    Исходники программки, показывающей инфу об opencl на вашей машине, для сборки нужен qmake (собирал под Win).

    http://agapii.ucoz.ru/opencl/oclinfo.zip

     
    Категория: Статейки | Добавил: _nast (01.03.2011)
    Просмотров: 2885 | Комментарии: 1 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:
    Copyright MyCorp © 2024
    Конструктор сайтов - uCoz