cuda best practices (2-3)

42
Часть II: Обзор CUDA API Александр Межов Ассистент кафедры Информатики [email protected] 28 октября 2011 Кафедра Информатики

Upload: alexander-mezhov

Post on 04-Jul-2015

2.489 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CUDA Best Practices (2-3)

Часть II: Обзор CUDA APIАлександр Межов

Ассистент кафедры Информатики[email protected]

28 октября 2011Кафедра Информатики

Page 2: CUDA Best Practices (2-3)

ОСОБЕННОСТИ CUDA APIsВиды CUDA APIs и возможности CUDA-устройств

Page 3: CUDA Best Practices (2-3)

Виды CUDA APIs

• CUDA Driver API

– Ручная инициализация контекста GPU

– Отсутствуют CUDA-расширения для C++

– Код CPU может компилироваться без nvcc

• CUDA Runtime API

– Автоматическая инициализация контекста GPU

– Наличие CUDA-расширений для C++

Page 4: CUDA Best Practices (2-3)

Выбор CUDA API

• CUDA Driver API

– Больше гибкости ( + )

– Сложность кода ( – )

• CUDA Runtime API

– Меньше гибкости ( – )

– Простота кода ( + )

Page 5: CUDA Best Practices (2-3)

Совместимость CUDA API

• Имеется обратная совместимость версий

CUDAv1.0

CUDAv1.1

CUDAv2.0

Application Application Application

Page 6: CUDA Best Practices (2-3)

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

• Capability – это версия архитектуры CUDA GPU, которая указывает на его вычислительные возможности и особенности

cudaGetDeviceProperties()

Page 7: CUDA Best Practices (2-3)

ОЦЕНКА ПРОИЗВОДИТЕЛЬНОСТИСпособы оценки эффективности приложений CUDA

Page 8: CUDA Best Practices (2-3)

Время выполнения

• Общее время вычислений на GPU

• Время выполнения участка кода GPU

Page 9: CUDA Best Practices (2-3)

Таймеры CPU

• Таймеры CPU позволяют замерять общее время выполнения вычислений на GPU

cudaThreadSynchronize()

Page 10: CUDA Best Practices (2-3)

Таймеры CUDA

• Таймеры CUDA позволяют замерять время выполненияучастка кода GPU

Page 11: CUDA Best Practices (2-3)

Скорость передачи данных

• Теоретическая пропускная способность

FDDRAM * (RDDRAM/8) * sizeof(float),где FDDRAM – частота, RDDRAM – разрядность шины

• Эффективная пропускная способность

(BR+ BW) / time,где BR и BW – объем прочитанной/записанной информации

• Реальная пропускная способность

Page 12: CUDA Best Practices (2-3)

ОПТИМИЗАЦИЯ РАБОТЫ С ПАМЯТЬЮ

Способы оптимизации работы с памятью CUDA GPU

Page 13: CUDA Best Practices (2-3)

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

L2

Texture Processing Cluster

Texture

SM

SM

. . .

Device RAM

Streaming Multiprocessor

Instructions Constants

Shared Memory

SP

SP

SP

SP

SP

SP

SP

SP

SFU SFU

Registers

Page 14: CUDA Best Practices (2-3)

Типы памяти устройства

• Streaming Multiprocessor– Регистровая память– Разделяемая память– Память констант

• Texture Processing Cluster– Память текстур

• DDRAM– Локальная память– Глобальная память

Page 15: CUDA Best Practices (2-3)

Передача данных Host/Device

• Является дорогостоящей операцией

• Возможна асинхронная передача

cudaMemcpy()cudaMemcpyAsync()

Page 16: CUDA Best Practices (2-3)

Асинхронная передача данных

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

Page 17: CUDA Best Practices (2-3)

Возможная оптимизация

Копирование

Выполнение

Копирование

Выполнение

• Синхронная передача данных в GPU

• Асинхронная передача данных в GPU

Page 18: CUDA Best Practices (2-3)

Нулевое копирование (Zero Copy)

• Прямое обращение к памяти Host’а

– Встроенные видеокарты

• Использование кэша CPU

Page 19: CUDA Best Practices (2-3)

Объединенное чтение DDRAM

• Выравнивание исходных данных по границе слова

• Потоки warp’а должны осуществлять одновременное чтение DDRAM

Page 20: CUDA Best Practices (2-3)

Разделяемая память и конфликты

• Общая для всех потоков блока

• Распределяется между блоками

• Разбивается на банки (32-битные слова)

Page 21: CUDA Best Practices (2-3)

Регистровое давление

• Регистры жестко распределяются между потоками мультипроцессора

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

Page 22: CUDA Best Practices (2-3)

ВЫБОР ОПТИМАЛЬНОЙ ТОПОЛОГИИ

Методы оценки топологии вычислений CUDA

Page 23: CUDA Best Practices (2-3)

Степень покрытия

• Степень покрытия мультипроцессора – это отношение числа активных warp'ов к максимально возможному числу активных warp'ов

– По количеству используемых регистров• С учетом топологии вычислений

• Без учета топологии вычислений

– По размеру используемой разделяемой памяти

Page 24: CUDA Best Practices (2-3)

Определение степени покрытия

• CUDA GPU:– 8192 регистра– 768 потоков на мультипроцессор

• Топология:– 12 регистров на ядро– 128 потоков в блоке

Tmax = 8192 регистров / 12 регистров = 682 потокаTreal = int(682 / 128) * 128 = 640 потоковС = Тreal / Tmax = 83%

Page 25: CUDA Best Practices (2-3)

ОПТИМИЗАЦИЯ КОДАОптимизация инструкций CUDA

Page 26: CUDA Best Practices (2-3)

Регистровая зависимость

• Инструкция использует регистр, значение которого было получено при выполнении предыдущей инструкции

register = instruction1();

instruction2(register);

Page 27: CUDA Best Practices (2-3)

Float vs Double

• Арифметические операции с float-числами осуществляются быстрей, чем с double-числами

– Рекомендуется использовать суффикс «f» при объявлении числовых констант, например, 3.14f

Page 28: CUDA Best Practices (2-3)

Деление чисел

• При делении чисел на степень двойки рекомендуется использовать оператор сдвига

X / N X >> log2(N)

X % N X & (N-1)

Page 29: CUDA Best Practices (2-3)

Степень числа

• Для известных целых значений степеней рекомендуется использовать явное умножение вместо вызова pow()

pow(X, 2) X * X

pow(X, 3) X * X * X

Page 30: CUDA Best Practices (2-3)

Часто используемые функции

• Обратный квадратный корень

– rsqrtf() / rsqrt()

• Прочие арифметические операции

– expf2() / exp2() – экспонента во 2-й степени

– expf10() / exp10() – экспонента в 10-й степени

– cbrtf() / cart() – экспонента в степени 1/3

– rcbrtf() / rebut() – экспонента в степени -1/3

Page 31: CUDA Best Practices (2-3)

Точность vs Скорость

• Аппаратные аналоги функций

__sinf() / sinf()

__cosf() / cosf()

__expf() / expf()

• Совмещенные функции

sincosf() / sincos()

Page 32: CUDA Best Practices (2-3)

УПРАВЛЕНИЕ ПОТОКОМ КОМАНДОбщие рекомендации по написанию кода

Page 33: CUDA Best Practices (2-3)

Операторы ветвления

• Инструкции управления потоком команд (if, switch, for, while, do-while) отрицательно сказываются на производительности

– В идеале все потоки warp'а должны идти по одному пути, иначе увеличивается количество выполняемых инструкций и возможно последовательное выполнение

Page 34: CUDA Best Practices (2-3)

Предикативная запись

Page 35: CUDA Best Practices (2-3)

ОТЛАДКА И ПРОФИЛИРОВАНИЕОтладка и профилирование приложений CUDA

Page 37: CUDA Best Practices (2-3)

Профилирование c Parallel Nsight

Page 38: CUDA Best Practices (2-3)

АППАРАТНЫЕ ОСОБЕННОСТИ GPUКраткий обзор архитектурных особенностей GPU

Page 39: CUDA Best Practices (2-3)

Причины рассогласования

• Основные причины рассогласования результатов вычислений на GPU и CPU

– Усечение double чисел до float при отсутствии аппаратной поддержки double

– Неассоциативность арифметических операций с дробными числами

– Небольшие отклонения от стандарта IEEE 754– Особенности архитектуры процессоров x86

Page 41: CUDA Best Practices (2-3)

Спасибо за внимание

Александр Межов[email protected]

28 октября 2011Кафедра Информатики

Page 42: CUDA Best Practices (2-3)

Часть III: Решения для работы с GPUАлександр Межов

Ассистент кафедры Информатики[email protected]

Кафедра Информатики