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

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

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

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, показує на всіх презентаціях, в якій показується швидкість графічних процесорів щодо центральних.

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

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