Відкрити головне меню

Гетерогенні обчислювальні системи — електронні системи, що використовують різні типи обчислювальних блоків. Обчислювальними блоками такої системи можуть бути процесор загального призначення (GPP), процесор спеціального призначення (наприклад, цифровий сигнальний процесор (DSP) або графічний процесор (GPU)), співпроцесор, логіка прискорення (спеціалізована інтегральна схема (ASIC) або програмується користувачем вентильна матриця (FPGA)).

Загалом, гетерогенна обчислювальна платформа містить процесори з різними наборами команд (ISA). Попит на підвищення гетерогенності в обчислювальних системах, частково пов'язаний з необхідністю в високо-продуктивних, високо-реакційних системах, які взаємодіють з іншим оточенням. У минулому, технологічні досягнення і масштабованість частоти дозволяли більшості комп'ютерних програм збільшувати продуктивність без структурних змін або апаратного прискорення. Хоча ці досягнення зберігаються, їх вплив на сучасні програми не так значно, як вплив деяких перешкод, таких як стіна пам'яті і стіна потужності. Тепер, з цими додатковими обмеженнями, основним методом отримання додаткової продуктивності обчислювальних систем є введення додаткових спеціалізованих ресурсів, в результаті чого обчислювальна система стає гетерогенною. Це дозволяє розробнику використовувати кілька типів обчислювальних елементів, кожен з яких здатний виконувати завдання, які найкраще для нього підходять. Додавання додаткових, незалежних обчислювальних ресурсів неминуче призводить до того, що більшість гетерогенних систем розглядаються як паралельні обчислення або багатоядерні системи. Ще один термін, який іноді використовується для цього типу обчислень «гібридні обчислення». (англ. hybrid-core computing) — форма гетерогенних обчислень, в якій асиметричні обчислювальні пристрої співіснують в одному процесорі.[1]

Зміст

Багатоядерні системиРедагувати

Протягом 30 років одним з основних методів підвищення швидкодії настільних комп'ютерів було збільшення тактової частоти процесора, а для цього потрібно було зробити основний осередок — комплементарну пару транзисторів (технологічний процес) як можна більш швидкодіючою, або якомога менших розмірів. Причому швидкодія осередку тим вище, чим тонше технологічний процес. Минуло 30 років — і тепер тактова частота процесорів в більшості настільних комп'ютерів складає від 1 до 4 ГГц. У 2005 році, коли стало зрозуміло, що подальший швидкий ріст тактової частоти CPU проблематичний, виробники CPU стали пропонувати процесори з двома обчислювальними ядрами замість одного. На даному етапі, гонка за зменшенням розміру осередку все ще триває. Але тепер її метою стало розмістити якомога більшу кількість осередків на кристалі, для отримання можливості ускладнення структури процесора (у тому числі збільшення кількості ядер та обсягу кешу) що дозволяє збільшити продуктивність. Друга причина — зниження споживаної ключем і відповідно процесором потужності. Істотне зростання тактових частот зупинилось. У подальшому виробники почали випускати CPU з трьома, чотирма, шістьма і вісьмома ядрами. Відбулася так звана багатоядерна революція.

Відмінності архітектур CPU і GPUРедагувати

Розробники CPU намагаються досягти виконання якомога більшої кількості інструкцій паралельно, для збільшення продуктивності. Для цього, починаючи з процесорів Intel Pentium, з'явилося суперскалярне виконання, що забезпечує виконання двох інструкцій за такт, а Pentium Pro відзначився позачерговим виконанням інструкцій. Але у паралельного виконання послідовного потоку інструкцій є певні базові обмеження, тому збільшенням кількості виконавчих блоків кратного збільшенню швидкості не досягти.

Торкнемося основних відмінностей між архітектурами CPU та GPU. Ядра CPU створені для виконання одного потоку послідовних інструкцій з максимальною продуктивністю, а GPU для швидкого виконання великої кількості паралельно виконуваних потоків інструкцій. Універсальні процесори оптимізовані для досягнення високої продуктивності єдиного потоку команд, що обробляє як цілі числа, так і числа з плаваючою крапкою. При цьому доступ до пам'яті — випадковий.

У відеочипів робота проста та розпаралелена з самого початку. Відеочип приймає на вході групу полігонів, проводить всі необхідні операції, і на виході видає пікселі. Обробка полігонів і пікселів незалежна, їх можна обробляти паралельно, окремо один від одного. Тому, через початкову паралельну організацію роботи в GPU використовується велика кількість виконавчих блоків, які легко завантажити, на відміну від послідовного потоку інструкцій для CPU. Крім того, сучасні GPU також можуть виконувати більше однієї інструкції за такт (англ. dual issue). GPU відрізняється від CPU ще й за принципами доступу до пам'яті. У GPU він пов'язаний і легко передбачуваний — якщо з пам'яті читається тексель текстури, то через деякий час прийде час і для сусідніх текселей. Та й при записі те ж — піксель записується під фреймбуфер, і через кілька тактів буде записуватися розташований поруч з ним. Тому організація пам'яті відрізняється від тієї, що використовується в CPU. І відеочипу, на відміну від універсальних процесорів, просто не потрібна кеш-пам'ять більшого розміру, а для текстур потрібні лише кілька (до 128—256 в нинішніх GPU) кілобайт.[2]

Та й сама по собі робота з пам'яттю у GPU і CPU дещо відрізняється. Так, не всі центральні процесори мають вбудовані контролери пам'яті, а у всіх GPU зазвичай є по кілька контролерів. Крім того, на відеокартах застосовується більш швидка пам'ять, і в результаті відеочипам доступна в рази більша пропускна здатність пам'яті, що також досить важливо для паралельних розрахунків, які оперують з величезними потоками даних.

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

Є безліч відмінностей і в підтримці багатопоточності. CPU виконує 1-2 потоки обчислень на одне процесорне ядро, а відеочипи можуть підтримувати до 1024 потоків на кожен мультипроцессор, яких у чипі кілька штук. І якщо перемикання з одного потоку на інший для CPU коштує сотні тактів, то GPU перемикає декілька потоків за один такт.

Крім того, центральні процесори використовують SIMD (одна інструкція виконується над численними даними) блоки для векторних обчислень, а відеочипи застосовують SIMT (одна інструкція та декілька потоків) для скалярної обробки потоків. SIMT не вимагає, щоб розробник перетворював дані у вектори, і допускає довільні розгалуження в потоках.

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

У підсумку, основою для ефективного використання потужності GPU в неграфічних розрахунках є розпаралелювання алгоритмів на сотні виконавчих блоків, наявних в відеочипах. Наприклад, безліч додатків по молекулярному моделювання відмінно пристосоване для розрахунків на відеочипах, вони вимагають великих обчислювальних потужностей і тому зручні для паралельних обчислень. А використання декількох GPU дає ще більше обчислювальних потужностей для вирішення подібних завдань.

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

У результаті всіх описаних вище відмінностей, теоретична продуктивність відеочипів значно перевершує продуктивність CPU.

Історія розвитку GPUРедагувати

Процитуємо Джека Донгарра, директора Інноваційної обчислювальної лабораторії Університету штату Теннесі: «GPU вже досягли тієї точки розвитку, коли багато додатків реального світу можуть з легкістю виконуватися на них, причому швидше, ніж на багатоядерних системах. Майбутні обчислювальні архітектури стануть гібридними системами з графічними процесорами, що складаються з паралельних ядер і працюючими у зв'язці з багатоядерними CPU». Але як GPU досягли цієї самої точки? Для відповіді на дане питання розглянемо історію розвитку пристроїв в області обробки графіки.

Наприкінці 1980-х виникнення графічних операційних систем сімейства Windows дає поштовх для появи процесорів нового типу. На початку 1990-х років знайшли популярність прискорювачі двовимірної графіки. Ці прискорювачі були спроектовані для операцій з растровими зображеннями, тим самим, роблячи роботу з графічною операційною системою більш комфортною. У ті минулі часи, коли відеоадаптери, спеціалізувалися в основному на прискоренні виведення 2D-графіки. У той час вважалося, що обробка тривимірних даних просто не доцільна. Відзначимо, що даної тенденції не дотрималася компанія Silicon Graphics, яка намагалася вивести тривимірну графіку на різні ринки, у тому числі програми для військових, уряду, ефекти в кіно, візуалізація наукових даних. Результатом її праць стало відкриття даною компанією програмного інтерфейсу до свого обладнання. У 1992 році компанія випустила бібліотеку OpenGL.

Великий стрибок у розвитку графічних прискорювачів стався в середині 90-х років у відповідь на зростаюче споживання обчислювальних ресурсів комп'ютерними іграми. Дані відеокарти були спеціалізованими процесорами для прискорення операцій з тривимірною графікою і призначалися для побудови двовимірних зображень тривимірних сцен в режимі реального часу. Для прискорення операцій використовувалися апаратна реалізація алгоритмів, в тому числі відсікання невидимих поверхонь за допомогою буфера глибини, і апаратне розпаралелювання. Прискорювачі брали на вхід опис тривимірної сцени у вигляді масивів вершин і трикутників, а також параметри спостерігача, і будували по них на екрані двовимірне зображення сцени для цього спостерігача. Підтримувалося відсікання невидимих граней, завдання кольору вершин і інтерполяційна зафарбування, а також текстури об'єктів і обчислення освітленості без урахування тіней. Тіні можна було додати за допомогою алгоритмів розрахунку тіней на прискорювач, таких як тіньові карти або тіньові обсяги. Через збільшення попиту на тривимірну графіку і взаємної конкуренції такі компанії NVIDIA, ATI Technologies, 3dfx Interactive, почали випускати доступні за ціною графічні прискорювачі. Даний факт закріпив за тривимірною графікою провідне місце на ринку перспективних технологій.

Сам термін GPU вперше був використаний в серпні 1999 року стосовно головного чипа відеокарти моделі nVidia GeForce 256, основна функція якого полягала в прискоренні виведення тривимірної графіки. Вперше обчислення геометричних перетворень і освітлення сцени стало можливо проводити на самому графічному процесорі. Подальший прорив належить також компанії NVIDIA, яка випустила серія GeForce 3 в 2001 році. У даній серії з'явилася мікросхема, в якій був реалізований всім відомий нині, а тоді ще новий стандарт Microsoft DirectX 8.0. Даний стандарт додав можливості програмування до GPU. Спочатку фіксований алгоритм обчислення освітленості і перетворення координат вершин був замінений на алгоритм, що задається користувачем. Потім з'явилася можливість писати програми для обчислення кольору пікселя на екрані. З цієї причини програми для GPU стали називати шейдерами, від англійського shade — зафарбовувати. Перші шейдери писалися на асемблері GPU, їх довжина не перевищувала 20 команд, не було підтримки команд переходів, а обчислення проводилися у форматі з фіксованою точкою. У міру зростання популярності використання шейдеров з'являлися високорівневі шейдерні мови, наприклад, Cg від NVidia і HLSL від Microsoft, збільшувалася максимальна довжина шейдера. У 2003 році на GPU вперше з'явилася підтримка обчислень з 32-розрядної точністю. Як основний інтерфейс програмування виділився Direct3D, що першим забезпечив підтримку шейдерів. Позначилися основні виробники дискретних графічних процесорів: компанії ATI і NVidia. З'явилися перші програми, що використовують GPU для високопродуктивних обчислень, почало складатися напрямок GPGPU. GPGPU (General-Purpose computing on Graphic Processing Units — використання графічних процесорів для вирішення довільних обчислювальних задач. Для програмування GPU запропоновано підхід потокового програмування. Цей підхід передбачає розбиття програми на відносно невеликі етапи (ядра), які обробляють елементи потоків даних. Ядра відображаються на шейдери, а потоки даних — на текстури в GPU.[3]

Подальший розвиток GPU характеризуються розширеними можливостями програмування. З'являються операції розгалуження і циклів, що дозволяє створювати більш складні шейдери. Підтримка 32-бітових обчислень з плаваючою точкою стає повсюдною, що сприяє активному росту напрямки GPGPU. OpenGL у версії 2.0 додає підтримку високорівневого шейдерного мови GLSL. Продуктивність GPU на реальних задачах досягає сотень гігафлопс. У більш пізніх представниках третього покоління з'являється підтримка цілочисельних операцій, а також операцій з подвійною точністю. З'являються спеціалізовані засоби, що дозволяє взаємодіяти з GPU прямо, минаючи рівень інтерфейсу програмування тривимірної графіки (CUDA NVIDIA, CTM ATI).

Застосування обчислень на GPUРедагувати

Необхідно відзначити, що за призначенням обчислення на GPU нічим не відрізняються від обчислень на CPU. Але в окремих областях обчислень на багато перевершують в продуктивності універсальні процесори. Нижче описані кілька областей успішного застосування обчислень на GPU.

Медицина: Компанія TechniScan впроваджує в практику перспективну методику тривимірного ультразвукового сканування. В системі ультразвукового сканування компанія TechniScan використовує GPU Tesla від компанії NVIDIA для покращення можливостей лікарів з прогнозування та діагностики раку молочної залози на ранніх стадіях, причому більш точно, ніж традиційні методи. Американський національний інститут з вивчення ракових захворювань повідомив про 12х прискоренні при використанні CUDA для обчислень зв'язування протеїнів, що використовуються для розробки нових ліків від таких хвороб як рак або хвороба Альцгеймера.[4]

Індустрія: Компанії, подібні OptiTex, використовують CUDA для розробки одягу для споживчого ринку. Автомобільні компанії створюють дизайн машин наступного покоління з допомогою трасування променів на GPU, використовуючи CUDA. Компанії виробники чистячих засобів та засобів гігієни застосовують GPGPU для моделювання молекул своїх продуктів. Так, промисловий гігант Procter Gamble спільно з університетом Темпл працюють над моделюванням взаємодії молекул поверхнево-активних речовин з брудом, водою та іншими матеріалами.

Мультимедіа: Завдання конвертації відео на портативні пристрої тепер набагато зручніше і швидше завдяки додатку Badaboom від компанії Elemental. Тести показують, що стандартний півторагодинний фільм на ньому із застосуванням технології CUDA конвертується в формат iPod / iPhone менш ніж за двадцять хвилин. І це при тому, що на CPU цей процес займає більше години. Технологія NVIDIA PhysX — симуляція фізичних законів для ігор і комп'ютерної анімації. Статистично було доведено, що, який би складний рендеринг не виконував GPU, частина його ядер все одно простоює. Саме на цих ядрах і працює рушій PhysX. Завдяки CUDA величезна частка обчислень, пов'язаних з фізикою ігрового світу, стала виконуватися на відеокарті. За оцінками експертів, приріст продуктивності ігрового процесу з PhysX, працюючому, на CUDA зріс мінімум на порядок. CUDA бере на себе рутинний розрахунок реалізації тертя, тяжіння і інших звичних нам речей для багатовимірних об'єктів. Сучасні ігри виглядають дуже реалістично. Завдяки розробникам текстур. Але чим більше реальності в текстурі, тим більше вона займає дорогоцінної пам'яті. Щоб цього уникнути, текстури попередньо стискають і динамічно розпаковують по мірі потреби. А стиск і розпаковування — це суцільні обчислення. Для роботи з текстурами NVIDIA випустила пакет NVIDIA Texture Tools. У NVIDIA Texture Tools 2 реалізована підтримка CUDA. За оцінкою NVIDIA, це дає 12-кратний приріст продуктивності в задачах стиснення та розпакування текстур. Допомагає CUDA і професійним меломанам. Будь-який з них півцарства віддасть за ефективний FIR-кросовер — набір фільтрів, що розділяють звуковий спектр на кілька смуг. Процес цей досить трудомісткий і при великому обсязі аудіоматеріалу змушує звукорежисера на кілька годин відійти від своїх обов'язків. Реалізація FIR-кросовера на базі CUDA прискорює його роботу в сотні разів.[5]

Наука: Проблема паралелізації алгоритму на безліч потоків з метою адаптації для GPU. Це адже сама по собі наукова задача, які алгоритми і методи можна успішно розпаралелити і провести на GPU. На цю тему було захищено безліч дисертацій та випущено безліч наукових досліджень. Використання паралельної архітектури NVIDIA GPU дозволяє отримувати чудові результати при роботі з додатками в сфері молекулярної динаміки. Адже віруси, збудники багатьох хвороб, є найменшими відомими живими організмами на планеті. У силу простоти будови і маленького розміру вірусів дослідники в галузі обчислювальної біології вибрали їх для своєї першої спроби створити повну модель форми життя за допомогою комп'ютера, вибравши для своїх експериментів один з найбільш крихітних вірусів — вірус тютюнової мозаїки. Вони використовували програму під назвою NAMD (Nanoscale Molecular Dynamics), розроблену Університетом Іллінойсу в Урбані-Шампейн, для моделювання вірусу у краплі солоної води. Робота NAMD була прискорена майже в 12 разів завдяки CUDA і в цілому показала приріст швидкості в 330 разів у порівнянні з одноядерним CPU при запуску на кластері з GPU-прискоренням в Національному центрі суперкомп'ютерних додатків (NCSA). У кількох проектах гідродинаміки, що використовують моделі Нав'є-Стокса і «метод решіток Больцмана», було відзначено значне прискорення завдяки GPU з підтримкою CUDA. Протягом багатьох років завдання проектування ефективних гвинтів і лопаток знаходилося в застої. Неймовірно складний рух повітря і рідини, що обтікають ці пристрої, неможливо досліджувати на простих моделях, а точні моделі виявляються занадто ресурсоємними з обчислювальної точки зору. Лише самі потужні суперкомп'ютери могли запропонувати ресурси, достатні для обрахунку чисельних моделей, необхідних для розробки та перевірки конструкції. Дослідники з Кембриджського університету отримали колосальну перевагу в продуктивності за рахунок використання CUDA. В результаті застосування дешевих GPU-кластерів принципово змінило підхід до проведення досліджень. Майже інтерактивне моделювання відкрило нові можливості для новаторських ідей в області, яка раніше страждала від застою. Також ведуться більш ефективні роботи з моделювання погодних явищ і океанічної поверхні планети з використанням GPU.

ПриміткиРедагувати

  1. B. Chapman, P. Mehrotra, H. Zima. Extending HPF for advanced data-parallel applications. IEEE Parallel and Distributed Technology, 1994.
  2. B.M. Maggs, L. R. Matheson, R. E. Tarjan, Models of parallel computation: a survey and synthesis. HICSS, 1995.
  3. D. Y. Cheng. A survey of parallel programming languages and tools. Moffett Field, 1993.
  4. Ian Foster. Designing and Building Parallel Programs. Addison-Wesley, 1995.
  5. Jonathan M. D. Hill. An introduction to the data-parallel paradigm. Department of Computer Science, 1994.