Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / Лекция 13

.doc
Скачиваний:
30
Добавлен:
06.07.2016
Размер:
20.99 Кб
Скачать

Технологии и методы программирования. Лекция 13.

Синхронизация.

В CUDA поддерживается барьерная синхронизация для потоков одного блока - synchthread(). Для разных блоков прямой синхронизации нет- только атомарными операциями. При этом снижается производительность системы.

Управление устройствами.

CUDAGetDeviceCount(int *count) – число доступных устройств.

CUDAGetDevice(int *det) – номер устройства

CUDAGetDeviceProperties(CUDAdevice *prop, int dev) – свойства устройства по его номеру.

CUDASetDevice(int dev) – устанавливает за программой устройства, на которых будут выполняться ядра.

Управление памятью.

CUDAMalloc(void **devptr, size_t count) – выделяет память на устройстве, возвращает указатель на эту память.

CUDAFree(void *devptr) – освобождает память.

CUDAMemcpy(void *dst, const void *sre, size_t size, enum CUDAMemcpykind kind) – копирует память. enum CUDAMemcpykind задаёт направление — от центрального процессора к графическому или наоборот.

У всех перечисленных функций возвращаемое значение — CUDAError_T.

Особенности компиляции.

Все функции со спецификатором device – встраиваемые. _noinline_ устраняет это.

По умолчанию небольшие циклы разворачиваются. Но если указать #pragma unrall N=1, то это не будет происходить.

Основные этапы программирования.

1) Разработка функций ядер.

2) Распределение памяти, инициализация данных.

3) Запуск ядра.

Программирование с использованием OpenCL.

Отличается оригинальной архитектурой, иерархией моделей.

Модели:

1) Платформы.

2) Памяти

3) Исполнения

4) Программирования.

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

Платформа — host-система и несколько устройств. Устройство — один или более вычислительных модулей. Модуль — несколько обрабатывающих элементов. Все вычисления выполняются именно ими.

Управляющая часть запускается на хосте. При этом создаётся очередь команд, передаваемая обрабатывающим элементам. Элементы одного модуля могут выполнять поток инструкций по схеме SIMD или SPMD.

Модель исполнения.

Приложения состоят из двух компонент: ядер, выполняемых на устройствах, и управляющих программ, организующих работу ядер.

Исполнение ядер.

Перед запуском каких-либо функций определяется пространство индексов. Каждый экземпляр ядра выполняется для некоторой точки этого пространства. Каждый элемент работы получает глобальный идентификатор. Элементы работы объединяются в группы, группам также дают идентификаторы. Их размерность совпадает с размерностью пространства индексов. Каждый элемент имеет уникальных локальный идентификатор. Все элементы одной группы выполняются на одном вычислительном модуле. В группе поддерживается барьерная синхронизация, а для элементов разных групп — нет.

Стандарт предполагает использование n-мерного прстранства индексов, но на практике реализованы одно-, двух- и трёхмерные пространства. Пространство определяется массивом целых чисел. Глобальные и локальные идентификаторы — n-мерные вектора. Идентификаторы групп — тоже массивы с координатами, ограниченными количеством групп по измерению.

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

Модель памяти.

    1. Глобальная память — доступна каждому элементу работы.

    2. Константная — также общедоступна, но только для чтения (хотя управляющая программа может писать и в неё).

    3. Локальная — доступна только в этой группе.

    4. Частная память — доступна только для одного элемента работы. Используется по умолчанию, для работы с любой другой памятью необходимо отдельно объявлять её спецификатором.

Модель программирования.

Две схемы программирования:

    1. Параллельное по данным.

    2. Параллельное по функциям.

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

Соседние файлы в папке Лекции