Дослідження засобів організації паралельних...

27
Дослідження засобів Дослідження засобів організації паралельних організації паралельних обчислень на графічних обчислень на графічних процесорах процесорах Кобилінський Олександр Анатолійович Корначевський Ярослав Ілліч НТУУ «КПІ» ННК «ІПСА»

Upload: ryder-hardin

Post on 14-Mar-2016

65 views

Category:

Documents


4 download

DESCRIPTION

НТУУ «КПІ» ННК «ІПСА». Дослідження засобів організації паралельних обчислень на графічних процесорах. Кобилінський Олександр Анатолійович К орначевський Ярослав Ілліч. GPGPU. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Дослідження засобів організації паралельних обчислень на графічних процесорах

Дослідження засобів Дослідження засобів організації паралельних організації паралельних обчислень на графічних обчислень на графічних

процесорахпроцесорах

Кобилінський Олександр Анатолійович Корначевський Ярослав Ілліч

НТУУ «КПІ» ННК «ІПСА»

Page 2: Дослідження засобів організації паралельних обчислень на графічних процесорах

GPGPUУ наш час вже нічим не здивувати. У нас з'явилися телефони, які з

легкістю вміщуються в долоні і керуються лише дотиками пальця до дисплея, абсолютно крихітні аудіо-плеєри, високошвидкісні канали зв'язку, за допомогою яких без затримок можна обмінюватися великими обсягами різної інформації, високопродуктивні процесори і тонкі ноутбуки все з тими ж продуктивними процесорами. Але є одна велика проблема - обробка інформації і даних у встановлені терміни. Буває, що навіть найсучасніших серверних залів з найсучаснішими процесорами недостатньо і економічно невигідно використовувати для рішень поставлених завдань. Тут вступає в гру, не так давно отримавши масове визнання, напрямок GPGPU - загальні обчислення на графічних процесорах.

З кожним днем графічні процесори стають все більш продуктивними. То чому б не скористатися даною продуктивністю, і не розвантажити центральний процесор? Схоже таке запитання задали собі всі великі компанії і створили відповідні технології. У AMD технологія GPGPU має назву ATI Stream, а у NVIDIA - CUDA.

Page 3: Дослідження засобів організації паралельних обчислень на графічних процесорах

Сучасний графічний процесор

Загальна схема архітектури G80. Тут: ВПВ – вибірка з потоку вершин (Vertex Thread Issue); ВПГ – вибірка з потоку геометрії (Geometry Thread Issue); ВПП – вибірка з потоку пікселів (Pixel Thread Issue); ПУП – процесор управління потоками (Thread Processor); SP – потоковий процесор (Streaming Processor); TF – блок фильтрації текстур (Texture Filtering Unit); L1 – кеш-память первого рівня; L2 – кеш-память другого рівня; FB – шина обміну даними (Front Bus)

Page 4: Дослідження засобів організації паралельних обчислень на графічних процесорах

Архітектура R600Загальна схема архітектури R600:

Page 5: Дослідження засобів організації паралельних обчислень на графічних процесорах

Fermi – революція від NVIDIA

Page 6: Дослідження засобів організації паралельних обчислень на графічних процесорах

Fermi та CUDAНововведення в архітектурі Fermi:

• підтримує всі чотири методи округлення за стандартом IEEE 754-2008 (до найближчого ненульового значення, до нуля, до позитивної та негативної безкінечностей), що робить її повністю підходящою для наукових обчислень з 32-бітної точністю.

• кардинально перероблений механізм обчислень з подвійною точністю, тепер кожен мультипроцесор може обробити до 16 операцій додавання-множення з подвійною точністю за такт.

• введення підтримки корекції помилок ECC • нове покоління GigaThread Engine здатне запускати на виконання відразу

кілька так званих ядер CUDA • зручність розробки ПЗ. По-перше, тепер використовується загальний адресний

простір пам'яті для CUDA, що дозволяє NVIDIA говорити про повну підтримку об'єктно-орієнтованих мов програмування C і С++

• замість 16-кілобайтної колективної пам'яті в структурі SM тепер є 64 КБ, що розподіляються за необхідності на загальну пам'ять і традиційний L1-кеш

Page 7: Дослідження засобів організації паралельних обчислень на графічних процесорах

Відмінності між CPU та GPU

Page 8: Дослідження засобів організації паралельних обчислень на графічних процесорах

Сучасні терафлопи

Динаміка зростання потужностей сучасних процесорів

Page 9: Дослідження засобів організації паралельних обчислень на графічних процесорах

CUDACUDA - це скорочення від Compute Unified Device Architecture, тобто

уніфікована архітектура комп'ютерних обчислень. Це комплекс апаратно-програмних засобів, який дозволяє запускати програмний код на графічному процесорі (GPU).

Протягом останніх 10-15 років традиційні CPU нарощували продуктивність при виконанні послідовного коду шляхом ускладнення архітектури. Аналізуючи код, вони намагалися збільшити його ефективність на етапі виконання. Продовжувалося збільшення розмірів кеш-пам'яті, нарощування тактової частоти. Однак сьогодні можливості подальшого нарощування швидкості виконання послідовного коду практично підійшли до межі. Єдиним виходом є паралелізм. Тому GPU стає все більш і більш популярним як обчислювач. За умови правильного написання коду під GPU можна отримати велику продуктивність на квадратний міліметр кристалу, одиницю витраченої енергії, долар і т.п. GPU використовують інший підхід до нарощування продуктивності: графічний процесор використовує масиви, або «море» обчислювачів, які працюють паралельно, але, як правило, на більш низькій частоті. Така архітектура кардинально відрізняється, і CUDA - програмно-апаратна платформа, яка дозволяє розробникам використовувати потенціал цих масивів, при цьому застосовуючи стандартні засоби розробки.

Page 10: Дослідження засобів організації паралельних обчислень на графічних процесорах

CUDA потоки

Рис. Умовне зображення архітектури GT200

Візьмемо реалізацію CUDA в графічному процесорі GT200. Він має 30 мультипроцесорів, один мультипроцесор працює на частоті приблизно 1,4 GHz, має 8 виконавчих пристроїв загального призначення, які виконують за такт типові операції, як то: додавання і множення дійсних чисел типу float, порівняння, умовні переходи, логічні операції, операції з регістрами.

Page 11: Дослідження засобів організації паралельних обчислень на графічних процесорах

Один мультипроцесор може одночасно виконувати 1024 програмних потоків(ниток). Але виконавчих пристроїв всього 8. Тому інструкції всіх 1024 потоків в один момент виконуватися не можуть. Нитки розбиті на групи по 32 штуки, так звані warp. В один момент виконується один warp, він виконується 4 такти. Але, з усіх 32 ниток, за один захід реально виконуються тільки ті, які виконують одну й ту ж інструкцію програми.Кожна нитка CUDA-додатку виконує одну і ту ж саму програму, але алгоритму доступний номер нитки, і тому алгоритм може довільно змінюватися залежно від її номера. Можна запустити хоч 10000 різних підпрограм, для кожної нитки вибравши свою. Але це буде неефективно із-за вищенаведеної особливості виконання warp. Коли всі нитки усередині кожного warp мають однаковий шлях виконання, досягається максимальна продуктивність.

CUDA потоки

Page 12: Дослідження засобів організації паралельних обчислень на графічних процесорах

Організація потоків CUDA

Page 13: Дослідження засобів організації паралельних обчислень на графічних процесорах

Типи пам`яті в CUDAТип

пам`ятіРозташування Кешується Доступ Рівень доступу Час життя

Регістри Мультипроцесор Ні 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

Page 14: Дослідження засобів організації паралельних обчислень на графічних процесорах

Компіляція програм на CUDAДля того, щоб використовувати

CUDA на комп'ютері, необхідно наступне:1. CUDA-сумісний GPU2. GPU драйвер, що містить в собі CUDA драйвер3. СUDA software

Для написання CUDA-додатків можно використовувати будь-який текстовий редактор. Зазвичай, для написання CUDA-програм під операційну систему Microsoft Windows використовують інструментальне середовище Microsoft Visual Studio.

Варто відзначити появу вкрай корисного інструментарію NVIDIA Nexus - надбудови для Microsoft Visual Studio, що дозволяє писати код, відслідковувати помилки, компілювати і тестувати ПЗ в цьому середовищі розробки з використанням звичних інструментів.

Page 15: Дослідження засобів організації паралельних обчислень на графічних процесорах

CUDA позначенняПозначення функцій, перед функціями в .сu файлі можуть стояти наступні

«модифікатори»: __device__ __global__ __host__

Позначення даних: __device__ - означає що змінна знаходиться в глобальній пам'яті відеокарти (тобто якої там 512Мб,

тобто). Дуже повільна пам'ять за мірками обчислень на відеокарті (хоча і швидше пам'яті центрального процесора в кілька разів), рекомендується використовувати як можна рідше.cudaMemcpy (device_variable, host_variable, size, cudaMemcpyHostToDevice); cudaMemcpyDeviceToHost – читання або запис даних у зворотній бік зворотний бік

__constant__ - задає змінну в константній пам'яті. __shared__ - задає змінну в колективній пам'яті блоку потоків (тобто і значення буде спільне на всіх).

Потрібно використовувати __syncthreads (); щоб дані гарантовано записалися.

Page 16: Дослідження засобів організації паралельних обчислень на графічних процесорах

Використання CUDAЗазвичай використання CUDA зводиться до

наступних етапів:виділяємо пам`ять на GPUкопіюємо дані з пам`яті CPU у виділену пам`ять GPUздійснюємо запуск ядра(або послідовно запускаємо

декілька ядер)копіюємо результати обчислень назад в пам`ять CPUзвільнюємо виділену пам`ять GPU

Page 17: Дослідження засобів організації паралельних обчислень на графічних процесорах

Множення матриць // Parallel matrix multiplication__global__ void matrixMultiplicationParallel(float *matrixA, float *matrixB, float *matrixC, int numColsA, int numColsB){ // Block index int bx = blockIdx.x; int by = blockIdx.y; // Thread index int tx = threadIdx.x; int ty = threadIdx.y; int row = bx * blockDim.x + tx; int col = by * blockDim.y + ty; unsigned int k = 0; unsigned int idA = 0; unsigned int idB = 0; matrixC[row * numColsB + col] = 0; for(k = 0; k < numColsA; k++) { idA = row * numColsA + k; idB = k * numColsB + col; matrixC[row * numColsB + col] += matrixA[idA] * matrixB[idB]; }}

Page 18: Дослідження засобів організації паралельних обчислень на графічних процесорах

ATI StreamТехнологія ATI Stream являє собою набір апаратних і програмних

технологій, які дозволяють графічним процесорам AMD (GPU), що працюють у взаємодії з центральними процесорами системи (CPU), для прискорення додатків за межами традиційної графіки і обробки відео. Це дозволяє виконувати складні обчислювальні завдання більш ефективно.

Для того щоб використовувати ATIStream потрібно лише встановити ATI Stream SDK. ATI Steam SDK 2.1 забезпечує програмування з використанням OpenCL для GPU і x86-сумісних CPU AMD. Інакше кажучи, ATI Stream SDK допомагає розробникам підвищити продуктивність додатків за рахунок використання об'єднаних ресурсів CPU і GPU, доступних в системі.

Page 19: Дослідження засобів організації паралельних обчислень на графічних процесорах

OpenCLOpenCL - фреймворк для створення комп'ютерних програм,

пов'язаних з паралельними обчисленнями на різних графічних і центральних процесорах. У фреймворк OpenCL входять мова програмування, яка базується на стандарті C99, та інтерфейс програмування комп'ютерних програм (API). OpenCL - повністю відкритий стандарт, його використання доступне на базі вільних ліцензій.

Мета OpenCL полягає в тому, щоб доповнити OpenGL і OpenAL, які є відкритими галузевими стандартами для тривимірної комп'ютерної графіки і звуку, користуючись можливостями GPU.

OpenCL(Khronos Group)

NVIDIA CUDA AMD(ATI) Stream

Page 20: Дослідження засобів організації паралельних обчислень на графічних процесорах

Моделі OpenCL

Модель платформи OpenCL

Модель виконання OpenCL

Платформа OpenCL складається з хоста поєднаного з пристроями, що підтримують OpenCL.

Виконання OpenCL-програми складається з двох частин: хостової частини програми і kernel(ядра)

Page 21: Дослідження засобів організації паралельних обчислень на графічних процесорах

Моделі OpenCL

Модель пам`яті OpenCL

Програмна модель OpenCL

Page 22: Дослідження засобів організації паралельних обчислень на графічних процесорах

Використання OpenCLПозначення функцій OpenCL:

__kernel декларує функцію як ядро OpenCL Позначення даних:

__global __constant __local __private

// OpenCL Kernel Function for matrix addition__kernel void addMatrix(__global float *matrixA, __global float *matrixB, __global float *matrixC, int HC, int WC){ unsigned int row = get_group_id(0) * get_local_size(0) + get_local_id(0); unsigned int col = get_group_id(1) * get_local_size(1) + get_local_id(1); unsigned int index = row *WC + col; if ( row < HC && col < WC ) { matrixC[index] = matrixA[index] + matrixB[index]; }}

Page 23: Дослідження засобів організації паралельних обчислень на графічних процесорах

Результати досліджень

N 1000 3000 5000CPU, мкс 11 97 252GPU, мкс 0,0497 0,052 Out of

memory

Page 24: Дослідження засобів організації паралельних обчислень на графічних процесорах

Результати досліджень

N 50 500 1000 2000 3000 4000 5000 60007000

CPU 0 0 0,016 0,047 0,125 0,219 0,328 0.5 0.703

GPU(CUDA) 0,0000279 0,0000413 0,000045 0,000047 0,0000468 0,000053 0,00004775 0.00004808 0.0000485

GPU(CUDA shared) 0,0000127 0,0000151 0,0000135 0,0000133 0,0000131 0,0000135 0,0000133 0.00001336 0.00001315

Транспонування матриці

Page 25: Дослідження засобів організації паралельних обчислень на графічних процесорах

Результати досліджень

Порівняння OpenCL та CUDA

N 16*4 16*8 16*16 16*32 16*64Seq, мкс

0,003 0,0032 0,259 2,225 60,7

CUDA 0,0000172

0,000034

0,000037

0,000047

0,000049

CUBLAS 0,000054

0,000212

0,000852

0,0065 0,0052

Page 26: Дослідження засобів організації паралельних обчислень на графічних процесорах

Результати дослідженьПослідовний пошук

N 100 1000 5000 50000 100000

300000

Seq ~0 ~0 ~0 ~0 ~0 0,0021CUDA 0,0005

60,00062

0,00069

0,00075

0,00103

0,0027

N 1+E6 5+E6 10+E6 50+E6 100+E6

400E+6

Seq 0,004 0,004 0,019 0,020 0,37 10,1CUDA 0,0037 0,0037 0,014 0,09 0,17 0,8

Page 27: Дослідження засобів організації паралельних обчислень на графічних процесорах

ВисновкиЗ кожним днем графічні процесори стають все більш продуктивними. Сьогодні їх використовують не лише для розрахунку графічних задач, але й для більш широкого колу задач. На графічних процесорах добре вирішувати задачі з високою ступінню паралелізму. Але потрібно звичайно ж зважати і на аспекти роботи з GPU.Провідні гравці на ринку графічних процесорів швидко усвідомили перспективність напрямку GPGPU та випустили власні технології для розпаралелювання задач на своїх графічних процесорах: у NVIDIA це CUDA, у AMD – це ATI Stream. Але ж не переписувати кожного разу додаток з однієї платформи на іншу? Схоже це запитання задала собі компанія Apple та ініціювала розробку такого стандарту як OpenCL. Консорціум Khronos Group, в який входить багато компаній, розробляє стандарт OpenCL. Стандарт OpenCL на даний момент підтримують і NVIDIA і AMD, а також Apple у своїй операційній системі Mac OS X.Вже сьогодні технології GPGPU знаходять своє застосування у багатьох галузях науки. Окрім цього, щодня удосконалюються архітектури графічних процесорів та програмні засоби для розробки додатків під ці архітектури. Технологія CUDA дозволвяє у сотні разів збільшити швидкодію додатків. Швидше за все, в майбутньому CPU та GPU зіллються в один пристрій.