24
Архитектура и программирование Архитектура и программирование потоковых многоядерных процессоров для научных расчётов для научных расчётов Лекция 3. Типы параллелизма М CUDA Модель памяти CUDA

Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Embed Size (px)

DESCRIPTION

Слайды лекции курса "Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов".

Citation preview

Page 1: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Архитектура и программирование Архитектура и программирование потоковых многоядерных процессоров

для научных расчётовдля научных расчётов

Лекция 3. Типы параллелизмаМ CUDAМодель памяти CUDA

Page 2: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Возможные виды параллелизмаВозможные виды параллелизма

Классификация Флина (SISD,SIMD, etc.) не вполне отражает вариации архитектур современных выч устройств

С ё Сложно отнести к какому-то определённому классуФизическая многоядерность VS Одно ядро над различными контекстами во времениРазличные виды конвейеровРазличные виды конвейеров

Буферизованные / не буферизованные | синхронные / асинхронные

Разбиение на независимые пути выполнения на высоком и Разбиение на независимые пути выполнения на высоком и низком уровне

CPU – высокий уровень / GPU – низкий уровеньПараллелизм на различных данных на независимых путяхПараллелизм на различных данных, на независимых путяхисполнения или на уровне инструкций

GPU – над данными / CPU – на путях исполненияВекторные VS скалярные АЛУВекторные VS скалярные АЛУ

Page 3: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

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

Если параллелизм отсутствует в исходной задаче – параллелизм счётного устройства не даст выигрышаБольшие задачи в подавляющем количестве случаев –упараллельны

Способ мышления человека – составление сложных объектов и методов как комбинаций простых (от простого к сложному) –

модель газа состоит из одинаковых частицСвойства физического мира (принцип локальности взаимодействия) - задачи динамики газов и жидкостейСвойства математических объектов перебор / независимые Свойства математических объектов – перебор / независимые испытания

Хорошее приложение это:Много входов / много выходовМного входов / много выходовСуществование параллельных путей ведения рассчётовОграниченность взаимодействия между отдельными путямиБольшое кол во вычислений на обращение к памятиБольшое кол-во вычислений на обращение к памяти

Page 4: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Традиции архитектуры CPUТрадиции архитектуры CPU

Одноядерные процессорыразвивались ~ 40 летТ CPU Теперь количество ядер CPU удваивается ежегодноТрадиционное ядро не содержит поддержки параллелизмаподдержки параллелизма

Скалярная модель исполнения программРазмещение тредов по ядрам(б й ) (баланс вычислительной нагрузки) –новинка для операционных системПрограммист должен примерно представлять конфигурацию PUНет универсального автоматического решения (проблема кэширования)

Page 5: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Почему нельзя далее наращивать Почему нельзя далее наращивать скорость ядра?10,000,

Sun’s Surface

1,000 Rocket Nozzle

ip (W

atts

)

100Nuclear Reactor

r a 1

cm

2C

hi

10

4004 8080

8086

486Pentium®

Processors

Hot Plate

Pow

er fo

r

1

4004

8008 8085

8080286

386

486

‘90 ‘00‘80‘70 ‘10

Source: Pat Gelsinger, Intel, ISSCC 2001

Page 6: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Пример архитектуры CellПример архитектуры Cellпроцессора (IBM & Sony)

PPE – Power Processor Element (распределяет нагрузку между отдельными вычислительными блоками)SPU – Synergistic Processing Unit (векторное ядро, цифровой сигнальный процессор)Сложен в программировании - предполагает параллелизм высокого уровняПрограммист пишет код для каждого SPU отдельноПрограммист пишет код для каждого SPU отдельно

Page 7: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Альтернатива – использование Альтернатива использование GPU

GPGPU приложение

Геометрия данных

Перенос данных Задачи схожие с графикой – позволяющие параллелизм низкого

Счет

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

Одна программаСчет

Память

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

Page 8: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Вычислительная конфигурация Вычислительная конфигурация GPU

Процессы объединяются в блоки (blocks), внутри которых они имеют общую

Host Device

Grid 1р щу

память (shared memory) и синхронное исполнение

Kernel 1

Block(0, 0)

Block(1, 0)

Block(2, 0)

Block(0 1)

Block(1 1)

Block(2 1)

Блоки объединяются в сетки (grids)

Нет возможности предсказать очерёдность запуска блоков в Kernel

(0, 1) (1, 1) (2, 1)

Grid 2

очерёдность запуска блоков в сеткиМежду блоками нет и не может быть (см. выше) общей памяти

2

Block (1, 1)

Thread(0, 1)

Thread(1, 1)

Thread(2, 1)

Thread(3, 1)

Thread(4, 1)

Thread(0, 0)

Thread(1, 0)

Thread(2, 0)

Thread(3, 0)

Thread(4, 0)

( ) ( ) ( ) ( ) ( )

Thread(0, 2)

Thread(1, 2)

Thread(2, 2)

Thread(3, 2)

Thread(4, 2)

Page 9: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Gather и Scatter обмен данными в Gather и Scatter обмен данными в GPU

Традиционно в GPU доступ к памяти осуществлялся для обработки пикселов. Gather модель

Control Control

DRAM

ALUControl

CacheALU ALU ...

d d d d

ALUControl

CacheALU ALU ...

d d d d

Но scatter был невозможен / CUDA позволяет делать scatter

DRAM d0 d1 d2 d3 d4 d5 d6 d7 …

ALUControl

CacheALU ALU ... ALU

Control

CacheALU ALU ... …

DRAM d0 d1 d2 d3 d4 d5 d6 d7 …

Page 10: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Использование общей памятиИспользование общей памяти

Прямое чтение данных во многие АЛУ - неоптимально

ALUControl

CacheALU ALU ... ALU

Control

CacheALU ALU ...

DRAM

Cache

d0 d1 d2 d3

Cache

d4 d5 d6 d7 …Используется механизм Shared Memory: Каждый процесс знает

какую часть даных загрузить где искать данные загруженные остальными процессами

ALU

Shared

Control

CacheALU ALU ... ALU

Shared

Control

CacheALU ALU ...

DRAM

Sharedmemory d0 d1 d2 d3

d0 d1 d2 d3

Sharedmemory d4 d5 d6 d7

d4 d5 d6 d7 …d0 d1 d2 d3 d4 d5 d6 d7 …

Page 11: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Модель памяти GPUМодель памяти GPU

(D i ) G idGPU может читать

Constant MemoryTexture Memory

(Device) Grid

Block (0, 0) Block (1, 0)

GPU может читать/писать Global Memory

Каждый из процессов ч/пL l M

Shared Memory

Registers Registers

Shared Memory

Registers Registers

Local MemoryRegisters

Каждый из процессов внутри блока ч/п

Thread (0, 0) Thread (1, 0) Thread (0, 0) Thread (1, 0)

блока ч/пShared memoryGather/Scatter MA pattern

Хост имеет возможность Gl b l

LocalMemory

LocalMemory

LocalMemory

LocalMemory

H tчитать/писать:

Global MemoryConstant Memory

ConstantMemory

GlobalMemory

Host

Texture MemoryTextureMemory

Page 12: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Параметры GPU GeForce 8800GTXПараметры GPU GeForce 8800GTX

Programming model:Максимум 512 процессов в блоке (512х512х64)Максимальные размеры сетки (65535х65535)М й 2 йМаксимальный размер вычислительного ядра ~ 2 млн. инструкций

HW architecture:16 мультипроцессоров (Streaming Multiprocessors SM) / 128 потоковых 16 мультипроцессоров (Streaming Multiprocessors - SM) / 128 потоковых процессоров (Streaming Processors)Вплоть до 8 блоков исполняются одновременно на каждом SMВплоть до 24 варпов (warps*) исполняются одновременно на каждом SMВплоть до 768 процессов исполняются одновременно на каждом SMКоличество регистров на SM - 819216k общей памяти на SM / 16 банков64k ( 8k SM)64k памяти конcтант (кэшируется по 8k на SM)

32-разрядная IEEE float арифметика

*warp = часть блока, исполняемая на SM в SIMD виде

Page 13: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Процедура разработки программыПроцедура разработки программы

Global и Local память расположена на устройстве – DRAM –обращение к ней очень медленноеОбщий подход к програмированию

Разбить задачу на элементарные блоки данных, над которыми выполняется стандартный алгоритм обработки (единый для всех блоков)Разбить за /вы гружаемые данные на элементарные Разбить за-/вы- гружаемые данные на элементарные непересекающиеся блоки, которые каждый из процессов прочтёт/запишетОпределить конфигурацию грида/блока, позволяющее Определить конфигурацию грида/блока, позволяющее

Оптимальное размещение промежуточных данных в регистрах и общей памятиОптимальную вычислительную загрузку потоковых процессоров

Определить график когерентного обращения к памяти Определить график когерентного обращения к памяти процессами при загрузке данных

Много-кретерийная оптимизация – нет простого алгоритма решения“Как сделать автомобили дешёвыми и безопасными”Как сделать автомобили дешёвыми и безопасными

Page 14: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Размещение различных данных в Размещение различных данных в различной памяти

Constant и Texture память тоже расположена на устройстве (DRAM). Но эти типы кэшированы = быстрый доступ

Распределение элементов данных по типам памяти

R/O no structure -> constant memoryR/O no structure -> constant memory

R/O array structured -> texture memory

R/W shared within Block -> shared memory

R/W i t R/W registers при переполнении автоматически отправляются в local memory

R/W inputs/results > global memoryR/W inputs/results -> global memory

Page 15: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

C модификация –C модификация объявление переменных

Модификатор Память Область Срок жизни

__device__ __local__ int LocalVar; local thread thread

device shared int SharedVar; shared block block__device__ __shared__ int SharedVar; shared block block

__device__ int GlobalVar; global grid application

__device__ __constant__ int ConstantVar; constant grid application

__device__ можно опустить если есть модификаторы __local__,__shared__ или __constant__

Автоматические переменные, размещаются в регистрах (! Нужно следить за тем, чтобы массив регистров не переполнялся)Автоматические массивы – в local памяти

Указатели используются только с областями в global памяти

Page 16: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Массивы в shared памятиМассивы в shared памяти

__global__ void CUDAforwardpropagateCALCv6(float *in,float *wm,float *bv,float*lo,int insize,int outsize,int r,int wm_pitch){

extern __shared__ float sharray[];float* laSH1=&sharray[0];float* laSH2=&sharray[128];

********************************

CUDA_SAFE_CALL( cudaThreadSynchronize() );CUDAforwardpropagateCALCv6<<<grid, threads,threads.x*sizeof(float)>>>(in,wm,…);

iCUDA_SAFE_CALL( cudaThreadSynchronize() );

Динамические массивы в shared памятиВсего лишь выделение области shared памятиВсего лишь выделение области shared памятиНеобходимо явно указывать смещения реальных объектов данныхПомнить пользоваться syncthreads() при записи/чтенииПомнить пользоваться __syncthreads() при записи/чтении

Page 17: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Пересылка данныхПересылка данных

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

cudaMemsetcudaMemsetif(cudaMemset(ldCU,0,ns*sizeof(float))!=cudaSuccess)throw Unsupported(this->Name,"CUDA has failed to zero-init LD.");

cudaMemcpycudaMemcpyif(cudaMemcpy(bvCU,bvF32,ns*sizeof(FLT32),cudaMemcpyHostToDevice)!=cudaSuccess) throw Unsupported(this->Name,"CUDA failed to upload BV.");

О бОсвобождение памятиcudaFreeif(cudaFree(wmCU)!=cudaSuccess) throw Unsupported(this->Name "CUDA has failed to de-allocate WM ");throw Unsupported(this->Name, CUDA has failed to de-allocate WM. );

Page 18: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

C модификация – векторные типыC модификация векторные типы

Существуют следующие векторные типы:

char1, uchar1, char2, uchar2, char3, uchar3, char4, uchar4, short1, ushort1, short2, ushort2, short3, ushort3, short4, ushort4, int1, uint1, int2, uint2, int3, uint3, int4, uint4, long1, ulong1, long2, ulong2, long3, ulong3, long4, ulong4, float1 float2 float3 float4float1, float2, float3, float4

Структуры с полями x, y, z, w:uint4 param;uint4 param;int y = param.y;

dim3dim3

Основан на типе uint3Используется для указания параметров вычислительного ядра

Page 19: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Что такое ВОРП (WARP)?Что такое ВОРП (WARP)?

Device делает 1 grid в любой момент

SM обрабатывает 1 или более blocks

Device

Multiprocessor N

Каждый Block разделён на SIMD группы, внутри которых одни и те же инструкции

Multiprocessor 2Multiprocessor 1

Shared Memory

выполняются реально одновременно над различными данными (warps) warp size=16/32

Instruction

UnitProcessor 1

Registers

…Processor 2

Registers

Processor M

Registers

Связывание в ворпы детерминировано в порядке нарастания threadID

ConstantCache

TextureCache

threadID=TIDX.x+TIDX.y*Dx+TIDX.z*Dx*Dy

Важно! Полуворп – первая или вторая

Device memory

Важно! Полуворп – первая или вторая половина ворпа

Page 20: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Обращение с памятью из ворпаОбращение с памятью из ворпа

НЕАТОМАРНЫЕ ИНСТРУКЦИИ (G80)ЕСЛИ какая-либо инструкция исполняемая ворпом пишет в одно место в глобальной или общей памяти ТО количество записей и их очерёдность недетерминированыОДНАКО по крайней мере одна запись состоится

АТОМАРНЫЕ ИНСТРУКЦИИ (G92+)ЕСЛИ какая-либо инструкция исполняемая ворпом пишет/читает/модифицирует одно место в глобальной памяти ТО их очерёдность записей недетерминированаОДНАКО все записи состоятся последовательно

Page 21: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Когерентность общения с Когерентность общения с глобальной памятью (часть 1)

Чтение 32- 64- 128- битных слов за 1 инструкциюТип размещаемых данных type должен удовлетворять условию sizeof(type) равен 4, 8, 16 байту ( yp ) р , ,

Нужно пользоваться модификаторами __align__(8) или align (16) для “плохих” типов (как например float3)__align__(16) для плохих типов (как например float3)

struct __align__(16) { float a; float b; float c; float d; float e; ;};

Пример позволяет обойтись двумя 128-битными чтениями 5 32 бместо 5 32-битных

Page 22: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Когерентность общения с Когерентность общения с глобальной памятью (часть 2)

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

Необходимо, чтобы операция с памятью была оформлена в обращение к единой непрерывной области с адресом в обращение к единой непрерывной области с адресом (где N – индекс в полуворпе) HalfWarpBaseAddress + N

HalfWarpBaseAddress типа type* и равна16*sizeof(type)

Подобные требования рекомендуется выполнять для целых ворпов (для совместимости с будущими устройствами)

Page 23: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Примеры когерентных и Примеры когерентных и некогерентных обращений

Page 24: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Итоги лекцииИтоги лекции

В результате лекции студенты должны :Понимать возможности использования GPU для осуществления параллельных вычислений

Иметь понятие об организации разрабокти приложенийЦикл планирования приложенияМодель памяти GPU устройстваМодификации языка С используемые для обращения с элементами данных

Достаточные знания для начала самостоятельной работы