Upload
a15464321646213
View
148
Download
1
Embed Size (px)
DESCRIPTION
Слайды лекции курса "Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов".
Citation preview
Архитектура и программирование Архитектура и программирование потоковых многоядерных процессоров
для научных расчётовдля научных расчётов
Лекция 3. Типы параллелизмаМ CUDAМодель памяти CUDA
Возможные виды параллелизмаВозможные виды параллелизма
Классификация Флина (SISD,SIMD, etc.) не вполне отражает вариации архитектур современных выч устройств
С ё Сложно отнести к какому-то определённому классуФизическая многоядерность VS Одно ядро над различными контекстами во времениРазличные виды конвейеровРазличные виды конвейеров
Буферизованные / не буферизованные | синхронные / асинхронные
Разбиение на независимые пути выполнения на высоком и Разбиение на независимые пути выполнения на высоком и низком уровне
CPU – высокий уровень / GPU – низкий уровеньПараллелизм на различных данных на независимых путяхПараллелизм на различных данных, на независимых путяхисполнения или на уровне инструкций
GPU – над данными / CPU – на путях исполненияВекторные VS скалярные АЛУВекторные VS скалярные АЛУ
Параллелизм задач –возможность Параллелизм задач возможность применения праллельных методов
Если параллелизм отсутствует в исходной задаче – параллелизм счётного устройства не даст выигрышаБольшие задачи в подавляющем количестве случаев –упараллельны
Способ мышления человека – составление сложных объектов и методов как комбинаций простых (от простого к сложному) –
модель газа состоит из одинаковых частицСвойства физического мира (принцип локальности взаимодействия) - задачи динамики газов и жидкостейСвойства математических объектов перебор / независимые Свойства математических объектов – перебор / независимые испытания
Хорошее приложение это:Много входов / много выходовМного входов / много выходовСуществование параллельных путей ведения рассчётовОграниченность взаимодействия между отдельными путямиБольшое кол во вычислений на обращение к памятиБольшое кол-во вычислений на обращение к памяти
Традиции архитектуры CPUТрадиции архитектуры CPU
Одноядерные процессорыразвивались ~ 40 летТ CPU Теперь количество ядер CPU удваивается ежегодноТрадиционное ядро не содержит поддержки параллелизмаподдержки параллелизма
Скалярная модель исполнения программРазмещение тредов по ядрам(б й ) (баланс вычислительной нагрузки) –новинка для операционных системПрограммист должен примерно представлять конфигурацию PUНет универсального автоматического решения (проблема кэширования)
Почему нельзя далее наращивать Почему нельзя далее наращивать скорость ядра?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
Пример архитектуры CellПример архитектуры Cellпроцессора (IBM & Sony)
PPE – Power Processor Element (распределяет нагрузку между отдельными вычислительными блоками)SPU – Synergistic Processing Unit (векторное ядро, цифровой сигнальный процессор)Сложен в программировании - предполагает параллелизм высокого уровняПрограммист пишет код для каждого SPU отдельноПрограммист пишет код для каждого SPU отдельно
Альтернатива – использование Альтернатива использование GPU
GPGPU приложение
Геометрия данных
Перенос данных Задачи схожие с графикой – позволяющие параллелизм низкого
Счет
параллелизм низкого уровня
Одна программаСчет
Память
Одна программавыполняется для большого количествачастей задачиПамять
Вычислительная конфигурация Вычислительная конфигурация 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)
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 …
Использование общей памятиИспользование общей памяти
Прямое чтение данных во многие АЛУ - неоптимально
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 …
Модель памяти 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
Параметры 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 виде
Процедура разработки программыПроцедура разработки программы
Global и Local память расположена на устройстве – DRAM –обращение к ней очень медленноеОбщий подход к програмированию
Разбить задачу на элементарные блоки данных, над которыми выполняется стандартный алгоритм обработки (единый для всех блоков)Разбить за /вы гружаемые данные на элементарные Разбить за-/вы- гружаемые данные на элементарные непересекающиеся блоки, которые каждый из процессов прочтёт/запишетОпределить конфигурацию грида/блока, позволяющее Определить конфигурацию грида/блока, позволяющее
Оптимальное размещение промежуточных данных в регистрах и общей памятиОптимальную вычислительную загрузку потоковых процессоров
Определить график когерентного обращения к памяти Определить график когерентного обращения к памяти процессами при загрузке данных
Много-кретерийная оптимизация – нет простого алгоритма решения“Как сделать автомобили дешёвыми и безопасными”Как сделать автомобили дешёвыми и безопасными
Размещение различных данных в Размещение различных данных в различной памяти
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
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 памяти
Массивы в 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() при записи/чтении
Пересылка данныхПересылка данных
Копирование между хостом и устройством
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. );
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Используется для указания параметров вычислительного ядра
Что такое ВОРП (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
Важно! Полуворп – первая или вторая половина ворпа
Обращение с памятью из ворпаОбращение с памятью из ворпа
НЕАТОМАРНЫЕ ИНСТРУКЦИИ (G80)ЕСЛИ какая-либо инструкция исполняемая ворпом пишет в одно место в глобальной или общей памяти ТО количество записей и их очерёдность недетерминированыОДНАКО по крайней мере одна запись состоится
АТОМАРНЫЕ ИНСТРУКЦИИ (G92+)ЕСЛИ какая-либо инструкция исполняемая ворпом пишет/читает/модифицирует одно место в глобальной памяти ТО их очерёдность записей недетерминированаОДНАКО все записи состоятся последовательно
Когерентность общения с Когерентность общения с глобальной памятью (часть 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-битных
Когерентность общения с Когерентность общения с глобальной памятью (часть 2)
Каждый тред из полуворпа обращается к глобальной памяти одновременнод р
Необходимо, чтобы операция с памятью была оформлена в обращение к единой непрерывной области с адресом в обращение к единой непрерывной области с адресом (где N – индекс в полуворпе) HalfWarpBaseAddress + N
HalfWarpBaseAddress типа type* и равна16*sizeof(type)
Подобные требования рекомендуется выполнять для целых ворпов (для совместимости с будущими устройствами)
Примеры когерентных и Примеры когерентных и некогерентных обращений
Итоги лекцииИтоги лекции
В результате лекции студенты должны :Понимать возможности использования GPU для осуществления параллельных вычислений
Иметь понятие об организации разрабокти приложенийЦикл планирования приложенияМодель памяти GPU устройстваМодификации языка С используемые для обращения с элементами данных
Достаточные знания для начала самостоятельной работы