Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_ekzamen_Chernysheva.docx
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
648.58 Кб
Скачать

Тема 6 Технология cuda.

  1. Основные термины: концепция simd, мультипроцессор, устройство (device), хост (host), ядро (kernel). Организация потоков.

Технология CUDA — это программно-аппаратная вычислительная архитектура NVIDIA, основанная на расширении языка Си, которая даёт возможность организации доступа к набору инструкций графического ускорителя и управления его памятью при организации параллельных вычислений. CUDA помогает реализовывать алгоритмы, выполнимые на графических процессорах видеоускорителей GeForce восьмого поколения и старше (серии GeForce 8, GeForce 9, GeForce 200), а также Quadro и Tesla. Вычислительная архитектура CUDA реализована на концепции SIMD - один поток команд и множественный поток данных. То есть одна инструкция позволяет обрабатывать множество данных.

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

Устройство (device) - видеоадаптер, поддерживающий драйвер CUDA, либо другое специализированное устройство, предназначенное для выполнения инструкций CUDA (например NVidia Tesla)

Будем рассматривать GPU только как логическое устройство, не вдаваясь в подробности реализации, то есть устройство можно представить как набор мультипроцессоров и драйвер CUDA.

Хост (host) - обычная программа в оперативной памяти, использующую CPU и выполняющую управляющие функции по работе с device, то есть та часть программы, которая выполняется на CPU - хост, а на GPU - device.

Организация потоков

Пусть необходимо выполнить некоторую процедуру на N потоках, в CUDA эта процедура называется ядром (kernel). Для CUDA характерна блочно-сеточная архитектура, при этом драйвер CUDA сам распределяет ресурсы устройства между потоками.

В се потоки, выполняющим kernel1, которые объединены блоки, которые объединены в решетку grid1. Каждый блок в свою очередь состоит из потоков. Все индексы потоков двухмерные, в CUDA можно работа с 1-3мерными индексами, все определяется спецификацией решаемой задачи. В CUDA можно использовать одномерный-трехмерные индексы. Индексы представляют собой трехмерные векторы, каждый поток знает индекс потока внутри блока threadIdx: threadIdx.x threadIdx.y и знает индекс блока внутри сетки blockIdx: blockIdx.x blockIdx.y. При запуске программы на device все потоки в grid отличаются только индексами, именно через индексы можно управлять потоками, указывая какая часть данных обрабатывается тем или иным потоком. Код задачи выполняется на мультипроцессоре определенными частями (пулами, warp'ами).

  1. Архитектура устройства, виды памяти.

Модель программирования в CUDA предполагает группирование потоков. Потоки объединяются в блоки потоков (thread block) — одномерные или двумерные сетки потоков, взаимодействующих между собой при помощи разделяемой памяти и точек синхронизации.

П рограмма (ядро, kernel) исполняется над сеткой (grid) блоков потоков (thread blocks). Верхний уровень ядра GPU состоит из блоков, которые группируются в сетку или грид (grid) размерностью N1 * N2 * N3. Это можно изобразить следующим образом:

Рис. 1. Вычислительное устройство GPU. Рис. 2. Устройство блока GPU.

Любой блок в свою очередь состоит из нитей (threads), которые являются непосредственными исполнителями вычислений. Нити в блоке сформированы в виде трехмерного массива (рис. 2).

GPU может читать из константной памяти и из текстурной памяти. CPU может читать и записывать в константную, текстурную память и глобальную память. Каждый из процессоров нутри блока может читать и писать в shared memory, в регистры, в локальную память и в глобальную память.

Основные ограничения CUDA:

    • отсутствие поддержки рекурсии для выполняемых функций;

    • минимальная ширина блока в 32 потока;

    • закрытая архитектура CUDA, принадлежащая NVIDIA

Регистровая память - самая быстрая из всех видов памяти, компилятор старается разместить все локальные переменные в регистрах, если регистров не хватает, то располагает в локальный памяти.

Локальная память - достаточно быстрая память, но ее трудно контролировать и разработчики CUDA советуют ее не использовать.

Глобальная память - самый большой объём памяти, доступный для всех мультипроцессоров на видеочипе, размер составляет от 256 мегабайт до 1.5 гигабайт на текущих решениях (и до 4 Гбайт на Tesla). Обладает высокой пропускной способностью, более 100 гигабайт/с для топовых решений NVIDIA, но очень большими задержками в несколько сот тактов. Не кэшируется, поддерживает обобщённые инструкции load и store, и обычные указатели на память. Дает возможность читать из любой ячейки и писать в любую ячейку. Разработчики CUDA рекомендуют сохранять в глобальной памяти результаты вычислений, перед тем как их отправить на хост. То, что будет храниться в глобальной памяти имеют спецификатор:__global__. В глобальной памяти можно выделять память динамически с помощью функции cudaMalloc().

Константная память - кэшируется, в константную память с хоста можно записывать с помощью функции cudaMemcpyToSymbol(). Если константа хранится в глобальной памяти, то для нее существует спецификатор: __constant__. С device в константную память нельзя ничего писать.

Разделяемая память - не кэшируется, но работает очень быстро. На один микропроцессор доступно только 16кб разделяемой памяти. При размещении данных указывается спецификатор: __shared__.

Текстурная память - кэшируется, она сохранилась благодаря первоначальному назначению видеоадаптера, физически текстурная память не отделена от глобальной. С device в текстурную память писать нельзя.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]