
- •Параллельные вычисления.
- •История развития многопроцессорной вычислительной техники.
- •Классификация вычислительных систем.
- •Обзор архитектур многопроцессорных систем.
- •Одновременная многопотоковость.
- •Многоядерность.
- •Системы с массовым параллелизмом.
- •Кластерные системы.
- •Ускорители вычислений.
- •Замеры времени на видеокарте.
- •Типы памяти cuda.
- •Работа с константной памятью.
- •Работа с глобальной памятью.
- •Оптимизация работы с глобальной памятью.
- •Разделяемая память и её использование.
- •Реализация на cuda базовых операций над массивами.
- •Принципы программирования на системах с распределенной памятью.
- •Типовые схемы коммуникации в многопроцессорных вычислительных системах.
Замеры времени на видеокарте.
Cuda Events.
Для измерения времени можно пользоваться событиями cuda. События – это объекты типа сudaEvent_t, используемые для обозначения точки. Каждое событие, привязанное к точке, характеризуется тем, пройдена данная точка или нет. Можно создавать и уничтожать события, привязывать события к местам, узнавать, наступило ли данное событие, ждать наступления события и получать интервал времени между наступлениями двух событий.
Типы памяти cuda.
Чисто физически память видеокарты можно разделить на DRAM и на память, размещенную непосредственно на видеокарте.
Тип памяти |
Расположение |
Кэш-ся |
Доступ |
Уровень доступа |
Время жизни |
Регистры |
Мультипроцессор |
Нет |
R/W |
Per-thread |
Нить |
Локальная |
DRAM |
Нет |
R/W |
Per-thread |
Нить |
Разделяемая |
Мультипроцессор |
Нет |
R/W |
Все нити блока |
Блок |
Глобальная |
DRAM |
Нет |
R/W |
Все нити и CPU |
Выделяется CPU |
Константная |
DRAM |
Да |
R/o |
Все нити и CPU |
Выделяется CPU |
Текстурная |
DRAM |
Да |
R/o |
Все нити и CPU |
Выделяется CPU |
Каждый мультипроцессор содержит 8192 или 16384 32-хбитовых регистров. Имеющиеся регистры распределяются между нитями блока на этапе компиляции. Каждая нить получает в свое монопольное использование некоторое количество регистров, доступных как на чтение, так и на запись. Регистры обладают максимальной скоростью доступа. Если регистров не хватает, то задействуется локальная память. Доступ к локальной памяти характеризуется высокой латентностью (от 400 до 600 тактов). Разделяемая память – быстродействующая. Она выделяется на уровне блоков. Каждый блок получает одно и то же количество этой памяти. Каждый мультипроцессор содержат 16 Кб разделяемой памяти. Эта память обладает небольшой латентностью. Глобальная память – обычная DRAM память, выделяемая специальными функциями на CPU. Латентность высокая. Константная и текстурная память имеют возможность кэширования. Из них можно только читать информацию. Запись в них может осуществляться только ЦП. Общий объем константной памяти ограничен 64 Кб.
Работа с константной памятью.
Выделяется с помощью оператора constant. Все нити сетки могут читать из неё данные. При этом она кэшируется. ЦП имеет доступ к этому виду памяти как на чтение, так и на запись при помощи следующих функций: cudaMemcpyToSymbol (const char *symbol, const void *src, size_t const, size_t offset, enum cudaMemcpyKind kind) - копирование в константную память; cudaMemcpyFromSymbol (void *dst, const char *symbol, size_t count, size_t offset, enum cudaMemcpyKind kind) – копирование из константной памяти; В качестве kind выступает константа копирования.
_ _constant_ _ float constData [256];
float hostData [256];
cudaMemcpyToSymbol (constData, hostData, sizeof(hostData), 0, cudaMemcpyHostToDevice);