Скачать презентацию Программирование графических ускорителей CUDA Лекция 2 Типы Скачать презентацию Программирование графических ускорителей CUDA Лекция 2 Типы

Lection-2.ppt

  • Количество слайдов: 20

Программирование графических ускорителей CUDA Лекция 2 Программирование графических ускорителей CUDA Лекция 2

Типы памяти в CUDA Тип памяти Доступ Уровень Скорость работы выделения Регистры R/W Per-thread Типы памяти в CUDA Тип памяти Доступ Уровень Скорость работы выделения Регистры R/W Per-thread Высокая(on-chip) Локальная R/W Глобальная R/W Constant R/O Shared Texture R/O Perthread Per-block Per-grid Низкая (DRAM) Per-grid Высокая(L 1 cache) Высокая(on-chip) Низкая (DRAM) Высокая(L 1 cache)

Типы памяти в CUDA Самая быстрая – shared (on-chip) и регистры Самая медленная – Типы памяти в CUDA Самая быстрая – shared (on-chip) и регистры Самая медленная – глобальная (DRAM) Для ряда случаев можно использовать кэшируемую константную и текстурную память Доступ к памяти в CUDA идет отдельно для каждой половины warp’а (half-warp)

Работа с памятью в CUDA Основа оптимизации – оптимизация работы с памятью: Максимальное использование Работа с памятью в CUDA Основа оптимизации – оптимизация работы с памятью: Максимальное использование sharedпамяти Использование специальных паттернов доступа к памяти, гарантирующих эффективный доступ ◦ Паттерны работают независимо в пределах каждого half-warp’а

Работа с глобальной памятью в CUDA Пример работы с глобальной памятью float * dev. Работа с глобальной памятью в CUDA Пример работы с глобальной памятью float * dev. Ptr; // pointer device memory // allocate device memory cuda. Malloc ( (void **) &dev. Ptr, 256*sizeof ( float ); // copy data from host to device memory cuda. Memcpy ( dev. Ptr, host. Ptr, 256*sizeof ( float ), cuda. Memcpy. Host. To. Device ); // process data // copy results from device to host cuda. Memcpy ( host. Ptr, dev. Ptr, 256*sizeof( float ), cuda. Memcpy. Device. To. Host ); // free device memory cuda. Free ( dev. Ptr );

Работа с глобальной памятью в CUDA Функции для работы с глобальной памятью cuda. Error_t Работа с глобальной памятью в CUDA Функции для работы с глобальной памятью cuda. Error_t cuda. Malloc ( void ** dev. Ptr, size_t size ); cuda. Error_t cuda. Malloc. Pitch ( void ** dev. Ptr, size_t * pitch, size_t width, size_t height ); cuda. Error_t cuda. Free ( void * dev. Ptr ); cuda. Error_t cuda. Memcpy ( void * dst, const void * src, size_t count, enum cuda. Memcpy. Kind kind ); cuda. Error_t cuda. Memcpy. Async ( void * dst, const void * src, size_t count, enum cuda. Memcpy. Kind kind, cuda. Stream_t stream ); cuda. Error_t cuda. Memset ( void * dev. Ptr, int value, size_t count );

Использование выравнивания. struct vec 3 { float x, y, z; }; struct __align__(16) vec Использование выравнивания. struct vec 3 { float x, y, z; }; struct __align__(16) vec 3 { float x, y, z; }; z Размер равен 12 байт z Элементы массива не будут выровнены в памяти z Размер равен 16 байт z Элементы массива всегда будут выровнены в памяти

Объединение запросов к глобальной памяти. z. GPU умеет объединять ряд запросов к глобальной памяти Объединение запросов к глобальной памяти. z. GPU умеет объединять ряд запросов к глобальной памяти в один блок (транзакцию) z. Независимо происходит для каждого half-warp’а z. Длина блока должна быть 32/64/128 байт z. Блок должен быть выровнен по своему размеру

Объединение (coalescing) для GPU с CC 1. 0/1. 1 Нити обращаются к ◦ 32 Объединение (coalescing) для GPU с CC 1. 0/1. 1 Нити обращаются к ◦ 32 -битовым словам, давая 64 -байтовый блок ◦ 64 -битовым словам, давая 128 -байтовый блок Все 16 слов лежат в пределах блока k-ая нить half-warp’а обращается к k-му слову блока

Объединение (coalescing) для GPU с CC 1. 0/1. 1 Coalescing Объединение (coalescing) для GPU с CC 1. 0/1. 1 Coalescing

Объединение (coalescing) для GPU с CC 1. 0/1. 1 Not Coalescing Объединение (coalescing) для GPU с CC 1. 0/1. 1 Not Coalescing

Эффективная работа с sharedпамятью z. Для повышения пропускной способности вся shared-память разбита на 16 Эффективная работа с sharedпамятью z. Для повышения пропускной способности вся shared-память разбита на 16 банков z. Каждый банк работает независимо от других z. Можно одновременно выполнить до 16 обращений к shared-памяти z. Если идет несколько обращений к одному банку, то они выполняются по очереди

Эффективная работа с sharedпамятью z. Банки строятся из 32 -битовых слов z. Подряд идущие Эффективная работа с sharedпамятью z. Банки строятся из 32 -битовых слов z. Подряд идущие 32 -битовые слова попадают в подряд идущие банки z. Bank conflict – несколько нитей из одного half-warp’а обращаются к одному и тому же банку z. Конфликта не происходит если все 16 нитей обращаются к одному слову (broadcast)

Бесконфликтные паттерны доступа Бесконфликтные паттерны доступа

Паттерны с конфликтами банков z Слева – конфликт второго порядка – вдвое меньшая скорость Паттерны с конфликтами банков z Слева – конфликт второго порядка – вдвое меньшая скорость z Справа - несколько конфликтов, до 6 -го порядка

Задача об N телах Задача об N телах

Задача об N телах Задача об N телах

Задача об N телах Задача об N телах

Оптимизация задачи об N телах используя разделяемую память Оптимизация задачи об N телах используя разделяемую память

Оптимизация задачи об N телах используя разделяемую память Оптимизация задачи об N телах используя разделяемую память