ТЕХНОЛОГІЇ РОЗПОДІЛЕНИХ СИСТЕМ ТА ПАРАЛЕЛЬНИХ ОБЧИСЛЕНЬ (лекції)
Дослідження засобів організації паралельних...
-
Upload
ryder-hardin -
Category
Documents
-
view
53 -
download
4
description
Transcript of Дослідження засобів організації паралельних...
![Page 1: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/1.jpg)
Дослідження засобів Дослідження засобів організації паралельних організації паралельних обчислень на графічних обчислень на графічних
процесорахпроцесорах
Кобилінський Олександр Анатолійович Корначевський Ярослав Ілліч
НТУУ «КПІ» ННК «ІПСА»
![Page 2: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/2.jpg)
GPGPUУ наш час вже нічим не здивувати. У нас з'явилися телефони, які з
легкістю вміщуються в долоні і керуються лише дотиками пальця до дисплея, абсолютно крихітні аудіо-плеєри, високошвидкісні канали зв'язку, за допомогою яких без затримок можна обмінюватися великими обсягами різної інформації, високопродуктивні процесори і тонкі ноутбуки все з тими ж продуктивними процесорами. Але є одна велика проблема - обробка інформації і даних у встановлені терміни. Буває, що навіть найсучасніших серверних залів з найсучаснішими процесорами недостатньо і економічно невигідно використовувати для рішень поставлених завдань. Тут вступає в гру, не так давно отримавши масове визнання, напрямок GPGPU - загальні обчислення на графічних процесорах.
З кожним днем графічні процесори стають все більш продуктивними. То чому б не скористатися даною продуктивністю, і не розвантажити центральний процесор? Схоже таке запитання задали собі всі великі компанії і створили відповідні технології. У AMD технологія GPGPU має назву ATI Stream, а у NVIDIA - CUDA.
![Page 3: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/3.jpg)
Сучасний графічний процесор
Загальна схема архітектури 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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/4.jpg)
Архітектура R600Загальна схема архітектури R600:
![Page 5: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/5.jpg)
Fermi – революція від NVIDIA
![Page 6: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/6.jpg)
Fermi та CUDAНововведення в архітектурі Fermi:
• підтримує всі чотири методи округлення за стандартом IEEE 754-2008 (до найближчого ненульового значення, до нуля, до позитивної та негативної безкінечностей), що робить її повністю підходящою для наукових обчислень з 32-бітної точністю.
• кардинально перероблений механізм обчислень з подвійною точністю, тепер кожен мультипроцесор може обробити до 16 операцій додавання-множення з подвійною точністю за такт.
• введення підтримки корекції помилок ECC • нове покоління GigaThread Engine здатне запускати на виконання відразу
кілька так званих ядер CUDA • зручність розробки ПЗ. По-перше, тепер використовується загальний адресний
простір пам'яті для CUDA, що дозволяє NVIDIA говорити про повну підтримку об'єктно-орієнтованих мов програмування C і С++
• замість 16-кілобайтної колективної пам'яті в структурі SM тепер є 64 КБ, що розподіляються за необхідності на загальну пам'ять і традиційний L1-кеш
![Page 7: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/7.jpg)
Відмінності між CPU та GPU
![Page 8: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/8.jpg)
Сучасні терафлопи
Динаміка зростання потужностей сучасних процесорів
![Page 9: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/9.jpg)
CUDACUDA - це скорочення від Compute Unified Device Architecture, тобто
уніфікована архітектура комп'ютерних обчислень. Це комплекс апаратно-програмних засобів, який дозволяє запускати програмний код на графічному процесорі (GPU).
Протягом останніх 10-15 років традиційні CPU нарощували продуктивність при виконанні послідовного коду шляхом ускладнення архітектури. Аналізуючи код, вони намагалися збільшити його ефективність на етапі виконання. Продовжувалося збільшення розмірів кеш-пам'яті, нарощування тактової частоти. Однак сьогодні можливості подальшого нарощування швидкості виконання послідовного коду практично підійшли до межі. Єдиним виходом є паралелізм. Тому GPU стає все більш і більш популярним як обчислювач. За умови правильного написання коду під GPU можна отримати велику продуктивність на квадратний міліметр кристалу, одиницю витраченої енергії, долар і т.п. GPU використовують інший підхід до нарощування продуктивності: графічний процесор використовує масиви, або «море» обчислювачів, які працюють паралельно, але, як правило, на більш низькій частоті. Така архітектура кардинально відрізняється, і CUDA - програмно-апаратна платформа, яка дозволяє розробникам використовувати потенціал цих масивів, при цьому застосовуючи стандартні засоби розробки.
![Page 10: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/10.jpg)
CUDA потоки
Рис. Умовне зображення архітектури GT200
Візьмемо реалізацію CUDA в графічному процесорі GT200. Він має 30 мультипроцесорів, один мультипроцесор працює на частоті приблизно 1,4 GHz, має 8 виконавчих пристроїв загального призначення, які виконують за такт типові операції, як то: додавання і множення дійсних чисел типу float, порівняння, умовні переходи, логічні операції, операції з регістрами.
![Page 11: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/11.jpg)
Один мультипроцесор може одночасно виконувати 1024 програмних потоків(ниток). Але виконавчих пристроїв всього 8. Тому інструкції всіх 1024 потоків в один момент виконуватися не можуть. Нитки розбиті на групи по 32 штуки, так звані warp. В один момент виконується один warp, він виконується 4 такти. Але, з усіх 32 ниток, за один захід реально виконуються тільки ті, які виконують одну й ту ж інструкцію програми.Кожна нитка CUDA-додатку виконує одну і ту ж саму програму, але алгоритму доступний номер нитки, і тому алгоритм може довільно змінюватися залежно від її номера. Можна запустити хоч 10000 різних підпрограм, для кожної нитки вибравши свою. Але це буде неефективно із-за вищенаведеної особливості виконання warp. Коли всі нитки усередині кожного warp мають однаковий шлях виконання, досягається максимальна продуктивність.
CUDA потоки
![Page 12: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/12.jpg)
Організація потоків CUDA
![Page 13: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/13.jpg)
Типи пам`яті в 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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/14.jpg)
Компіляція програм на CUDAДля того, щоб використовувати
CUDA на комп'ютері, необхідно наступне:1. CUDA-сумісний GPU2. GPU драйвер, що містить в собі CUDA драйвер3. СUDA software
Для написання CUDA-додатків можно використовувати будь-який текстовий редактор. Зазвичай, для написання CUDA-програм під операційну систему Microsoft Windows використовують інструментальне середовище Microsoft Visual Studio.
Варто відзначити появу вкрай корисного інструментарію NVIDIA Nexus - надбудови для Microsoft Visual Studio, що дозволяє писати код, відслідковувати помилки, компілювати і тестувати ПЗ в цьому середовищі розробки з використанням звичних інструментів.
![Page 15: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/15.jpg)
CUDA позначенняПозначення функцій, перед функціями в .сu файлі можуть стояти наступні
«модифікатори»: __device__ __global__ __host__
Позначення даних: __device__ - означає що змінна знаходиться в глобальній пам'яті відеокарти (тобто якої там 512Мб,
тобто). Дуже повільна пам'ять за мірками обчислень на відеокарті (хоча і швидше пам'яті центрального процесора в кілька разів), рекомендується використовувати як можна рідше.cudaMemcpy (device_variable, host_variable, size, cudaMemcpyHostToDevice); cudaMemcpyDeviceToHost – читання або запис даних у зворотній бік зворотний бік
__constant__ - задає змінну в константній пам'яті. __shared__ - задає змінну в колективній пам'яті блоку потоків (тобто і значення буде спільне на всіх).
Потрібно використовувати __syncthreads (); щоб дані гарантовано записалися.
![Page 16: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/16.jpg)
Використання CUDAЗазвичай використання CUDA зводиться до
наступних етапів:виділяємо пам`ять на GPUкопіюємо дані з пам`яті CPU у виділену пам`ять GPUздійснюємо запуск ядра(або послідовно запускаємо
декілька ядер)копіюємо результати обчислень назад в пам`ять CPUзвільнюємо виділену пам`ять GPU
![Page 17: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/17.jpg)
Множення матриць // 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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/18.jpg)
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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/19.jpg)
OpenCLOpenCL - фреймворк для створення комп'ютерних програм,
пов'язаних з паралельними обчисленнями на різних графічних і центральних процесорах. У фреймворк OpenCL входять мова програмування, яка базується на стандарті C99, та інтерфейс програмування комп'ютерних програм (API). OpenCL - повністю відкритий стандарт, його використання доступне на базі вільних ліцензій.
Мета OpenCL полягає в тому, щоб доповнити OpenGL і OpenAL, які є відкритими галузевими стандартами для тривимірної комп'ютерної графіки і звуку, користуючись можливостями GPU.
OpenCL(Khronos Group)
NVIDIA CUDA AMD(ATI) Stream
![Page 20: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/20.jpg)
Моделі OpenCL
Модель платформи OpenCL
Модель виконання OpenCL
Платформа OpenCL складається з хоста поєднаного з пристроями, що підтримують OpenCL.
Виконання OpenCL-програми складається з двох частин: хостової частини програми і kernel(ядра)
![Page 21: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/21.jpg)
Моделі OpenCL
Модель пам`яті OpenCL
Програмна модель OpenCL
![Page 22: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/22.jpg)
Використання 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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/23.jpg)
Результати досліджень
N 1000 3000 5000CPU, мкс 11 97 252GPU, мкс 0,0497 0,052 Out of
memory
![Page 24: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/24.jpg)
Результати досліджень
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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/25.jpg)
Результати досліджень
Порівняння 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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/26.jpg)
Результати дослідженьПослідовний пошук
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: Дослідження засобів організації паралельних обчислень на графічних процесорах](https://reader034.fdocument.pub/reader034/viewer/2022052415/5681313a550346895d97b147/html5/thumbnails/27.jpg)
ВисновкиЗ кожним днем графічні процесори стають все більш продуктивними. Сьогодні їх використовують не лише для розрахунку графічних задач, але й для більш широкого колу задач. На графічних процесорах добре вирішувати задачі з високою ступінню паралелізму. Але потрібно звичайно ж зважати і на аспекти роботи з GPU.Провідні гравці на ринку графічних процесорів швидко усвідомили перспективність напрямку GPGPU та випустили власні технології для розпаралелювання задач на своїх графічних процесорах: у NVIDIA це CUDA, у AMD – це ATI Stream. Але ж не переписувати кожного разу додаток з однієї платформи на іншу? Схоже це запитання задала собі компанія Apple та ініціювала розробку такого стандарту як OpenCL. Консорціум Khronos Group, в який входить багато компаній, розробляє стандарт OpenCL. Стандарт OpenCL на даний момент підтримують і NVIDIA і AMD, а також Apple у своїй операційній системі Mac OS X.Вже сьогодні технології GPGPU знаходять своє застосування у багатьох галузях науки. Окрім цього, щодня удосконалюються архітектури графічних процесорів та програмні засоби для розробки додатків під ці архітектури. Технологія CUDA дозволвяє у сотні разів збільшити швидкодію додатків. Швидше за все, в майбутньому CPU та GPU зіллються в один пристрій.