57
Нижегородский государственный университет им. Н.И. Лобачевского Факультет Вычислительной математики и кибернетики Введение в CUDA. Архитектура GPU. Язык CUDA C Бастраков С.И.

CUDA лекции (презентация)

  • Upload
    -

  • View
    211

  • Download
    4

Embed Size (px)

Citation preview

Page 1: CUDA лекции (презентация)

Нижегородский государственный университет

им. Н.И. Лобачевского

Факультет Вычислительной математики и кибернетики

Введение в CUDA.

Архитектура GPU. Язык CUDA C

Бастраков С.И.

Page 2: CUDA лекции (презентация)

Содержание

GPGPU

Почему GPU?

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

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

Язык СUDA С

Н. Новгород, 2011 г. 2

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 3: CUDA лекции (презентация)

GPGPU

Н. Новгород, 2011 г. Введение в CUDA. Архитектура GPU. Язык CUDA C 3

Page 4: CUDA лекции (презентация)

GPGPU

GPGPU (general-purpose computing on GPU) – вычисления

общего назначения на графических процессорах.

В качестве вычислений общего назначения могут

выступать и задачи, связанные с компьютерной графикой,

если они не ограничиваются использованием

стандартного графического конвейера (например, метод

трассировки лучей).

Потоковая обработка, используемая в графическом

конвейере, может эффективно использоваться во многих

вычислительных задачах общего характера.

Н. Новгород, 2011 г. 4

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 5: CUDA лекции (презентация)

Типичные области применения GPGPU

Физическое моделирование.

Визуальные эффекты.

Финансовая математика.

Вычислительная биология, химия.

Примеры практического применения CUDA:

http://www.nvidia.com/object/cuda_showcase_html.html

Н. Новгород, 2011 г. 5

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 6: CUDA лекции (презентация)

Гетерогенные вычисления

Гетерогенные вычисления (heterogeneous computing) –

вычисления с использованием разнородных

вычислительных устройств.

В качестве таких устройств могут выступать:

– центральные процессоры (CPU);

– графические процессоры (GPU);

– специализированные процессоры (например, DSP);

– ускорители;

– ПЛИС.

Наиболее популярной на текущий момент гетерогенной

связкой является CPU + GPU.

Таким образом, GPGPU – частный случай, но очень важный.

Н. Новгород, 2011 г. 6

Введение в CUDA. Архитектура GPU. Язык CUDA C

APU

Page 7: CUDA лекции (презентация)

Средства программирования для GPU

Шейдерные

языки:

– HLSL

– GLSL

– Cg

Н. Новгород, 2011 г. 7

Введение в CUDA. Архитектура GPU. Язык CUDA C

Средства от

производителей:

– NVIDIA CUDA

– AMD Stream

(больше не

развивается)

Унифицированные

средства:

– OpenCL

– C++ AMP

(анонсирован)

Классификация средств программирования для GPU:

Page 8: CUDA лекции (презентация)

NVIDIA CUDA

CUDA – Compute Unified Device Architecture.

Программно-аппаратная платформа для параллельных

вычислений от NVIDIA.

Раскрывает потенциал GPU для вычислений общего

назначения.

Не поддерживается другими производителями.

Н. Новгород, 2011 г. 8

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 9: CUDA лекции (презентация)

NVIDIA CUDA

Н. Новгород, 2011 г. 9

Введение в CUDA. Архитектура GPU. Язык CUDA C

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

Источник: NVIDIA CUDA C Programming Guide v. 4.0

Page 10: CUDA лекции (презентация)

Комплект поставки CUDA

Текущая версия 4.0:

http://developer.nvidia.com/cuda-toolkit-40

CUDA driver.

CUDA toolkit.

– компилятор;

– профилировщик;

– оптимизированные библиотеки;

– документация.

GPU Computing SDK.

Поддержка основных операционных систем.

Н. Новгород, 2011 г. 10

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 11: CUDA лекции (презентация)

Почему GPU?

Н. Новгород, 2011 г. Введение в CUDA. Архитектура GPU. Язык CUDA C 11

Page 12: CUDA лекции (презентация)

Пиковая производительность CPU и GPU

Н. Новгород, 2011 г. 12

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: NVIDIA CUDA C Programming Guide v. 4.0

Page 13: CUDA лекции (презентация)

Пропускная способность памяти CPU и GPU

Н. Новгород, 2011 г. 13

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: NVIDIA CUDA C Programming Guide v. 4.0

Page 14: CUDA лекции (презентация)

Использование GPU в суперкомпьютерах

Н. Новгород, 2011 г. 14

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: top500.org

3 из 5 наиболее производительных суперкомпьютеров

списка TOP500 по состоянию на июнь 2011 содержат

GPU:

Page 15: CUDA лекции (презентация)

Использование GPU в суперкомпьютерах

3 из 5 наиболее энергоэффективных суперкомпьютеров

списка Green500 по состоянию на июнь 2011 содержат

GPU:

Н. Новгород, 2011 г. 15

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: green500.org

Page 16: CUDA лекции (презентация)

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

Н. Новгород, 2011 г. Введение в CUDA. Архитектура GPU. Язык CUDA C 16

Page 17: CUDA лекции (презентация)

Архитектура CPU и GPU

Н. Новгород, 2011 г. 17

Введение в CUDA. Архитектура GPU. Язык CUDA C

CPU

“cache-oriented” GPU

“cache-miss oriented”

Источник: NVIDIA CUDA C Programming Guide v. 3.2

Page 18: CUDA лекции (презентация)

Архитектура CPU и GPU

GPU предназначен для вычислений,

– параллельных по данным: одна и та же операция

выполняется над многими данными параллельно,

– в которых отношение вычислительных операций к

числу операций по доступу к памяти велико.

Вместо кэша и сложных элементов управления на

кристалле размещено большее число вычислительных

элементов.

Латентность памяти покрывается за счет большого

количества легковесных потоков.

Постепенно сложность архитектуры GPU повышается.

Н. Новгород, 2011 г. 18

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 19: CUDA лекции (презентация)

Архитектура GPU: общие сведения

GPU – массивно-параллельный многоядерный процессор.

Состоит из мультипроцессоров (streaming multiprocessor,

MP), каждый из которых содержит несколько CUDA-ядер

(CUDA core) и общую для них память.

– В архитектурах до Fermi анаголи CUDA-ядер

назывались скалярными процессорами (scalar

processor, SP).

CUDA-ядра внутри одного мультипроцессора работают

как SIMD.

Чрезвычайно легковесные потоки, встроенный

планировщик.

Н. Новгород, 2011 г. 19

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 20: CUDA лекции (презентация)

Архитектура Tesla 8/10

Н. Новгород, 2011 г. 20

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: А.В. Боресков, А.А. Харламов «Архитектура и программирование

массивно-параллельных вычислительных систем»

Page 21: CUDA лекции (презентация)

Мультипроцессор Tesla 8

Н. Новгород, 2011 г. 21

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: А.В. Боресков, А.А. Харламов «Архитектура и программирование

массивно-параллельных вычислительных систем»

Page 22: CUDA лекции (презентация)

Мультипроцессор Tesla 10

Н. Новгород, 2011 г. 22

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: А.В. Боресков, А.А. Харламов «Архитектура и программирование

массивно-параллельных вычислительных систем»

Page 23: CUDA лекции (презентация)

Иерархия памяти Tesla 10

Глобальная (device/global) – общая для устройства.

Разделяемая (shared) – общая для всех SP в одном MP.

Константный кэш (constant cache) – только чтение,

общий для всех SP в одном MP).

Текстурный кэш (texture cache) – только чтение, общий

для всех SP в одном MP).

Регистры (register) – (логически) эксклюзивны для SP.

Локальная (local) – (логически) эксклюзивна для SP.

Н. Новгород, 2011 г. 23

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 24: CUDA лекции (презентация)

Мультипроцессор Fermi

Н. Новгород, 2011 г. 24

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: А.В. Боресков, А.А. Харламов «Архитектура и программирование

массивно-параллельных вычислительных систем»

Page 25: CUDA лекции (презентация)

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

Новейшая на текущий момент архитектура NVIDIA.

Добавлен общий L2-кэш для глобальной памяти.

На каждом мультипроцессоре добавлен L1-кэш для

глобальной памяти. Физически расположен вместе с

разделяемой памятью, возможность настройки размеров

L1-кэша и разделяемой памяти 48kB/16kB.

В каждом ядре отдельные блоки для вычислений с

плавающей точкой и целочисленных вычислений.

Значительно улучшена производительность арифметики с

плавающей точкой двойной точности и SFU.

Техническая возможность для полной поддержки C++.

Поддержка ECC.

Н. Новгород, 2011 г. 25

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 26: CUDA лекции (презентация)

Вычислительные возможности

Вычислительные возможности (compute capability)

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

архитектурным особенностям.

Определяются при помощи числового индекса,

состоящего из номеров главной (major) и второстепенной

(minor) ревизий, записывается в виде major.minor.

– Например, 1.3.

Таблица вычислительных возможностей (а также числа

мультипроцессоров и CUDA-ядер) всех устройств в

Appendix A в NVIDIA CUDA C Programming Guide.

Архитектура Fermi имеет номер главной ревизии 2

(индекс имеет вид 2.x), все более ранние архитектуры

имеют номер главной ревизии 1 (индекс имеет вид 1.x).

Н. Новгород, 2011 г. 26

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 27: CUDA лекции (презентация)

Вычислительные возможности

Отличия устройств с различными вычислительными

возможностями в Appendix G в NVIDIA CUDA C

Programming Guide.

Минимальный индекс 1.0.

Поддержка вычислений с плавающей точкой в двойной

точности, начиная с индекса 1.3.

Поддержка классов (C++), начиная с индекса 2.0.

Полная поддержка С++ на устройствах индекса 2.0 и

выше, начиная с версии CUDA 4.0.

От вычислительных возможностей существенно зависят

требования для эффективного доступа к глобальной

памяти и возможность выполнения специфических

операций. Н. Новгород, 2011 г.

27 Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 28: CUDA лекции (презентация)

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

Н. Новгород, 2011 г. Введение в CUDA. Архитектура GPU. Язык CUDA C 28

Page 29: CUDA лекции (презентация)

Основные понятия

Большое количество потоков (thread) параллельно выполняют одну и ту же функцию – ядро (kernel).

– На Fermi одновременно может исполняться до 4 разных ядер.

Потоки группируются в блоки (thread blocks).

Каждый блок исполняется на одном мультипроцессоре, его потоки – на CUDA-ядрах данного мультипроцессора.

Блоки объединяются в решетку/сетку блоков (grid).

Ядро выполняется на решетке из блоков.

Размер блока и размер решетки блоков задается при вызове ядра.

Н. Новгород, 2011 г. 29

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 30: CUDA лекции (презентация)

Идентификаторы

Каждый поток и блок потоков имеют идентификаторы

– Каждый поток и блок могут (и должны) определить, с

какими данными они должны работать.

Block ID (1D, 2D или 3D).

– Третья компонента не использовалась до CUDA 4.0.

Thread ID (1D, 2D или 3D).

Многомерная индексация может упрощать

декомпозицию многомерных данных.

Пример: ядро выполняет умножение матриц, каждый

поток вычисляет один элемент результирующей матрицы.

Удобно использовать двумерные индексы, например, x-

компоненту для номеров строк и y-компоненту для

столбцов.

Н. Новгород, 2011 г. 30

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 31: CUDA лекции (презентация)

Идентификаторы

Н. Новгород, 2011 г. 31

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: NVIDIA CUDA C Programming Guide v. 4.0

Page 32: CUDA лекции (презентация)

Взаимодействие потоков

Потоки внутри одного блока выполняются на одном

мультипроцессоре, они способны взаимодействовать

между собой посредством:

– разделяемой памяти ;

– точек синхронизации.

Два потока из различных блоков могут взаимодействовать

лишь через глобальную память.

Атомарные функции для разделяемой и глобальной

памяти.

Н. Новгород, 2011 г. 32

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 33: CUDA лекции (презентация)

Выполнение блоков

Автоматическое распределение блоков на

мультипроцессоры.

Каждый блок целиком выполняется одним

мультипроцессором.

При наличии достаточного количества ресурсов,

несколько блоков могут «одновременно» исполняться на

одном мультипроцессоре.

Наличие большого количества блоков открывает

возможности для автоматической масштабируемости с

ростом числа мультипроцессоров.

Н. Новгород, 2011 г. 33

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 34: CUDA лекции (презентация)

Автоматическая масштабируемость

Н. Новгород, 2011 г. 34

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: NVIDIA CUDA C Programming Guide v. 4.0

Page 35: CUDA лекции (презентация)

Типичная схема организации вычислений

Крупнозернистый

параллелизм на уровне

блоков.

Мелкозернистый

параллелизм на уровне

потоков внутри блока.

Исходная задача

разбивается на

независимые подзадачи,

каждая из которых

решается параллельно

одним блоком.

Н. Новгород, 2011 г. 35

Введение в CUDA. Архитектура GPU. Язык CUDA C

Источник: А.В. Боресков, А.А. Харламов «Архитектура и программирование

массивно-параллельных вычислительных систем»

Page 36: CUDA лекции (презентация)

Язык CUDA C

Н. Новгород, 2011 г. Введение в CUDA. Архитектура GPU. Язык CUDA C 36

Page 37: CUDA лекции (презентация)

CUDA C

CUDA C – расширение С/C++, включающее

– квалификаторы функций;

– квалификаторы типов памяти;

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

Содержит элементы C++. Полная поддержка C++ для

современных устройств и последней версии CUDA.

Терминология:

– хост (host) = CPU;

– устройство (device) = GPU;

– ядро (kernel) – подпрограмма, параллельно

выполняемая потоками на GPU.

Н. Новгород, 2011 г. 37

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 38: CUDA лекции (презентация)

Квалификаторы функций

__host__ (по умолчанию) – функция, вызываемая с хоста и

выполнямая на нем.

__global__ – функция, вызываемая с хоста и выполняемая

потоками на устройстве (ядро).

__device__ – функция, вызываемая (одним потоком) и

выполняемая на устройстве.

Н. Новгород, 2011 г. 38

Введение в CUDA. Архитектура GPU. Язык CUDA C

Квалификатор Выполняется на: Вызывается с:

__host__ host host

__global__ device host

__device__ device device

Page 39: CUDA лекции (презентация)

__global__ функции

Тип возвращаемого результата всегда void.

Аргументы передаются через разделяемую/константную

память.

Не может быть переменного числа аргументов.

Не могут содержать статических переменных.

Не могут содержать рекурсию.

Указатели на __global__ функции со стороны хоста

поддерживаются.

Н. Новгород, 2011 г. 39

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 40: CUDA лекции (презентация)

__device__ функции

__device__ может использоваться совместно с __host__, в

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

Не может быть переменного числа аргументов.

Не могут содержать статических переменных.

Рекурсия поддерживается для устройств с

вычислительными возможностями 2.0 и выше.

Указатели на __device__ функции со стороны устройства

поддерживаются для устройств с вычислительными

возможностями 2.0 и выше, указатели со стороны хоста не

поддерживаются.

Встраиваются по умолчанию для устройств с

вычислительными возможностями 1.x.

Н. Новгород, 2011 г. 40

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 41: CUDA лекции (презентация)

Квалификаторы переменных

__device__ объявляет переменную, размещаемую на

устройстве:

– размещается в глобальном пространстве памяти;

– время жизни переменной совпадает со временем жизни

приложения;

– доступ к переменной может быть осуществлен из всех

потоков, выполняемых на устройстве, а также с хоста

через библиотеки времени выполнения.

__constant__ объявляет переменную, размещаемую на

устройстве в константной области памяти и доступную

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

Н. Новгород, 2011 г. 41

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 42: CUDA лекции (презентация)

Квалификаторы переменных

__shared__ объявляет переменную, которая

– размещается в пространстве разделяемой памяти

мультипроцессора, на котором исполняется блок

потоков;

– время жизни переменной совпадает со временем жизни

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

– доступ к переменной может быть осуществлен из

потоков, принадлежащих блоку потоков.

Н. Новгород, 2011 г. 42

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 43: CUDA лекции (презентация)

Встроенные векторные типы

[u]char[1..4], [u]int[1..4], [u]long[1..4], float[1..4], double2 –

являются структурами, доступ через .x, .y, .z, .w.

Нет конструкторов, но есть make_<type name>.

Нет встроенных векторных арифметических операций.

dim3 = uint3 + конструктор; по умолчанию заполняется 1

– dim3 используется для задания числа блоков и потоков

при вызове ядер.

Могут использоваться в хостовой (С/С++) части кода.

Н. Новгород, 2011 г. 43

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 44: CUDA лекции (презентация)

Встроенные переменные

В коде на стороне GPU доступны следующие переменные:

– gridDim – переменная типа dim3, содержит текущую

размерность решетки;

– blockIdx – переменная типа uint3, содержит индекс

блока потоков внутри решетки;

– blockDim – переменная типа dim3, содержит

размерность блока потоков;

– threadIdx – переменная типа uint3, содержит индекс

потока внутри блока потоков.

Данные переменные предназначены только для чтения.

Н. Новгород, 2011 г. 44

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 45: CUDA лекции (презентация)

Вычисление уникального индекса потока

Нет встроенной переменной для получения индекса потока

среди всех потоков (т.е. всех потоков всех блоков).

Он может быть вычислен через значения других

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

Для простоты будем считать, что используется только

x-компонента индексов.

Н. Новгород, 2011 г. 45

Введение в CUDA. Архитектура GPU. Язык CUDA C

idx = blockIdx.x * blockDim.x + threadIdx.x;

Смещение нулевого

потока данного блока

относительно нулевого

потока нулевого блока

Искомый

индекс

Смещение данного

потока относительно

нулевого потока

данного блока

Page 46: CUDA лекции (презентация)

CUDA API

Состав CUDA API:

– управление устройствами;

– управление контекстами;

– управление памятью;

– управление процессом выполнения;

– взаимодействие с графическими API.

Все функции возвращают значение типа cudaError_t,

cudaSuccess в случае успешного завершения функции.

Уровни API:

– низкоуровневое (CUDA driver API): cu*;

– высокоуровневое (C runtime for CUDA): cuda*.

Н. Новгород, 2011 г. 46

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 47: CUDA лекции (презентация)

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

Перечисление устройств:

– cudaError_t cudaGetDeviceCount(int* count) –

возвращает число доступных устройств;

– cudaError_t cudaGetDevice (int* dev) – возвращает

используемое устройство;

– cudaError_t cudaGetDeviceProperties (struct

cudaDeviceProp* prop, int dev) – возвращает структуру,

содержащую свойства устройства.

Н. Новгород, 2011 г. 47

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 48: CUDA лекции (презентация)

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

Выбор устройства:

– cudaError_t cudaSetDevice (int dev) – устанавливает

устройство с заданным номером;

– cudaError_t cudaChooseDevice (int* dev, const struct

cudaDeviceProp* prop) – выбирает устройство, в

наибольшей степени соответствующее конфигурации.

Н. Новгород, 2011 г. 48

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 49: CUDA лекции (презентация)

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

Выделение и освобождение памяти на устройстве:

– cudaError_t cudaMalloc (void** devPtr, size_t count) –

выделяет память на устройстве и возвращает указатель

на нее;

– cudaError_t cudaFree (void* devPtr) – освобождает

память на устройстве.

Копирование данных между хостом и устройством:

– cudaError_t cudaMemcpy (void* dst, const void* src,

size_t count, enum cudaMemcpyKind kind) –

осуществляет копирование данных между хостом и

устройством (блокирующий вариант);

– cudaMemcpyAsync – неблокирующий вариант.

Н. Новгород, 2011 г. 49

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 50: CUDA лекции (презентация)

Вызов ядер

По умолчанию вызов ядра является асинхронным.

Функция ядра должна быть вызвана с указанием

конфигурации исполнения.

Конфигурация определяется использованием выражения

специального вида <<< Dg, Db, Ns, S >>> между именем

функции и списком ее аргументов.

Dg – определяет размерность и размер сетки, так что Dg.x

* Dg.y * Dg.z равно числу блоков потоков, которые будут

запущены.

Db – определяет размерность и размер каждого блока

потоков, Db.x * Db.y * Db.z равно числу потоков на блок.

Параметры Ns, S могут быть использованы по умолчанию,

о них позже.

Н. Новгород, 2011 г. 50

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 51: CUDA лекции (презентация)

Вызов ядер

Пример:

__global__ void kernel_func() { … }

dim3 dim_grid(100, 50);

dim3 dim_block (8, 8, 8);

kernel_func<<<dim_grid, dim_block>>>( );

Н. Новгород, 2011 г. 51

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 52: CUDA лекции (презентация)

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

void __syncthreads() – барьерная синхронизация в для

потоков внутри одного блока (вызывается внутри ядра).

Атомарные арифметические функции для глобальной и

разделяемой памяти.

cudaThreadSyncronize() – барьерная синхронизация для

всех вызовов функций на устройстве (вызывается хостом).

– Вызовы ядер асинхронны.

Возможна более сложная синхронизация на основе

cudaStream_t и cudaEvent_t.

Н. Новгород, 2011 г. 52

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 53: CUDA лекции (презентация)

“CUDA Hello, World!”

#include <cstdlib>

#include <iostream>

#include <cuda_runtime.h>

__global__ void hello(int * output)

{

int globalIdx = blockIdx.x * blockDim.x + threadIdx.x;

output[globalIdx] = globalIdx;

}

Н. Новгород, 2011 г. 53

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 54: CUDA лекции (презентация)

“CUDA Hello, World!”

int main() {

int buffer_size = 4 * 512;

int * buffer = new int[buffer_size];

int * buffer_gpu;

cudaMalloc((void **) &buffer_gpu,

buffer_size * sizeof(float));

hello<<<4, 512>>>(buffer_gpu);

cudaMemcpy(buffer, buffer_gpu, buffer_size * sizeof(float),

cudaMemcpyDeviceToHost);

cudaFree(buffer_gpu); delete [] buffer;

return 0;

}

Н. Новгород, 2011 г. 54

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 55: CUDA лекции (презентация)

Компиляция и сборка

Компилятор nvcc.

Build rules для Microsoft Visual Studio.

В CUDA до 4.0 поддерживались версии MSVS 2005 и 2008.

В CUDA 4.0 добавлена поддержка MSVS 2010.

Н. Новгород, 2011 г. 55

Введение в CUDA. Архитектура GPU. Язык CUDA C

Page 56: CUDA лекции (презентация)

Компиляция и сборка

Н. Новгород, 2011 г. 56

Введение в CUDA. Архитектура GPU. Язык CUDA C

NVCC Компилятор для CPU

Код на CUDA С

Объектные файлы CUDA

С/C++ код для CPU

Объектные файлы CPU

Сборка

Общий

исполняемый

файл CPU-GPU

Исходный код

Page 57: CUDA лекции (презентация)

Материалы

NVIDIA CUDA C Programming Guide v. 4.0:

http://developer.download.nvidia.com/compute/cuda/4_0/tool

kit/docs/CUDA_C_Programming_Guide.pdf

Материалы курса по CUDA в МГУ:

https://sites.google.com/site/cudacsmsusu/file-cabinet

А.В. Боресков, А.А. Харламов «Основы работы с

технологией CUDA»:

https://sites.google.com/site/cudacsmsusu/file-cabinet

Д. Сандерс, Э. Кэндрот «Технология CUDA в примерах:

введение в программирование графических процессоров»

(пер. с англ.).

Н. Новгород, 2011 г. 57

Введение в CUDA. Архитектура GPU. Язык CUDA C