Персональний блог - обчислення на графічних процесорах, клуб експертів dns

Персональний блог - обчислення на графічних процесорах, клуб експертів dns

Обчислення на графічних процесорах

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

Персональний блог - обчислення на графічних процесорах, клуб експертів dns

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

Персональний блог - обчислення на графічних процесорах, клуб експертів dns

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

Перші розрахунки на GPU

Області застосування паралельних розрахунків на GPU

При перенесенні обчислень на GPU, у багатьох задачах досягається прискорення в 5-30 разів, у порівнянні з швидкими універсальними процесорами. Найбільші цифри (близько 100-кратного прискорення і навіть більше!) Досягаються на коді, який не дуже добре підходить для розрахунків за допомогою блоків SSE, але цілком зручний для GPU.
Це лише деякі приклади прискорень синтетичного коду на GPU проти SSE-векторизованних коду на CPU (за даними NVIDIA):
• Флуоресцентна мікроскопія: 12x.
• Молекулярна динаміка (non-bonded force calc): 8-16x;
• Електростатика (пряме і багаторівневе підсумовування Кулона): 40-120x і 7x.
Таблиця, яку NVIDIA, показує на всіх презентаціях, в якій показується швидкість графічних процесорів щодо центральних.

Персональний блог - обчислення на графічних процесорах, клуб експертів dns

Переваги та обмеження CUDA

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

Персональний блог - обчислення на графічних процесорах, клуб експертів dns

Переваги CUDA перед традиційним підходом до GPGPU обчислень

NVDIA CUDA в українській науковому середовищі.