Содержание
- 2. Что такое CUDA? CUDA – это архитектура параллельных вычислений от NVIDIA, позволяющая существенно увеличить вычислительную производительность
- 3. Немного о GPU Первый вопрос, который должен задать каждый перед применением GPU для решения своих задач
- 4. Базовые понятия и термины Устройство (device) — GPU. Выполняет роль «подчиненного» — делает только то, что
- 5. Базовые понятия и термины Ядра Рассмотрим более детально процесс написания кода для ядер и их запуска.
- 6. Базовые понятия и термины Каким же образом мы задаем количество потоков, в которых будет запущено ядро?
- 7. Основные этапы CUDA-программы Хост выделяет нужное количество памяти на устройстве. Хост копирует данные из своей памяти
- 8. Аппаратное обеспечение GPU CUDA-совместимый GPU состоит из нескольких (обычно десятков) streaming multiprocessors (потоковых мультипроцессоров), далее SM.
- 9. Аппаратное обеспечение GPU Согласно модели CUDA, программист разбивает задачу на блоки, а блоки на потоки. Каким
- 10. Синхронизация в CUDA Барьер — точка в коде ядра, по достижению которой поток может «пройти» дальше,
- 12. Скачать презентацию
Что такое CUDA?
CUDA – это архитектура параллельных вычислений от NVIDIA, позволяющая
Что такое CUDA?
CUDA – это архитектура параллельных вычислений от NVIDIA, позволяющая
На сегодняшний день продажи CUDA процессоров достигли миллионов, а разработчики программного обеспечения, ученые и исследователи широко используют CUDA в различных областях, включая обработку видео и изображений, вычислительную биологию и химию, моделирование динамики жидкостей, восстановление изображений, полученных путем компьютерной томографии, сейсмический анализ, трассировку лучей и многое другое.
Немного о GPU
Первый вопрос, который должен задать каждый перед применением GPU
Немного о GPU
Первый вопрос, который должен задать каждый перед применением GPU
Базовые понятия и термины
Устройство (device) — GPU. Выполняет роль «подчиненного» — делает
Базовые понятия и термины
Устройство (device) — GPU. Выполняет роль «подчиненного» — делает
Хост (host) — CPU. Выполняет управляющую роль — запускает задачи на устройстве, выделяет память на устройстве, перемещает память на/с устройства. И да, использование CUDA предполагает, что как устройство так и хост имеют свою отдельную память.
Ядро (kernel) — задача, запускаемая хостом на устройстве.
При использовании CUDA вы просто пишете код на своем любимом языке программирования (список поддерживаемых языков, не учитывая С и С++), после чего компилятор CUDA сгенерирует код отдельно для хоста и отдельно для устройства. Небольшая оговорка: код для устройства должен быть написан только на языке C с некоторыми 'CUDA-расширениями'.
Базовые понятия и термины
Ядра
Рассмотрим более детально процесс написания кода для
Базовые понятия и термины
Ядра
Рассмотрим более детально процесс написания кода для
В некоторых случаях в коде ядра необходимо использовать различные способы синхронизации.
Базовые понятия и термины
Каким же образом мы задаем количество потоков, в
Базовые понятия и термины
Каким же образом мы задаем количество потоков, в
Потом задаются размеры блока в 3D координатах: block_x, block_y, block_z. В результате, блок будет состоять из block_x*block_y*block_z потоков. Итого, имеем grid_x*grid_y*grid_z*block_x*block_y*block_z потоков. Важное замечание — максимальное количество потоков в одном блоке ограничено и зависит от модели GPU — типичны значения 512 (более старые модели) и 1024 (более новые модели).
Внутри ядра доступны переменные threadIdx и blockIdx с полями x, y, z — они содержат 3D координаты потока в блоке и блока в сетке соответственно. Также доступны переменные blockDim и gridDim с теми же полями — размеры блока и сетки соответственно.
Основные этапы CUDA-программы
Хост выделяет нужное количество памяти на устройстве.
Хост копирует данные
Основные этапы CUDA-программы
Хост выделяет нужное количество памяти на устройстве.
Хост копирует данные
Хост стартует выполнение определенных ядер на устройстве.
Устройство выполняет ядра.
Хост копирует результаты из памяти устройства в свою память.
Аппаратное обеспечение GPU
CUDA-совместимый GPU состоит из нескольких (обычно десятков) streaming multiprocessors (потоковых мультипроцессоров),
Аппаратное обеспечение GPU
CUDA-совместимый GPU состоит из нескольких (обычно десятков) streaming multiprocessors (потоковых мультипроцессоров),
Каждый SM, в свою очередь, состоит из нескольких десятков simple/streaming processors (SP) (обычных/потоковых процессоров), или выражаясь более точно, CUDA cores (ядер CUDA). Эти ребята уже больше похожи на привычный CPU — имеют свои регистры, кэш и т.д. Каждый SM также имеет свою собственную shared memory (общую память) — эдакий дополнительный кэш, который доступен всем SP, и может использоваться как в роли кэша для часто используемых данных, так и для «общения» между потоками одного блока CUDA.
Аппаратное обеспечение GPU
Согласно модели CUDA, программист разбивает задачу на блоки, а
Аппаратное обеспечение GPU
Согласно модели CUDA, программист разбивает задачу на блоки, а
Распределением блоков по SM занимается GPU, не программист.
Все потоки блока X будут разбиты на группы, называемые warps (обычно так и говорят — варпы), и выполнены на SM. Размер этих групп зависит от модели GPU, например для моделей с микроархитектурой Fermi он равен 32. Все потоки из одного варпа выполняются одновременно, занимая определенную часть ресурсов SM. Причем они либо выполняют одну и ту же инструкцию (но на разных данных), либо простаивают.
Исходя из всего этого, CUDA предоставляет следующие гарантии: Все потоки в определенном блоке будут выполнены на каком-то одном SM.
Все потоки определенного ядра будут выполнены до начала выполнения следующего ядра.
CUDA не гарантирует что: Какой-то блок X будет выполнятся до/после/одновременно с каким-то блоком Y.
Какой-то блок X будет выполнен на каком-то конкретном SM Z.
Синхронизация в CUDA
Барьер — точка в коде ядра, по достижению которой поток
Синхронизация в CUDA
Барьер — точка в коде ядра, по достижению которой поток
__threadfence — не совсем примитив синхронизации: при достижении этой инструкции поток может продолжить выполнение только после того, как все его манипуляции с памятью станут видны другим потокам — по-сути, заставляет поток выполнить flush кэша.