Комп'ютерний ресурс У SM. Куди веде cuda: практичне застосування технології gpgpu - найкраще обладнання Програми які працюють на cuda

Протягом десятиліть діяв закон Мура, який свідчить, що кожні два роки кількість транзисторів на кристалі подвоюватиметься. Однак це було в далекому 1965 році, а останні 5 років почала бурхливо розвиватися ідея фізичної багатоядерності в процесорах споживчого класу: в 2005 Intel представила Pentium D, а AMD - Athlon X2. Тоді додатків, які використовують 2 ядра, можна було перерахувати на пальцях однієї руки. Однак наступне покоління процесорів Intel, що здійснило революцію, мало саме 2 фізичні ядра. Більше того, у січні 2007 року з'явилася серія Quad, тоді ж сам Мур зізнався, що незабаром його закон перестане діяти.

Що ж зараз? Двоядерні процесори навіть у бюджетних офісних системах, а 4 фізичні ядра стало нормою і це всього за 2-3 роки. Частота процесорів не нарощується, а покращується архітектура, збільшується кількість фізичних та віртуальних ядер. Однак ідея використання відеоадаптерів, наділених десятками, а то й сотнями обчислювальних блоків, витала давно.

І хоча перспективи обчислень силами GPU величезні, найбільш популярне рішення - Nvidia CUDA безкоштовно, має безліч документацій і в цілому вельми нескладне в реалізації додатків, що використовують цю технологію не так багато. Здебільшого це всілякі спеціалізовані розрахунки, до яких пересічному користувачеві здебільшого немає діла. Але є й програми, розраховані на масового користувача, про них ми поговоримо в цій статті.

Спочатку трохи про саму технологію і з чим її їдять. Т.к. при написанні статті я орієнтуюсь на широке коло читачів, то й пояснити постараюся доступною мовою без складних термінів і трохи коротенько.

CUDA(Compute Unified Device Architecture) - програмно-апаратна архітектура, що дозволяє проводити обчислення з використанням графічних процесорів NVIDIA, що підтримують технологію GPGPU (довільних обчислень на відеокартах). Архітектура CUDA вперше з'явилися на ринку з виходом чіпа NVIDIA восьмого покоління - G80 і є у всіх наступних серіях графічних чіпів, які використовуються в сімействах прискорювачів GeForce, Quadro і Tesla. (С) Wikipedia.org

Вхідні потоки обробляються незалежно друг від друга, тобто. паралельно.

При цьому існує поділ на 3 рівні:

Grid- Ядро. Містить один/двох/тривимірний масив блоків.

Block- Містить у собі безліч потоків (thread). Потоки різних блоків між собою не можуть взаємодіяти. Навіщо потрібно було вводити блоки? Кожен блок по суті відповідає за своє завдання. Наприклад, велике зображення (яке є матрицею) можна розбити на кілька дрібніших частин (матриць) і паралельно працювати з кожною частиною зображення.

Thread- Потік. Потоки всередині одного блоку можуть взаємодіяти або через загальну (shared) пам'ять, яка, до речі, набагато швидше за глобальну (global) пам'ять, або через засоби синхронізації потоків.

Warp– це поєднання взаємодіючих між собою потоків, для всіх сучасних GPU розмір Warp'а дорівнює 32. Далі йде half-warp, Що є половинкою warp'a, т.к. звернення до пам'яті зазвичай йде окремо для першої та другої половини warp'a.

Як можна побачити, дана архітектура відмінно підходить для розпаралелювання завдань. І хоча програмування ведеться мовою Сі з деякими обмеженнями, насправді все так просто, т.к. не всі можна розпаралелити. Немає і стандартних функцій для генерації випадкових чисел (чи ініціалізації), усе це доводиться реалізовувати окремо. І хоча готових варіантів є достатньо, радості все це не приносить. Можливість використання рекурсії виникла порівняно недавно.

Для наочності було написано невелика консольна (для мінімізації коду) програма, яка здійснює операції із двома масивами типу float, тобто. з нецілочисельними значеннями. З зазначених вище причин ініціалізація (заповнення масиву різними довільними значеннями) здійснювалося силами CPU. Далі з відповідними елементами кожного масиву вироблялося 25 різноманітних операцій, проміжні результати записувалися в третій масив. Змінювався розмір масиву, результати такі:

Усього було проведено 4 тести:

1024 елементи у кожному масиві:

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

4096 елементів у кожному масиві:

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

Тепер 12288 елементів у кожному масиві:

Відрив відеокарти збільшився ще вдвічі. Знову ж таки варто звернути увагу, що час виконання на відеокарті збільшився.
незначно, тоді як на процесорі більш ніж 3 разу, тобто. пропорційно до ускладнення завдання.

І останній тест – 36864 елементи у кожному масиві:

У цьому випадку прискорення досягає значних значень - майже в 22 рази швидше на відеокарті. І знову ж таки час виконання на відеокарті зріс незначно, а на процесорі – покладені 3 рази, що знову ж таки пропорційно до ускладнення завдання.

Якщо і далі ускладнювати обчислення, то відеокарта виграє дедалі більше. Хоч і приклад дещо перебільшений, але загалом ситуацію показує наочно. Але як згадувалося вище, не все можна розпаралелити. Наприклад, обчислення числа Пі. Існують лише приклади, написані у вигляді методу Monte Carlo, але точність обчислень становить 7 знаків після коми, тобто. звичайний float. А, щоб збільшити точність обчислень необхідна довга арифметика, тоді як тут і настають проблеми, т.к. ефективно це реалізувати дуже складно. В інтернеті знайти прикладів, які використовують CUDA і розраховують число Пі до 1 мільйона знаків після коми мені не вдалося. Були спроби написати таку програму, але найпростіший і найефективніший метод розрахунку числа Пі – це алгоритм Брента - Саламіна чи формула Гаусса. У відомому SuperPI швидше за все (судячи зі швидкості роботи та кількості ітерацій) використовується формула Гауса. І, судячи з
тому, що SuperPI однопоточний, відсутність прикладів під CUDA і провал моїх спроб ефективно розпаралелити підрахунок Pi неможливо.

До речі, можна побачити, як у процесі виконання обчислень підвищується навантаження на GPU, і відбувається виділення пам'яті.

Тепер перейдемо до більш практичної користі від CUDA, а саме існуючі на даний момент програми, що використовують цю технологію. Здебільшого це всілякі аудіо/відео конвертери та редактори.

У тестуванні використовувалось 3 різних відеофайли:

      * Історія створення фільму Аватар - 1920x1080, MPEG4, h.264.
      *Серія "Lie to me" - 1280х720, MPEG4, h.264.
      *Серія "У Філадельфії завжди сонячно" - 624х464, xvid.

Контейнер і розмір перших двох файлів був .mkv та 1,55 гб, а останнього - .avi та 272 мб.

Почнемо з дуже гучного та популярного продукту – Badaboom. Використовувалася версія – 1.2.1.74 . Вартість програми складає $29.90 .

Інтерфейс програми простий і наочний – ліворуч вибираємо вихідний файл або диск, а праворуч – необхідний пристрій, для якого кодуватимемо. Є і режим користувача, в якому вручну задаються параметри, він і використовувався.

Для початку розглянемо наскільки швидко і якісно кодується відео «в собі», тобто. у той же дозвіл і приблизно той самий розмір. Швидкість вимірюватимемо у fps, а не в витраченому часі – так зручніше і порівнювати, і підраховувати скільки буде стискатись відео довільної тривалості. Т.к. сьогодні ми розглядаємо технологію «зелених», то й графіки будуть відповідні -)

Швидкість кодування залежить від якості, це очевидно. Варто зазначити, що легка роздільна здатність (назвемо його традиційно – SD) – не проблема для Badaboom – швидкість кодування в 5,5 разів перевищила вихідний (24 fps) фреймрейт відео. Та й навіть важкий 1080p відеоролик програма перетворює у реальному часі. Слід зазначити, що якість підсумкового відео вкрай близьке до вихідного відеоматеріалу, тобто. кодує Badaboom дуже і дуже якісно.

Але зазвичай переганяють відео в нижчу роздільну здатність, подивимося як справи в цьому режимі. При зниженні роздільної здатності знижувався і бітрейт відео. Він становив 9500 кбіт/с для 1080p вихідного файлу, 4100 кбіт/с для 720 p та 2400 кбіт/с для 720х404. Вибір зроблений виходячи з розумного співвідношення розмір/якість.

Коментарі зайві. Якщо робити з 720p ріп до звичайної якості SD, то на перекодування фільму тривалістю 2 години піде близько 30 хвилин. І при цьому завантаження процесора буде незначним, можна займатися своїми справами, не відчуваючи дискомфорту.

А якщо перегнати відео у формат для мобільного пристрою? Для цього виберемо профіль iPhone (бітрейт 1 мбіт/с, 480х320) та подивимося на швидкість кодування:

Чи треба щось говорити? Двогодинний фільм у звичайній якості для iPhone перекодується менш ніж за 15 хвилин. З HD якістю складніше, але все одно дуже швидко. Головне, що якість вихідного відео залишається на досить високому рівні при перегляді на дисплеї телефону.

Загалом враження від Badaboom позитивні, швидкість роботи радує, інтерфейс простий та зрозумілий. Різні баги ранніх версій (користувався ще бетою 2008-го року) виліковані. Крім одного – шлях до вихідного файлу, а також до папки, в яку зберігається готове відео, не повинен містити російських букв. Але на тлі переваг програми цей недолік незначний.

Наступним на черзі у нас буде Super LoiLoScope. За звичайну його версію просять 3280 рублів, А за touch версію, що підтримує сенсорне керування в Windows 7, просять аж 4440 рублів. Спробуємо розібратися, за що розробник хоче таких грошей і навіщо відеоредактору підтримка multitouch. Використовувалася остання версія – 1.8.3.3 .

Описати інтерфейс програми словами досить складно, тож я вирішив зняти невеликий відеоролик. Відразу скажу, що, як і всі відеоконвертери під CUDA, прискорення засобами GPU підтримується тільки для виведення відео MPEG4 з кодеком h.264.

Під час кодування завантаження процесора складає 100%, проте дискомфорту це викликає. Браузер та інші не важкі програми не гальмують.

Тепер перейдемо до продуктивності. Для початку все те саме, що і з Badaboom – перекодування відео в аналогічне за якістю.

Результати набагато кращі, ніж у Badaboom. Якість на висоті, різницю з оригіналом можна помітити лише порівнюючи попарно кадри під лупою.

Ого, а ось тут LoiloScope обходить Badaboom у 2,5 рази. При цьому можна запросто паралельно різати та кодувати інше відео, читати новини та навіть дивитися кіно, причому навіть FullHD програються без проблем, хоч завантаження процесора та максимальне.

Тепер спробуємо зробити відео для мобільного пристрою, профіль назвемо так само, як він називався в Badaboom - iPhone (480x320, 1 мбіт/с):

Жодної помилки немає. Все перевірявся ще раз кілька разів, щоразу результат був аналогічним. Швидше за все, це відбувається з тієї простої причини, що файл SD записаний з іншим кодеком і в іншому контейнері. Під час перекодування відео спочатку декодується, розбивається на матриці певного розміру, стискається. ASP декодер, що використовується у разі xvid, повільніше, ніж AVC (для h.264) при паралельному декодуванні. Однак і 192 fps - це у 8 разів швидше, ніж швидкість вихідного відео, серія тривалістю 23 хвилини стискається менш ніж за 4 хвилини. Ситуація повторювалася й іншими файлами, перетиснутими в xvid/DivX.

LoiloScopeзалишив про себе тільки приємні враження - інтерфейс, незважаючи на свою незвичність, зручний і функціональний, а швидкість роботи вище за всякі похвали. Дещо засмучує відносно бідний функціонал, але найчастіше при простому монтажі потрібно лише трохи підкоригувати кольори, зробити плавні переходи, накласти текст, а з цим LoiloScope чудово справляється. Дещо лякає і ціна – понад $100 за звичайну версію нормально для зарубіжжя, але нам такі цифри поки що здаються дещо дикими. Хоча, зізнаюся, що якби я, наприклад, часто знімав та монтував домашнє відео, то, можливо, і задумався над покупкою. Заодно, до речі, перевірив можливість редагування HD (а точніше AVCHD) контенту прямо з відеокамери без попереднього конвертування в інший формат, LoiloScope ніяких проблем з файлами типу.mts не виявлено.

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

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

Технологія GPGPU (General-Purpose Graphics Processing Units — графічний процесор загального призначення) тривалий час існувала лише в теоретичних викладках мозкових академіків. А як інакше? Запропонувати кардинально змінити обчислювальний процес, що склався за десятиліття, довіривши розрахунок його паралельних гілок відеокарті, — на це тільки теоретики і здатні.

Логотип технології CUDA нагадує про те, що вона виросла в надрах
3D графіки.

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

Завдяки CUDA технології GPGPU стали мейнстрімом. І нині тільки недалекоглядний і покритий товстим шаром лінощів розробник систем програмування не заявляє про підтримку своїм продуктом CUDA. IT-видання вважали за честь викласти подробиці технології у численних пухких науково-популярних статтях, а конкуренти терміново посідали за лекала та кроскомпілятори, щоб розробити щось подібне.

Публічне визнання — це мрія не тільки старлеток-початківців, а й технологій, що знову зародилися. І CUDA пощастило. Вона на слуху, про неї говорять та пишуть.

Ось тільки пишуть так, ніби продовжують обговорювати GPGPU у товстих наукових журналах. Закидають читача купою термінів типу "grid", "SIMD", "warp", "хост", "текстурна та константна пам'ять". Занурюють його по саму маківку в схеми організації графічних процесорів nVidia, ведуть звивистими стежками паралельних алгоритмів і (найсильніший хід) показують довгі лістинги коду мовою Сі. В результаті виходить, що на вході статті ми маємо свіжого і палючого бажанням зрозуміти CUDA читача, а на виході - того ж читача, але з головою, що розпухла, заповненою кашею з фактів, схем, коду, алгоритмів і термінів.

А тим часом мета будь-якої технології зробити наше життя простіше. І CUDA чудово з цим справляється. Результати її роботи — саме це переконає будь-якого скептика краще за сотню схем та алгоритмів.

Далеко не скрізь

CUDA підтримується високопродуктивними суперкомп'ютерами
nVidia Tesla.

І все ж таки перш, ніж поглянути на результати праць CUDA на терені полегшення життя пересічного користувача, варто усвідомити всі її обмеження. Точно як із джинном: будь-яке бажання, але одне. У CUDA теж є свої ахіллесові п'яти. Одна з них – обмеження платформ, на яких вона може працювати.

Перелік відеокарт виробництва nVidia, що підтримують CUDA, представлений у спеціальному списку, що називається CUDA Enabled Products. Список дуже значний, але легко класифікується. У підтримці CUDA не відмовляють:

    Моделі nVidia GeForce 8-й, 9-й, 100-й, 200-й та 400-й серій з мінімумом 256 мегабайт відеопам'яті на борту. Підтримка поширюється як на карти для настільних систем, так і на мобільні рішення.

    Переважна більшість настільних та мобільних відеокарт nVidia Quadro.

    Всі рішення нетбучного ряду nvidia ION.

    Високопродуктивні HPC (High Performance Computing) і суперкомп'ютерні рішення nVidia Tesla, що використовуються як для персональних обчислень, так і для організації кластерних систем, що масштабуються.

Тому, перш ніж використовувати програмні продукти на базі CUDA, варто звіритися з цим переліком обраних.

Крім самої відеокарти для підтримки CUDA потрібен відповідний драйвер. Саме він є сполучною ланкою між центральним та графічним процесором, виконуючи роль своєрідного програмного інтерфейсу для доступу коду та даних програми до багатоядерної скарбниці GPU. Щоб напевно не помилитися, nVidia рекомендує відвідати сторінку драйверів та отримати найсвіжішу версію.

...але сам процес

Як працює CUDA? Як пояснити складний процес паралельних обчислень на особливій апаратній архітектурі GPU так, щоб не занурити читача в безодню специфічних термінів?

Можна спробувати це зробити, уявивши, як центральний процесор виконує програму в симбіозі з графічним процесором.

Архітектурно центральний процесор (CPU) та його графічний зібрат (GPU) влаштовані по-різному. Якщо проводити аналогію зі світом автопрому, то CPU — універсал, із тих, що називають «сарай». Виглядає легковим авто, але при цьому (з погляду розробників) «і швець, і жнець, і на дуді гравець». Виконує роль маленької вантажівки, автобуса та гіпертрофованого хечбека одночасно. Універсал, коротше. Циліндр-ядер у нього небагато, але вони «тягнуть» практично будь-які завдання, а велика кеш-пам'ять здатна розмістити купу даних.

А ось GPU – це спорткар. Функція одна: доставити пілота на фініш якнайшвидше. Тому ніякої великої пам'яті-багажника, жодних зайвих місць. Натомість циліндрів-ядер у сотні разів більше, ніж у CPU.

Завдяки CUDA розробникам програм GPGPU не потрібно вникати у складності програми.
рування під такі графічні движки, як DirectX і OpenGL

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

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

Технологічно для програміста нічого не змінюється. Код CUDA-програм пишеться мовою Сі. Точніше, на особливому діалекті «З with streams» (Сі з потоками). Розроблене в Стенфорді, це розширення мови Сі отримало назву Brook. Як інтерфейс, що передає Brook-код на GPU, виступає драйвер відеокарти, що підтримує CUDA. Він організує весь процес обробки цієї ділянки програми так, що для програміста GPU виглядає як співпроцесор CPU. Дуже схоже використання математичного співпроцесора на зорі персональних комп'ютерів. З появою Brook, відеокарт із підтримкою CUDA та драйверів для них будь-який програміст став здатний у своїх програмах звертатися до GPU. Адже раніше цим шаманством володів вузьке коло обраних, які роками відточують техніку програмування під графічні двигуни DirectX або OpenGL.

У бочку цього пафосного меду - дифірамбів CUDA - варто покласти ложку дьогтю, тобто обмежень. Не будь-яке завдання, яке потрібно запрограмувати, підходить для вирішення за допомогою CUDA. Домогтися прискорення вирішення рутинних офісних завдань не вдасться, а ось довірити CUDA обрахунок поведінки тисячі однотипних бійців у World of Warcraft – будь ласка. Але це завдання, висмоктане з пальця. Розглянемо приклади того, що CUDA вже дуже ефективно вирішує.

Праці праведні

CUDA – дуже прагматична технологія. Реалізувавши її підтримку у своїх відеокартах, компанія nVidia дуже справедливо розраховувала на те, що прапор CUDA буде підхоплений безліччю ентузіастів як в університетському середовищі, так і в комерції. Так і сталося. Проекти на базі CUDA живуть та приносять користь.

NVIDIA PhysX

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

Одна з можливостей фізичного двигуна NVIDIA PhysX – реалістична робота з тканинами.

Реалізувати алгоритми комп'ютерної симуляції базових фізичних законів – справа дуже трудомістка. Найбільш відомими компаніями на цій ниві є ірландська компанія Havok з її міжплатформним фізичним Havok Physics і каліфорнійська Ageia - прабатько першого у світі фізичного процесора (PPU - Physics Processing Unit) та відповідного фізичного движка PhysX. Перша з них, хоч і придбана компанією Intel, активно працює зараз на терені оптимізації двигуна Havok для відеокарт ATI і процесорів AMD. А ось Ageia з її двигуном PhysX стала частиною nVidia. При цьому nVidia вирішила складне завдання адаптації PhysX під технологію CUDA.

Можливе це стало завдяки статистиці. Статистично було доведено, що який би складний рендеринг не виконував GPU, частина його ядер все одно простоює. Саме на цих ядрах і працює двигун PhysX.

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

CUDA-версія пакету стиснення текстур NVIDIA Texture Tools 2

Подобаються реалістичні об'єкти у сучасних іграх? Дякуємо розробникам текстур. Але що більше реальності у текстурі, то більше вписувалося її обсяг. Тим більше вона займає дорогоцінну пам'ять. Щоб цього уникнути, текстури попередньо стискають і динамічно розпаковують у міру потреби. А стиск та розпакування — це суцільні обчислення. Для роботи із текстурами nVidia випустила пакет NVIDIA Texture Tools. Він підтримує ефективне стискування та розпакування текстур стандарту DirectX (так званий ВЧЕ-формат). Друга версія цього пакета може похвалитися підтримкою алгоритмів стиснення BC4 і BC5, реалізованих у технології DirectX 11. Але головне те, що NVIDIA Texture Tools 2 реалізована підтримка CUDA. За оцінкою nVidia, це дає 12-кратний приріст продуктивності у завданнях стиснення та розпакування текстур. А це означає, що фрейми ігрового процесу вантажитимуться швидше і радуватимуть гравця своєю реалістичністю.

Пакет NVIDIA Texture Tools 2 заточено під роботу з CUDA. Приріст продуктивності при стисканні та розпакуванні текстур очевидна.

Використання CUDA дозволяє суттєво підвищити ефективність відеостеження.

Обробка відеопотоку в реальному часі

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

Повноводні річки відеоінформації стікаються до центрів її обробки і... натрапляють на вузьку ланку — людину. Саме він у більшості випадків остання інстанція, яка стежить за відеосвітом. Причому інстанція не найефективніша. Моргає, відволікається і намагається заснути.

Завдяки CUDA з'явилася можливість реалізації алгоритмів одночасного стеження безлічі об'єктів у відеопотоці. При цьому процес відбувається у реальному масштабі часу, а відео є повноцінним 30 fps. Порівняно з реалізацією такого алгоритму на сучасних багатоядерних CPU CUDA дає дво-, триразовий приріст продуктивності, а це, погодьтеся, чимало.

Конвертування відео, фільтрація аудіо

Відеоконвертер Badaboom - перша ластівка, що використовує CUDA для прискорення конвертування.

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

А ось CUDA з ним справляється на ура. Перша ластівка – конвертер Badaboom від компанії Elevental. Розробники Badaboom, обравши CUDA, не прорахувалися. Тести показують, що стандартний півторагодинний фільм на ньому конвертується у формат iPhone/iPod Touch менш як за двадцять хвилин. І це при тому, що при використанні CPU лише цей процес займає більше години.

Допомагає CUDA та професійним меломанам. Будь-який з них півцарства віддасть за ефективний FIR-кросовер - набір фільтрів, які розділяють звуковий спектр на кілька смуг. Процес цей дуже трудомісткий і за великого обсягу аудіоматеріалу змушує звукорежисера сходити на кілька годин «покурити». Реалізація FIR-кросоверу на базі CUDA прискорює його роботу в сотні разів.

CUDA Future

Зробивши технологію GPGPU реальністю, CUDA не має наміру спочивати на лаврах. Як це відбувається повсюдно, у CUDA працює принцип рефлексії: тепер не тільки архітектура відеопроцесорів nVidia впливає на розвиток версій CUDA SDK, а й сама технологія CUDA змушує nVidia переглядати архітектуру своїх чіпів. Приклад такої рефлексії – платформа nVidia ION. Її другу версію спеціально оптимізовано для вирішення CUDA-завдань. А це означає, що навіть у відносно недорогих апаратних рішеннях споживачі отримають усю міць та блискучі можливості CUDA.

І призначений для трансляції host-коду (головного, керуючого коду) і device-коду (апаратного коду) (файлів з розширенням.cu) в об'єктні файли, придатні в процесі складання кінцевої програми або бібліотеки в будь-якому середовищі програмування, наприклад NetBeans.

В архітектурі CUDA використовується модель пам'яті грід, кластерне моделювання потоків та SIMD-інструкції. Застосовується не тільки високопродуктивних графічних обчислень, але й різних наукових обчислень з використанням відеокарт nVidia. Вчені та дослідники широко використовують CUDA у різних галузях, включаючи астрофізику, обчислювальну біологію та хімію, моделювання динаміки рідин, електромагнітних взаємодій, комп'ютерну томографію, сейсмічний аналіз та багато іншого. У CUDA є можливість підключення до програм, що використовують OpenGL і Direct3D. CUDA - кросплатформне програмне забезпечення для таких операційних систем як Linux, Mac OS X та Windows.

22 березня 2010 nVidia випустила CUDA Toolkit 3.0, який містив підтримку OpenCL.

Устаткування

Платформа CUDA Вперше з'явилися на ринку з виходом чіпа NVIDIA восьмого покоління G80 і стала присутня у всіх наступних серіях графічних чіпів, які використовуються в сімействах прискорювачів GeForce, Quadro та NVidia Tesla.

Перша серія обладнання, що підтримує CUDA SDK, G8x, мала 32-бітний векторний процесор одинарної точності, що використовує CUDA SDK як API (CUDA підтримує тип double мови Сі, проте зараз його точність знижена до 32-бітного з плаваючою комою). Пізніші процесори GT200 мають підтримку 64-бітної точності (тільки для SFU), але продуктивність значно гірша, ніж для 32-бітної точності (через те, що SFU всього два на кожен потоковий мультипроцесор, а скалярних процесорів - вісім). Графічний процесор організує апаратну багатопоточність, що дозволяє використовувати всі ресурси графічного процесора. Таким чином, відкривається перспектива перекласти функції фізичного прискорювача на графічний прискорювач (приклад реалізації – nVidia PhysX). Також відкриваються широкі можливості використання графічного устаткування комп'ютера до виконання складних неграфічних обчислень: наприклад, в обчислювальної біології та інших галузях науки.

Переваги

У порівнянні з традиційним підходом до організації обчислень загального призначення за допомогою можливостей графічних API, архітектура CUDA має такі переваги в цій галузі:

Обмеження

  • Усі функції, що виконуються на пристрої, не підтримують рекурсії (у версії CUDA Toolkit 3.1 підтримує покажчики та рекурсію) та мають деякі інші обмеження

Підтримувані GPU та графічні прискорювачі

Перелік пристроїв від виробника обладнання Nvidia із заявленою повною підтримкою технології CUDA наведено на офіційному сайті Nvidia: CUDA-Enabled GPU Products (англ.).

Фактично ж, в даний час на ринку апаратних засобів для ПК підтримку технології CUDA забезпечують наступні периферійні пристрої:

Версія специфікації GPU Відеокарти
1.0 G80, G92, G92b, G94, G94b GeForce 8800GTX/Ultra, 9400GT, 9600GT, 9800GT, Tesla C/D/S870, FX4/5600, 360M, GT 420
1.1 G86, G84, G98, G96, G96b, G94, G94b, G92, G92b GeForce 8400GS/GT, 8600GT/GTS, 8800GT/GTS, 9600 GSO, 9800GTX/GX2, GTS 250, GT 120/30/40, FX 4/570, 3/580, 17/18/32 /370M, 3/5/770M, 16/17/27/28/36/37/3800M, NVS420/50
1.2 GT218, GT216, GT215 GeForce 210, GT 220/40, FX380 LP, 1800M, 370/380M, NVS 2/3100M
1.3 GT200, GT200b GeForce GTX 260, GTX 275, GTX 280, GTX 285, GTX 295, Tesla C/M1060, S1070, Quadro CX, FX 3/4/5800
2.0 GF100, GF110 GeForce (GF100) GTX 465, GTX 470, GTX 480, Tesla C2050, C2070, S/M2050/70, Quadro Plex 7000, Quadro 4000, 5000, 6000, GeForce (GF110) 590
2.1 GF104, GF114, GF116, GF108, GF106 GeForce 610M, GT 430, GT 440, GTS 450, GTX 460, GTX 550 Ti, GTX 560, GTX 560 Ti, 500M, Quadro 600, 2000
3.0 GK104, GK106, GK107 GeForce GTX 690, GTX 680, GTX 670, GTX 660 Ti, GTX 660, GTX 650 Ti, GTX 650, GT 640, GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 670MX, GTX 660M, GeForce GT 650M, GeForce GT 645M, GeForce GT 640M
3.5 GK110
Nvidia GeForce для настільних комп'ютерів
GeForce GTX 590
GeForce GTX 580
GeForce GTX 570
GeForce GTX 560 Ti
GeForce GTX 560
GeForce GTX 550 Ti
GeForce GTX 520
GeForce GTX 480
GeForce GTX 470
GeForce GTX 465
GeForce GTX 460
GeForce GTS 450
GeForce GTX 295
GeForce GTX 285
GeForce GTX 280
GeForce GTX 275
GeForce GTX 260
GeForce GTS 250
GeForce GT 240
GeForce GT 220
GeForce 210
GeForce GTS 150
GeForce GT 130
GeForce GT 120
GeForce G100
GeForce 9800 GX2
GeForce 9800 GTX+
GeForce 9800 GTX
GeForce 9800 GT
GeForce 9600 GSO
GeForce 9600 GT
GeForce 9500 GT
GeForce 9400 GT
GeForce 9400 mGPU
GeForce 9300 mGPU
GeForce 8800 GTS 512
GeForce 8800 GT
GeForce 8600 GTS
GeForce 8600 GT
GeForce 8500 GT
GeForce 8400 GS
Nvidia GeForce для мобільних комп'ютерів
GeForce GTX 580M
GeForce GTX 570M
GeForce GTX 560M
GeForce GT 555M
GeForce GT 540M
GeForce GT 525M
GeForce GT 520M
GeForce GTX 485M
GeForce GTX 480M
GeForce GTX 470M
GeForce GTX 460M
GeForce GT 445M
GeForce GT 435M
GeForce GT 425M
GeForce GT 420M
GeForce GT 415M
GeForce GTX 285M
GeForce GTX 280M
GeForce GTX 260M
GeForce GTS 360M
GeForce GTS 350M
GeForce GTS 160M
GeForce GTS 150M
GeForce GT 335M
GeForce GT 330M
GeForce GT 325M
GeForce GT 240M
GeForce GT 130M
GeForce G210M
GeForce G110M
GeForce G105M
GeForce 310M
GeForce 305M
GeForce 9800M GTX
GeForce 9800M GT
GeForce 9800M GTS
GeForce 9700M GTS
GeForce 9700M GT
GeForce 9650M GS
GeForce 9600M GT
GeForce 9600M GS
GeForce 9500M GS
GeForce 9500M G
GeForce 9300M GS
GeForce 9300M G
GeForce 9200M GS
GeForce 9100M G
GeForce 8800M GTS
GeForce 8700M GT
GeForce 8600M GT
GeForce 8600M GS
GeForce 8400M GT
GeForce 8400M GS
Nvidia Tesla *
Tesla C2050/C2070
Tesla M2050/M2070/M2090
Tesla S2050
Tesla S1070
Tesla M1060
Tesla C1060
Tesla C870
Tesla D870
Tesla S870
Nvidia Quadro для настільних комп'ютерів
Quadro 6000
Quadro 5000
Quadro 4000
Quadro 2000
Quadro 600
Quadro FX 5800
Quadro FX 5600
Quadro FX 4800
Quadro FX 4700 X2
Quadro FX 4600
Quadro FX 3700
Quadro FX 1700
Quadro FX 570
Quadro FX 470
Quadro FX 380 Low Profile
Quadro FX 370
Quadro FX 370 Low Profile
Quadro CX
Quadro NVS 450
Quadro NVS 420
Quadro NVS 290
Quadro Plex 2100 D4
Quadro Plex 2200 D2
Quadro Plex 2100 S4
Quadro Plex 1000 Model IV
Nvidia Quadro для мобільних комп'ютерів
Quadro 5010M
Quadro 5000M
Quadro 4000M
Quadro 3000M
Quadro 2000M
Quadro 1000M
Quadro FX 3800M
Quadro FX 3700M
Quadro FX 3600M
Quadro FX 2800M
Quadro FX 2700M
Quadro FX 1800M
Quadro FX 1700M
Quadro FX 1600M
Quadro FX 880M
Quadro FX 770M
Quadro FX 570M
Quadro FX 380M
Quadro FX 370M
Quadro FX 360M
Quadro NVS 5100M
Quadro NVS 4200M
Quadro NVS 3100M
Quadro NVS 2100M
Quadro NVS 320M
Quadro NVS 160M
Quadro NVS 150M
Quadro NVS 140M
Quadro NVS 135M
Quadro NVS 130M
  • Моделі Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 дозволяють проводити обчислення на GPU з подвійною точністю.

Особливості та специфікації різних версій

Feature support (unlisted features are
supported for all compute capabilities)
Compute capability (version)
1.0 1.1 1.2 1.3 2.x

32-bit words in global memory
Ні Так

floating point values ​​in global memory
Integer atomic функцій operating on
32-bit words in shared memory
Ні Так
atomicExch() operating on 32-bit
floating point values ​​in shared memory
Integer atomic функцій operating on
64-bit words in global memory
Warp vote functions
Double-precision floating-point operations Ні Так
Atomic functions operating on 64-bit
integer values ​​in shared memory
Ні Так
Floating-point atomic addition operating на
32-bit words in global and shared memory
_ballot()
_threadfence_system()
_syncthreads_count(),
_syncthreads_and(),
_syncthreads_or()
Surface функцій
3D grid of thread block
Technical specifications Compute capability (version)
1.0 1.1 1.2 1.3 2.x
Maximum dimensionality of grid of thread blocks 2 3
Maximum x-, y-, або z-dimension of grid of thread blocks 65535
Maximum dimensionality of thread block 3
Maximum x- або y-dimension of a block 512 1024
Maximum z-dimension of a block 64
Maximum number of threads per block 512 1024
Warp size 32
Maximum number of resident blocks per multiprocessor 8
Maximum number of resident warps multiprocessor 24 32 48
Maximum number of resident threads per multiprocessor 768 1024 1536
Номер 32-бітних регістрів для multiprocessor 8 K 16 K 32 K
Maximum amount of shared memory per multiprocessor 16 KB 48 KB
Number of shared memory banks 16 32
Amount of local memory per thread 16 KB 512 KB
Constant memory size 64 KB
Cache working set per multiprocessor for constant memory 8 KB
Cache working set per multiprocessor for texture memory Device dependent, між 6 KB та 8 KB
Maximum width for 1D texture
8192 32768
Maximum width for 1D texture
reference bound to linear memory
2 27
Maximum width and number of layers
for a 1D layered texture reference
8192 x 512 16384 x 2048
Maximum width and height for 2D
texture reference bound to
linear memory or a CUDA array
65536 x 32768 65536 x 65535
Maximum width, height, and number
of layers for a 2D layered texture reference
8192 x 8192 x 512 16384 x 16384 x 2048
Maximum width, height and depth
для 3D texture reference bound to linear
memory or a CUDA array
2048 x 2048 x 2048
Maximum number of textures that
can be bound to a kernel
128
Maximum width for 1D surface
reference bound to a CUDA array
Not
supported
8192
Maximum width and height for a 2D
surface reference bound to a CUDA array
8192 x 8192
Maximum number of surfaces that
can be bound to a kernel
8
Maximum number of instructions per
kernel
2 мільйон

приклад

CudaArray* cu_array; texture< float , 2 >tex; // Allocate array cudaMalloc( & cu_array, cudaCreateChannelDesc< float>(), width, height); // Copy image data to array cudaMemcpy( cu_array, image, width* height, cudaMemcpyHostToDevice) ; // Bind the array to the texture cudaBindTexture( tex, cu_array) ; // Run kernel dim3 blockDim (16, 16, 1); dim3 gridDim (width / blockDim.x, height / blockDim.y, 1); kernel<<< gridDim, blockDim, 0 >>> (d_odata, width, height); cudaUnbindTexture(tex) ; __global__ void kernel(float * odata, int height, int width) ( unsigned int x = blockIdx.x * blockDim.x + threadIdx.x ; unsigned int y = blockIdx.y * blockDim.y + threadIdx.y ; float texfetch(tex, x, y);odata[y* width+ x] = c;

Import pycuda.driver як drv import numpy drv.init () dev = drv.Device (0 ) ctx = dev.make_context () mod = drv.SourceModule ( """ __global__ void multiply_them(float *dest, float *a, float *b) ( const int i = threadIdx.x; dest[i] = a[i] * b[i]; ) """) multiply_them = mod.get_function ("multiply_them" ) a = numpy.random .randn (400 ) .astype (numpy.float32 ) b = numpy.random .randn (400 ) .astype (numpy.float32 (a) multiply_them( drv.Out (dest) , drv.In (a) , drv.In (b) , block= (400 , 1 , 1 ) ) print dest-a*b

CUDA як предмет у вузах

Станом на грудень 2009 року програмна модель CUDA викладається в 269 університетах по всьому світу. У Росії навчальні курси з CUDA читаються в Санкт-Петербурзькому політехнічному університеті, Ярославському державному університеті ім. П.Г. ім. Баумана, РХТУ ім. Менделєєва, Міжрегіональному суперкомп'ютерному центрі РАН, . Крім того, у грудні 2009 року було оголошено про початок роботи першого в Росії науково-освітнього центру «Паралельні обчислення», розташованого в місті Дубна, до завдань якого входять навчання та консультації щодо вирішення складних обчислювальних завдань на GPU.

В Україні курси з CUDA читаються у Київському інституті системного аналізу.

Посилання

Офіційні ресурси

  • CUDA Zone (рус.) - офіційний сайт CUDA
  • CUDA GPU Computing (англ.) – офіційні веб-форуми, присвячені обчисленням CUDA

Неофіційні ресурси

Tom's Hardware
  • Дмитро Чеканов. nVidia CUDA: обчислення на відеокарті чи смерть CPU? . Tom's Hardware (22 червня 2008 р.).
  • Дмитро Чеканов. nVidia CUDA: тести програм на GPU для масового ринку . Tom's Hardware (19 травня 2009 р.). Архівовано з першоджерела 4 березня 2012 року. Перевірено 19 травня 2009 року.
iXBT.com
  • Олексій Берілло. NVIDIA CUDA – неграфічні обчислення на графічних процесорах. Частина 1 . iXBT.com (23 вересня 2008 р.). Архівовано з першоджерела 4 березня 2012 року. Перевірено 20 січня 2009 року.
  • Олексій Берілло. NVIDIA CUDA – неграфічні обчислення на графічних процесорах. Частина 2 . iXBT.com (22 жовтня 2008 р.). - приклади впровадження NVIDIA CUDA. Архівовано з першоджерела 4 березня 2012 року. Перевірено 20 січня 2009 року.
Інші ресурси
  • Боресков Олексій Вікторович.Основи CUDA (20 січня 2009 р.). Архівовано з першоджерела 4 березня 2012 року. Перевірено 20 січня 2009 року.
  • Володимир Фролов.Введення в технологію CUDA. Мережевий журнал «Комп'ютерна графіка та мультимедіа» (19 грудня 2008 р.). Архівовано з першоджерела 4 березня 2012 року. Перевірено 28 жовтня 2009 року.
  • Ігор Осколков. NVIDIA CUDA – доступний квиток у світ великих обчислень. Комп'ютера (30 квітня 2009 р.). Перевірено 3 травня 2009 року.
  • Володимир Фролов.Введення у технологію CUDA (1 серпня 2009 р.). Архівовано з першоджерела 4 березня 2012 року. Перевірено 3 квітня 2010 року.
  • GPGPU.ru. Використання відеокарт для обчислень
  • . Центр Паралельних Обчислень

Примітки

Див. також

У розвитку сучасних процесорів намічається тенденція до поступового збільшення кількості ядер, що підвищує їх можливості у паралельних обчисленнях. Однак вже давно є GPU, що значно перевершують центральні процесори в цьому відношенні. І ці можливості графічних процесорів вже взято на замітку деякими компаніями. Перші спроби використовувати графічні прискорювачі для нецільових обчислень були з кінця 90-х. Але тільки поява шейдерів стала поштовхом до розвитку абсолютно нової технології, і в 2003 з'явилося поняття GPGPU (General-purpose graphics processing units). Важливу роль у розвитку цієї ініціативи відіграв BrookGPU, який є спеціальним розширенням для мови C. До появи BrookGPU програмісти могли працювати з GPU лише через API Direct3D чи OpenGL. Brook дозволив розробникам працювати зі звичним середовищем, а сам компілятор за допомогою спеціальних бібліотек реалізував взаємодію з GPU на низькому рівні.

Такий прогрес не міг не привернути увагу лідерів даної індустрії - AMD та NVIDIA, які зайнялися розробкою власних програмних платформ для неграфічних обчислень на відеокартах. Ніхто краще за розробників GPU не знає досконало всі нюанси та особливості своїх продуктів, що дозволяє цим же компаніям максимально ефективно оптимізувати програмний комплекс для конкретних апаратних рішень. Зараз NVIDIA розвиває платформу CUDA (Compute Unified Device Architecture), у AMD подібна технологія називається CTM (Close To Metal) або AMD Stream Computing. Ми розглянемо деякі можливості CUDA та на практиці оцінимо обчислювальні можливості графічного чіпа G92 відеокарти GeForce 8800 GT.

Але насамперед розглянемо деякі нюанси виконання розрахунків за допомогою графічних процесорів. Основна перевага їх у тому, що графічний чіп спочатку проектується під виконання безлічі потоків, а кожне ядро ​​звичайного CPU виконує потік послідовних інструкцій. Будь-який сучасний GPU є мультипроцесором, що складається з кількох обчислювальних кластерів, з безліччю ALU у кожному. Найпотужніший сучасний чіп GT200 складається з 10 таких кластерів, на кожен з яких припадає 24 потокові процесори. У тестованої відеокарти GeForce 8800 GT на базі чіпа G92 сім великих обчислювальних блоків по 16 потокових процесорів. CPU використовують SIMD блоки SSE для векторних обчислень (single instruction multiple data – одна інструкція виконується над численними даними), що потребує трансформації даних у 4х вектори. GPU скалярно обробляє потоки, тобто. одна інструкція застосовується над кількома потоками (SIMT – single instruction multiple threads). Це позбавляє розробників перетворення даних у вектори, і допускає довільні розгалуження в потоках. Кожен обчислювальний блок має прямий доступ до пам'яті. Та й пропускна здатність відеопам'яті вища, завдяки використанню кількох роздільних контролерів пам'яті (на топовому G200 це 8 каналів по 64-біт) та високих робочих частот.

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


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

Але як би там не було, є величезний потенціал графічних процесорів, які можна використовувати, і які потребують специфічного підходу до розробки програмних продуктів. Все це реалізовано в апаратно-програмному середовищі CUDA, яке складається з кількох програмних рівнів – високорівневий CUDA Runtime API та низькорівневий CUDA Driver API.


CUDA використовує для програмування стандартну мову C, що є однією з її основних переваг для розробників. Спочатку CUDA включає бібліотеки BLAS (базовий пакет програм лінійної алгебри) та FFT (розрахунок перетворень Фур'є). Також CUDA має можливість взаємодії з графічними API OpenGL або DirectX, можливість розробки на низькому рівні, що характеризується оптимізованим розподілом потоків даних між CPU та GPU. Обчислення CUDA виконуються одночасно з графічними на відміну від аналогічної платформи AMD, де для розрахунків на GPU взагалі запускається спеціальна віртуальна машина. Але таке «співжиття» загрожує і виникненням помилок у разі створення великого навантаження графічним API при одночасної роботі CUDA - адже графічні операції мають все ж таки більш високий пріоритет. Платформа сумісна з 32- та 64-бітними операційними системами Windows XP, Windows Vista, MacOS X та різними версіями Linux. Платформа відкрита і на сайті, окрім спеціальних драйверів для відеокарти, можна завантажити програмні пакети CUDA Toolkit, CUDA Developer SDK, які включають компілятор, налагоджувач, стандартні бібліотеки та документацію.

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

Як практичні випробування нової технології на відеокарті MSI NX8800GT-T2D256E-OC ми скористаємося програмою TMPGEnc. Цей продукт є комерційним (повна версія коштує $100), але до відеокарт MSI він поставляється як бонус у trial-версії терміном на 30 днів. Завантажити цю версію можна і з сайту розробника, але для встановлення TMPGEnc 4.0 XPress MSI Special Edition необхідний оригінальний диск з драйверами від картки MSI – без нього програма не встановлюється.

Для відображення максимально повної інформації про обчислювальні можливості в CUDA та порівняння з іншими відеоадаптерами можна використовувати спеціальну утиліту CUDA-Z. Ось яку інформацію вона видає про нашу відеокарту GeForce 8800GT:




Щодо референсних моделей наш екземпляр працює на більш високих частотах: растровий домен на 63 МГц вище від номіналу, а шейдерні блоки швидше на 174 МГц, пам'ять - на 100 МГц.

Ми порівняємо швидкість конвертації одного і того ж HD-відео при розрахунках тільки за допомогою CPU і додаткової активації CUDA у програмі TMPGEnc на наступній конфігурації:

  • Процесор: Pentium Dual-Core E5200 2,5 ГГц;
  • Материнська плата: Gigabyte P35-S3;
  • Пам'ять: 2х1GB GoodRam PC6400 (5-5-5-18-2T)
  • Відеокарта: MSI NX8800GT-T2D256E-OC;
  • Жорсткий диск: 320GB WD3200AAKS;
  • Блок живлення: CoolerMaster eXtreme Power 500-PCAP;
  • Операційна система: Windows XP SP2;
  • TMPGEnc 4.0 XPress 4.6.3.268;
  • Драйвери відеокарти: ForceWare 180.60.
Для тестів процесор розганявся до 3 ГГц (у конфігурації 11,5×261 МГц) та до 4 ГГц (11,5×348 МГц) при частоті оперативної пам'яті 835 МГц у першому та другому випадку. Відеоролик з роздільною здатністю Full HD 1920х1080 тривалістю одну хвилину двадцять секунд. Для створення додаткового навантаження включався фільтр шумоподавлення, налаштування якого залишено за замовчуванням.


Кодування здійснювалось за допомогою кодеку DivX 6.8.4. У налаштуваннях якості цього кодека всі значення залишені за замовчуванням, multithreading включений.


Підтримка багатопоточності TMPGEnc спочатку включена у вкладці налаштувань CPU/GPU. У цьому розділі активується і CUDA.


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

За підсумками проведених тестів отримано такі дані:


При частоті процесора 4 ГГц з активацією CUDA ми виграли всього кілька секунд (або 2%), що не дуже вражає. А ось на нижчій частоті приріст від активації даної технології дозволяє заощадити вже близько 13% часу, що буде відчутно при обробці великих файлів. Але все одно результати не такі вражаючі, як очікувалося.

У програмі TMPGEnc є індикатор завантаження CPU і CUDA, у цій тестовій конфігурації він показував завантаження центрального процесора приблизно на 20%, а графічного ядра на 80%. У результаті у нас ті ж 100%, що і при конвертації без CUDA і різниці в часі взагалі може і не бути (але вона таки є). Невеликий обсяг пам'яті в 256 MB так само не є фактором стримування. Судячи зі свідчень RivaTuner, в процесі роботи використовувалося не більше 154 MB відеопам'яті.



Висновки

Програма TMPGEnc є одним із тих, хто вводить технологію CUDA в маси. Використання GPU у цій програмі дозволяє прискорити процес обробки відео та значно розвантажити центральний процесор, що дозволить користувачеві комфортно займатися та іншими завданнями у цей же час. У нашому конкретному прикладі відеокарта GeForce 8800GT 256MB трохи покращила часові показники при конвертації відео на базі розігнаного процесора Pentium Dual-Core E5200. Але чітко видно, що при зниженні частоти збільшується приріст від активації CUDA, на слабких процесорах приріст від її використання буде набагато більшим. На тлі такої залежності цілком логічно припустити що і при збільшенні навантаження (наприклад, використання дуже великої кількості додаткових відеофільтрів) результати системи з CUDA будуть виділятися більш значущою різницею різниці витраченого часу на процес кодування. Також не варто забувати, що і G92 на даний момент не найпотужніший чіп, і більш сучасні відеокарти забезпечать значно більшу продуктивність у подібних додатках. Проте в процесі роботи програми GPU завантажений не повністю і, ймовірно, розподіл навантаження залежить від кожної конфігурації окремо, а саме від зв'язування процесор/відеокарту, що в результаті може дати і більший (або менший) приріст у відсотковому співвідношенні активації CUDA. У будь-якому випадку, тим, хто працює з великими обсягами відео, така технологія все одно дозволить значно заощадити свій час.

Щоправда, CUDA ще не набула повсюдної популярності, якість програмного забезпечення, що працює з цією технологією, вимагає доробок. У розглянутій нами програмі TMPGEnc 4.0 XPress ця технологія не завжди працювала. Один і той же ролик можна було перекодувати кілька разів, а потім раптом, при наступному запуску, завантаження CUDA вже дорівнювало 0%. І це явище мало цілком випадковий характер абсолютно різних операційних системах. Також розглянута програма відмовлялася використовувати CUDA під час кодування у формат XviD, але з популярним кодеком DivX жодних проблем не було.

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


Дякуємо наступним компаніям за надане тестове обладнання:

- Набір низькорівневих програмних інтерфейсів ( API) для створення ігор та інших високопродуктивних мультимедіа-додатків. Включає підтримку високопродуктивної 2D- І 3D-графіки, звуку та пристроїв введення.

Direct3D (D3D) – інтерфейс виведення тривимірних примітивів(Геометричних тіл). Входить в .

OpenGL(Від англ. Open Graphics Library, Дослівно - відкрита графічна бібліотека) - специфікація, що визначає незалежний від мови програмування крос-платформний програмний інтерфейс для написання додатків, що використовують двовимірну і тривимірну комп'ютерну графіку. Включає понад 250 функцій для малювання складних тривимірних сцен із простих примітивів. Використовується для створення відеоігор, віртуальної реальності, візуалізації в наукових дослідженнях. На платформі Windowsконкурує з .

OpenCL(Від англ. Open Computing Language, дослівно – відкрита мова обчислень) – фреймворк(каркас програмної системи) для написання комп'ютерних програм, пов'язаних з паралельними обчисленнями на різних графічних ( GPU) та ( ). У фреймворк OpenCLвходять мову програмування та інтерфейс програмування додатків ( API). OpenCLзабезпечує паралелізм на рівні інструкцій та на рівні даних та є реалізацією техніки GPGPU.

GPGPU(скор. від англ. General-P urpose G raphics P rokussing U nits, дослівно - GPUзагального призначення) - техніка використання графічного процесора відеокарти для загальних обчислень, які зазвичай проводить .

Шейдер(англ. shader) – програма побудови тіней на синтезованих зображеннях, використовують у тривимірної графіці визначення остаточних параметрів об'єкта чи зображення. Як правило, включає довільної складності опис поглинання та розсіювання світла, накладання текстури, відображення та заломлення, затінення, зміщення поверхні та ефекти пост-обробки. Складні поверхні можуть бути візуалізовані за допомогою простих геометричних форм.

Рендеринг(англ. rendering) – візуалізація, в комп'ютерній графіці процес отримання зображення за моделлю за допомогою програмного .

SDK(скор. від англ. Software Development Kit) – набір інструментальних засобів розробки програмного забезпечення.

CPU(скор. від англ. Central Processing Unit, дослівно - центральний/основний/головний обчислювальний пристрій) - центральний (мікро); пристрій, що виконує машинні інструкції; частина апаратного забезпечення, що відповідає за виконання обчислювальних операцій (заданих операційною системою та прикладним програмним) і координує роботу всіх пристроїв.

GPU(скор. від англ. Graphic Processing Unit, Дослівно - графічний обчислювальний пристрій) - графічний процесор; окремий пристрій або ігрової приставки, що виконує графічний рендеринг (візуалізацію). Сучасні графічні процесори дуже ефективно обробляють і реалістично відображають комп'ютерну графіку. Графічний процесор у сучасних відеоадаптерах застосовується як прискорювач тривимірної графіки, проте його можна використовувати в деяких випадках і для обчислень ( GPGPU).

Проблеми CPU

Довгий час підвищення продуктивності традиційних переважно відбувалося рахунок послідовного збільшення тактової частоти (близько 80% продуктивності визначала саме тактова частота) з одночасним збільшенням кількості транзисторів однією кристалі. Однак подальше підвищення тактової частоти (при тактовій частоті більше 3,8 ГГц чіпи просто перегріваються!) впирається в ряд фундаментальних фізичних бар'єрів (оскільки технологічний процес майже впритул наблизився до розмірів атома: , а розміри атома кремнію – приблизно 0,543 нм):

По-перше, зі зменшенням розмірів кристала та підвищенням тактової частоти зростає струм витоку транзисторів. Це веде до підвищення споживаної потужності та збільшення викиду тепла;

По-друге, переваги вищої тактової частоти частково зводяться нанівець через затримки при зверненні до пам'яті, оскільки час доступу до пам'яті не відповідає зростаючим тактовим частотам;

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

Розвиток GPU

Паралельно з йшло (і йде!) розвиток GPU:

Листопад 2008 р. – Intelпредставила лінійку 4-ядерних Intel Core i7, в основу яких покладено мікроархітектуру нового покоління Nehalem. Процесори працюють на тактовій частоті 26-32 ГГц. Виконані за 45-нм техпроцесом.

Грудень 2008 р. – розпочалися поставки 4-ядерного AMD Phenom II 940(кодова назва – Deneb). Працює на частоті 3 ГГц, випускається за техпроцесом 45-нм.

Травень 2009 р. – компанія AMDпредставила версію графічного процесора ATI Radeon HD 4890із тактовою частотою ядра, збільшеною з 850 МГц до 1 ГГц. Це перший графічнийпроцесор, працюючий на частоті 1 ГГц. Обчислювальна потужність чіпа завдяки збільшенню частоти зросла з 1,36 до 1,6 терафлоп. Процесор містить 800 (!) обчислювальних ядер, підтримує відеопам'ять GDDR5, DirectX 10.1, ATI CrossFireXта всі інші технології, властиві сучасним моделям відеокарт. Чіп виготовлений на базі 55-нм технології.

Основні відмінності GPU

Відмінними рисами GPU(порівняно з ) є:

- архітектура, максимально націлена на збільшення швидкості розрахунку текстур та складних графічних об'єктів;

- пікова потужність типового GPUнабагато вище, ніж у ;

– завдяки спеціалізованій конвеєрній архітектурі, GPUнабагато ефективніше у обробці графічної інформації, ніж .

«Криза жанру»

«Криза жанру» для назрів до 2005 р. – саме тоді з'явилися . Але, незважаючи на розвиток технології, зростання продуктивності звичайних помітно знизився. У той же час продуктивність GPUпродовжує зростати. Так, до 2003 р. і кристалізувалась ця революційна ідея – використовувати для потреб обчислювальну міць графічного. Графічні процесори стали активно використовуватися для неграфічних обчислень (симуляція фізики, обробка сигналів, обчислювальна математика/геометрія, операції з базами даних, обчислювальна біологія, обчислювальна економіка, комп'ютерний зір і т.д.).

Головна проблема полягала в тому, що не було стандартного інтерфейсу для програмування GPU. Розробники використовували OpenGLабо Direct3Dале це було дуже зручно. Корпорація NVIDIA(один з найбільших виробників графічних, медіа- та комунікаційних процесорів, а також бездротових медіа-процесорів; заснована у 1993 р.) зайнялася розробкою якогось єдиного та зручного стандарту, – і представила технологію CUDA.

Як це починалося

2006 р. – NVIDIAдемонструє CUDA™; початок революції у обчисленнях на GPU.

2007 р. – NVIDIAвипускає архітектуру CUDA(Початкова версія CUDA SDKбула представлена ​​15 лютого 2007 р.); номінація «Найкраща новинка» від журналу Popular Scienceта «Вибір читачів» від видання HPCWire.

2008 р. – технологія NVIDIA CUDAперемогла в номінації «Технічна перевага» від PC Magazine.

Що таке CUDA

CUDA(скор. від англ. Compute Unified Device Architecture, дослівно - уніфікована обчислювальна архітектура пристроїв) - архітектура (сукупність програмних та апаратних засобів), що дозволяє виробляти GPUобчислення загального призначення, причому GPUПрактично виступає у ролі потужного співпроцесора.

Технологія NVIDIA CUDA™– це єдине середовище розробки мовою програмування C, яка дозволяє розробникам створювати програмне рішення складних обчислювальних завдань за менший час, завдяки обчислювальної потужності графічних процесорів. У світі вже працюють мільйони GPUз підтримкою CUDA, І тисячі програмістів вже користуються (безкоштовно!) інструментами CUDAдля прискорення додатків та для вирішення найскладніших ресурсомістких завдань – від кодування відео- та аудіо- до пошуків нафти та газу, моделювання продуктів, виведення медичних зображень та наукових досліджень.

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

Уральський, провідний спеціаліст з технологій NVIDIA, порівнюючи GPUі каже так: « - Це позашляховик. Він їздить завжди та скрізь, але не дуже швидко. А GPU- Це спорткар. На поганій дорозі він просто нікуди не поїде, але дайте гарне покриття, і він покаже всю свою швидкість, яка позашляховику і не снилася!..».

Можливості технології CUDA