Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_CUDA.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Вычислительные способности графического процессора.

С каждым новым поколением процессоров NVIDIA в них реализуются дополнительные возможности, доступные программисту через CUDA. Для описания возможностей аппаратной части используется понятие compute capability (вычислительная способность).

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

Таблица 3.2.

Вычислительные способности различных процессоров

Сompute Сapability

(версия)

Графические процессоры

1.0

G80

1.1

G86, G84, G98, G98b, G94, G94b, G92, G92b

1.2

GT218, GT216, GT215

1.3

GT200, GT200b

2.0

GF100, GF110

2.1

GF108, GF106, GF104, GF114, GF116

Среда разработки cuda.

CUDA включает два API: высокого уровня (CUDA Runtime API) и низкого (CUDA Driver API). В одной программе одновременное использование обоих невозможно, нужно использовать или один, или другой. В API высокого уровня (рис. 3.3) все вызовы runtime транслируются в простые инструкции, обрабатываемые низкоуровневым Driver API. Но даже высокоуровневый API предполагает знание основ об устройстве и работе видеокарт NVIDIA. Практически все функции из обоих API возвращают значение t_cudaError, которое принимает значение cudaSuccess в случае успеха.

В данном лабораторном практикуме изучается API высокого уровня, т.е. Runtime API.

Рис. 3.3. Состав CUDA API

В состав CUDA входят две библиотеки:

CUBLAS — CUDA-вариант BLAS (Basic Linear Algebra Subprograms), предназначенный для вычислений задач линейной алгебры и использующий прямой доступ к ресурсам GPU;

CUFFT — CUDA- вариант библиотеки Fast Fourier Transform для расчёта быстрого преобразования Фурье, широко используемого при обработке сигналов. Поддерживаются следующие типы преобразований: complex-complex (C2C), real-complex (R2C) и complex-real (C2R).

Описание библиотек см. на стр. 52 данного пособия.

Язык cuda с.

Для реализации программы под GPU компания NVIDIA выпустила свои расширения для языка С, компилятор nvcc для сборки таких программ, ввела в обиход новое расширение *.cu для файлов, которые содержат CUDA-функции. К расширениям языка Си относятся:

  • cпецификаторы функций,

  • cпецификаторы переменных,

  • новые типы данных,

  • cпецификаторы запуска ядра GPU,

  • встроенные переменные.

Спецификаторы функций показывают, где они будут выполняться. Всего в CUDA три спецификатора:

_host_ – выполняется на CPU, вызывается с CPU.

_global_ – выполняется на GPU, вызывается с CPU.

_device_ – выполняется на GPU, вызывается с GPU.

Существуют дополнительные ограничения на выполняемые на видеокарте функции:

  • нельзя брать адрес от функции (за исключением _global_);

  • нет поддержки рекурсии;

  • внутри функций нельзя применять спецификатор static к переменным;

  • не поддерживается переменное число аргументов в функциях.

Спецификаторы переменных, которые служат для указания типа используемой памяти GPU, приведены в таблице 3.3.

Таблица 3. 3.

Спецификаторы переменных в CUDA

Спецификатор

Находится в

Доступна для

Вид доступа

_device_

устройстве

устройства

только чтение

_constant_

устройстве

устройства и хоста

чтение/запись

_shared_

устройстве

блока потоков

чтение/запись

На их использование также накладывается ряд ограничений:

  • спецификатор _device_ является аналогом const на центральном процессоре.

  • спецификатор _shared_ применяется для задания разделяемой памяти и не может быть инициализирован при объявлении. Он требует явной синхронизации потоков внутри одного блока после любой операции с такой памятью.

  • запись в _constant_ память осуществляется только через специальные функции с CPU.

  • Никакие спецификаторы нельзя применять к полям структур.

В CUDA добавлено несколько векторных типов для удобства копирования и доступа к данным. Типы char, int, short, long, float могут быть 1- ,2- ,3- или 4-мерными векторами, а longlong и double - только 1- или 2-мерными. Для создания переменных таких типов требуется применять функции вида

make_(тип)(размерность);

Также существует специальный тип dim3, основанный на типе uint3, имеющий нормальный конструктор. Этот конструктор позволяет задавать не все компоненты вектора (недостающие компоненты инициализируются единицами).

Каждый вызов _global_ функции должен соответсвовать спецификации вызова. Спецификация определяет размерность сетки и блоков, которые будут использоваться для выполнения этой функции на устройстве. Вызов должен соответсвовать форме

func<<< Dg, Db, Ns, S >>>(arguments);

Здесь func – это имя соотвецтвующей функции. Переменная Dg имеет тип dim3 и определяет размерность сетки; так произведение Dg.x * Dg.y равно числу блоков. Тип dim3 трехмерный, но координата Dg.z обычно не используется.

Переменная Db также имеет тип dim3 и задает размерность и размер каждого блока. Произведение Db.x * Db.y * Db.z равно числу потоков в блоке.

Параметр Ns имеет тип size_t и определяет число байтов в разделяемой памяти, которая должна быть динамически выделена каждому блоку. Ns – необязательный параметр и по умолчанию равен 0.

Переменная S типа cudaStream_t задает поток (streams), в котором должен произойти вызов, по умолчанию используется поток 0.

В CUDA несколько особых переменных существуют внутри каждого вычислительного ядра и позволяют отличать один поток от другого.

dim3 gridDim – содержит в себе информацию о конфигурации сетки.

uint3 blockIdx – координаты текущего блока внутри сетки.

dim3 blockDim – размерность блока при запуске ядра.

uint3 threadIdx – координаты текущего потока внутри блока.