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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Обчислення загального призначення на графічних процесорах (GPGPU, рідко GPGP або GP²U) — використання графічного процесора (GPU), який зазвичай опрацьовує обчислення тільки для комп'ютерної графіки, для виконання обчислень в додатках, що зазвичай обробляються блоком центрального процесора (ЦП). Використання декількох відеокарт в одному комп'ютері, або великого числа графічних чипів, дозволяє реалізувати паралельну обробки на додаток до паралельної обробки графіки. Крім того, навіть одна структура GPU-CPU за рахунок спеціалізації на кожному чипі надає переваги, недоступні при застосуванні кількох звичайних процесорів.

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

GPGPU комунікаційні лінії розроблені з специфічних обчислень.

Історія[ред.ред. код]

Обчислення загального призначення на графічних процесорах стало практичним і популярним після 2001, з появою програмованих шейдерів і підтримки плаваючої точки на графічних процесорах. Зокрема, проблеми з участю матриць і/або векторів — особливо двох-, трьох- або чотирьох-вимірних векторів — було легко перевести на GPU, який діє з рідною швидкістю і підтримує ці типи. Експерименти наукових обчислень з новим обладнанням почалося зі звичайного множення матриць (2001); одна з перших спільних наукових програм, що працювала швидше на GPU, ніж на графічних процесорах була реалізація LU факторизації (2005).

Ці ранні спроби використовувати графічні процесори як процесори загального призначення вимагали переформулювання обчислювальних завдань з точки зору графічних примітивів, що підттримуються двома основними програмними інтерфейсами(API) для графічних процесорів: OpenGL і DirectX. Це громіздке перетворення було усунене з появою мов програмування загального призначення та інтерфейсів, таких як Sh/RapidMind, Brook та Accelerator.

Вони супроводжувалися технологією CUDA від Nvidia, яка дозволила програмістам ігнорувати основні графічні концепції на користь більш звичних високопродуктивних обчислювальних концепцій.[5] Нові апаратні пропозиції від незалежних постачальників включали DirectCompute від Microsoft та Apple/Khronos OpenCL групи.[5] Це означає, що сучасні GPGPU трубопроводи можуть виконувати дії над будь-якими операціями з великими даними(«big data») і використовувати швидкість GPU, не вимагаючи повного і явного перетворення даних в графічну форму.

Реалізації[ред.ред. код]

Будь-яка мова, яка дозволяє коду працюючому на центральному процесорі звернутись до шейдерів GPU для повернення значень, може створити GPGPU фреймворк.

OpenCL в даний час є домінуючою мовою з відкритим вихідним кодом для обличслень загального призначення на GPU та є відкритим стандартом, визначеним Khronos Group.[8] OpenCL забезпечує крос-платформлену GPGPU платформу, яка додатково підтримує паралельні обчисллення даних на центральних процесорах(CPU). OpenCL активно підтримується на платформах Intel, AMD, Nvidia і ARM.

Поширеним фреймворком є NVIDIA CUDA.[9] NVIDIA CUDA випущена в 2006 році, це SDK і API який дозволяє використовувати мову програмування C для кодування алгоритмів для виконання на GPU серії GeForce 8. Стандарти програмування для паралельних обчислень включають OpenCL (незалежних постачальників), OpenACC і OpenHMPP. Марк Харріс є засновником GPGPU.org і терміну «GPGPU».

Стандарти програмування для паралельних обчислень включають OpenCL (незалежних постачальників), OpenACC і OpenMP. Mark Harris, засновник GPGPU.org, ввів термін "GPGPU".

OpenVIDIA був розроблений в Університеті Торонто протягом 2003–2005 ,[10] у співпраці з NVIDIA.

Microsoft представила "GPU Computing" мови F # і DirectCompute GPU обчислення API, випущений з DirectX 11 API.

MATLAB підтримує прискорення GPGPU з використанням паралельних обчислень Toolbox і MATLAB Distributed Computing Server, а також сторонні пакети.

Обробка GPGPU також використовується для імітації ньютонівської фізики двигунами фізики, а також комерційні реалізації включають Havok Physics, FX і PhysX, обидва з яких, як правило, використовується для відео і комп'ютерних ігор. 

C ++ Accelerated масовим паралелізмом це бібліотека, яка прискорює виконання коду C ++, скориставшись апаратними даними паралельно на графічних процесорах.

Мобільні комп'ютери[ред.ред. код]

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

Google Android 4.2 включений працює виконати код сценарію на мобільному CPU пристрою Apple, представила власний метал API для додатків IOS, здатний виконати довільний код за допомогою GPU обчислювальних шейдерів.

Апаратна підтримка[ред.ред. код]

Комп'ютерні графічні карти виробляються різними постачальниками, такими як Nvidia і AMD / ATI Карти від таких виробників відрізняються по реалізації підтримки даних формату, такі як цілі і з плаваючою комою форматів (32-розрядна та 64-розрядна Microsoft представила "Shader Model" стандарт, щоб допомогти ранжувати різні можливості графічних карт в простій Shader Model номер версії (1.0, 2.0, 3.0 і т.д.)

Цілочисельний формат даних[ред.ред. код]

Графічні карти до DirectX 9 підтримували тільки палітрені або цілочисельні типи кольору. Доступні різні формати, кожен з яких містить червоний, зелений і синій елементи. Іноді додають додаткові значення альфа, які будуть використовуватися для прозорості. Загальні формати: 

  • +8 Біт на піксель — Іноді режим палітри, де кожне значення індексу в таблиці з реальним значенням вказане в одному з інших форматів. Іноді три біта для червоного, три біта для зеленого і два біти для синього. 16 біт на піксель — Звичайно виділяється у вигляді п'яти біт для червоного, шість біт для зеленого і п'ять біт для синього. 24 біт на піксель — вісім бітів для кожного з червоного, зеленого і синього 32 біт на піксель — вісім біт для кожного з червоного, зеленого, синього та альфа.

Формат даних з плаваючою комою[ред.ред. код]

Для ранньо фіксованої функції або обмежених можливостей програмування графіки (тобто до і включаючи DirectX 8.1-сумісний GPU) цього було достатньо, тому що це також представлення яке використовується в дисплеях. Таке представлення має певні обмеження. Враховуючи достатню потужність обробки графіки, навіть програмісти графіки хотіли б використовувати кращі формати, такі як формати даних з плаваючою комою, щоб отримати ефекти, такі як високий динамічний діапазон зображень. Багато GPGPU додатків вимагають точності формату з плаваючою комою, яка прийшла з відеокартами, відповідно до специфікації DirectX 9.

DirectX 9 Shader Model 2.x запропонувала підтримку двох типів точності: повної і часткової. Повна точність може бути FP32 або FP24 (floating point 32- або 24-біт на компонент) або більше, в той час як часткова точність була FP16. Серія графічних процесорів ATI R300 підтримувала точність FP24 тільки в трубопроводі програмованого фрагмента (хоча FP32 підтримувалась в вертексних процесорах), а серія Nvidia NV30 підтримує як FP16, так і FP32. Інші виробники, такі як S3 Graphics і XGI підтримують суміш форматів до FP24.

Shader Model 3.0 змінила специфікацію, збільшуючи вимоги до повної точності як мінімум до підтримки FP32 в трубопроводі фрагмента. Shader Model 3.0 в сумістності з поколінням R5xx (Radeon X1000 серії) підтримує тільки FP32 через трубопровід, а серії Nvidia NV4x і G7X раніше підтримували і повну точність FP32, і часткову FP16. Хоча це і не передбачено Shader Model 3.0, як графічні процесори ATI, так і Nvidia Shader Model 3.0 представили підтримку для змішування цілей візуалізації FP16, сприяючи підтримці високодинамічного відображення діапазону.

The implementations of floating point on Nvidia GPUs are mostly IEEE compliant; however, this is not true across all vendors.[1] This has implications for correctness which are considered important to some scientific applications. While 64-bit floating point values (double precision float) are commonly available on CPUs, these are not universally supported on GPUs; some GPU architectures sacrifice IEEE compliance while others lack double-precision altogether. There have been efforts to emulate double-precision floating point values on GPUs; however, the speed tradeoff negates any benefit to offloading the computation onto the GPU in the first place.[2]

Векторизація[ред.ред. код]

Більшість операцій на GPU працюють таким векторизованим чином: одна операція може бути виконана на чотирьох значеннях одночасно. Наприклад, якщо один колір <r1, g1,="" b1=""> буде необхідно модулювати за допомогою іншого кольору <r2, g2,="" b2="">, то графічний процесор може виробляти результуючий колір <r1 *="" r2,="" g1="" g2,="" В2="" В1=""> в одній операції. Ця функція корисна в графіці, тому що майже кожен основний тип даних являє собою вектор (2-, 3- або 4-вимірний). Приклади включають в себе вершини, кольори, нормальні вектори, і текстурні координати. Багато інших програм можуть корисно це використати, а також через їх більш високу продуктивність, векторні команди (SIMD) вже давно доступні на процесорах.</r1></r2,></r1,>

GPU проти CPU[ред.ред. код]

Спочатку, дані просто передавалися в одному напрямку з центрального процесора до GPU, а потім до пристрою відображення. Однак, з плином часу, для графічних процесорів стало цінним зберігати спершу прості, потім складні структури даних, які передаються назад в процесор, що аналізує зображення, або набір науково представлених даних у форматі 2D або 3D, що відеокарта може зрозуміти. Так як GPU має доступ до кожної операції малювання, він може аналізувати дані в цих формах дуже швидко; в той час як процесор повинен опитати кожен піксель або елемент даних набагато повільніше, так як швидкість доступу між центральним процесором і його більшим простором оперативної пам'яті (або ще у гіршому випадку, жорсткого диску) є повільніша, ніж на графічних процесорах і відеокартах, які, як правило, містять менші кількості більш дорогої пам'яті, до якої доступ можна отримати набагато швидше.

Передача частини набору даних, які будуть проаналізовані на цю GPU пам'ять у вигляді текстур або інших легко зрозумілих GPU форм призводить до збільшення швидкості. Відмінною особливістю конструкції GPGPU є здатність передавати інформацію в обох напрямках назад від GPU до CPU; як правило, швидкість передачі даних в обох напрямках є ідеально висока, в результаті чого ефект множення впливає на швидкість конкретного алгоритму високого використання. GPGPU конвеєри можуть підвищити ефективність на особливо великих наборах даних та / або даних, що містять 2D або 3D зображення. Він використовується в складних графічних конвеєрах, а також наукових обчисленнях; зокрема, в областях з великими наборами даних, таких як відображення геному, або там, де дво- або тривимірній аналіз корисний — зокрема, аналіз біомолекул, дослідження білків, і в інших складних галузях органічної хімії. Такі конвеєри можуть також значно поліпшити ефективність обробки зображень та комп'ютерного зору, поміж інших областей.

GPGPU це концепт програмного забезпечення, а не апаратного. Тим не менш, спеціалізовані конструкції устаткування можуть ще більше підвищити ефективність GPGPU трубопроводів, які традиційно виконують відносно мало алгоритмів на дуже великих обсягах даних. Масово розпаралелені завдання гігантських рівнів даних, таким чином, можуть бути розпаралелені ще більше за допомогою спеціалізованих установок, таких як обчислювальні стійки (багато подібних, вузькоспеціалізованих машин, побудованих в «стійці»), який додає третій шар — багато обчислювальних блоків кожен з яких використовує багато центральних процесорів щоб відповідати багатьом графічним.

Кеш[ред.ред. код]

Історично, процесори використовували апаратні кеші, а ранішні графічні процесори забезпечували лише програмну локальну пам'ять. Проте, так як графічні процесори починали використовуватись все більше і більше для обличслень загального призначення, їх почали створювати з апаратними багаторівневими кешами,[12] що допомогло GPU просунутись у напрямку головного апаратного забезпечення для обчислень.

Реєстрові файли[ред.ред. код]

Графічні процесори мають дуже великий файл регістра, який дозволяє їм зменшити контекстне перемикання затримки. Через це, зареєструвати розмір файлу збільшується протягом CPU поколінь GPU, наприклад, загальний розмір файлу регістрів на Maxwell (GM200) і Pascal GPU є 6144KB і . Для порівняння, розмір файлу регістрів на процесорах невеликі, як правило сотні або, десятки KBs .

Обробка потоків даних[ред.ред. код]

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

Наступне обговорення з посиланням на вершини, фрагменти і текстури проблем в основному застарілих моделей програмування GPGPU, де графічні API (OpenGL або DirectX) були використані для виконання обчислень загального призначення. З введенням CUDA (NVIDIA, 2007) і OpenCL (незалежних постачальників, 2008) обчислення загального призначення API, в нових кодах GPGPU це більше не потрібно відображати обчислення на графічних примітивів. Обробка потоку природа графічних процесорів залишається в силі незалежно від API, які використовуються.

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

Потік це просто набір записів, які вимагають аналогічних обчислень. Потоки забезпечують паралелізм даних. Ядра є функції, які застосовуються до кожного елементу в потоці. У графічних процесорах, вершини і фрагменти є елементами в потоках і вершинних і фрагментних шейдеров ядра буде працювати на них. Оскільки процес графічних процесорів незалежно один від одного елементів не існує ніякого способу мати загальні або статичні дані. Для кожного елемента ми можемо читати тільки від вхідних даних, виконання операцій на ньому, і написати до виходу. Це допустимо мати кілька входів і кілька виходів, але ніколи не шматок пам'яті, який є одночасно для читання і запису. [Розпливчасто]

Арифметика інтенсивність визначається як кількість операцій, що виконуються за слово пам'яті переданої. Це важливо для GPGPU додатків, щоб мати високу інтенсивність арифметичну ще затримки доступу до пам'яті буде обмежувати обчислювальні SpeedUp.

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

Концепції програмування GPU[ред.ред. код]

Текстури як потік[ред.ред. код]

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

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

Управління потоком[ред.ред. код]

У послідовному коді можна управляти потоком програми з використанням, якщо щось-інакше заяви і різні форми петель. Такі структури управління потоком тільки недавно були додані в графічних процесорах. Умовні записи може бути виконано за допомогою вірним наміром серії арифметика / бітових операцій, але цикли і умовні переходи були можливі.Останні графічні процесори дозволяють розгалуження, але, як правило, з втратою продуктивності. Розгалуження слід уникати у внутрішніх циклах, будь то в CPU або GPU, а також різні методи, такі як статичний дозвіл розгалуження, попереднього розрахунку, предикации, петля розщеплення,  і Z-відсікання може бути використана для досягнення розгалуження, коли апаратна підтримка не існує.

Примітки[ред.ред. код]

  1. Mapping computational concepts to GPUs: Mark Harris.
  2. Double precision on GPUs (Proceedings of ASIM 2005): Dominik Goddeke, Robert Strzodka, and Stefan Turek.