Відмінності між версіями «GPGPU»

(Створена сторінка: {{Завдання|Мотиль Г.Я.|Назаревич О. Б.| 20 березня 2011}} {{Студент |img=Нема | Name=Мотиль| Surname= Гали…)
(Немає відмінностей)

Версія за 16:21, 11 березня 2011

Blue check.png Дана стаття являється неперевіреним навчальним завданням.
Студент: Мотиль Г.Я.
Викладач: Назаревич О. Б.
Термін до: 20 березня 2011

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



Нема
Імя Мотиль
Прізвище Галина
По-батькові Ярославівна
Факультет ФІС
Група СНм-51
Залікова книжка СН-10-090


GPGPU(General-Purpose computing on Graphics Processing Units) - техніка використаня графічного процесора відеокарти для загальних обчислень, які зазвичай виконує центральний процесор.


Передумови виникнення GPGPU

Вже в 2003 ріоці, Intel і AMD брали участь у спільній гонці за самий потужний процесор. Всього за кілька років у результаті цієї гонки тактові частоти суттєво зросли, особливо після виходу Intel Pentium 4.

Еволюція GPU i CPU
Але перегони швидко наближалася до межі. Після хвилі величезного приросту тактових частот (між 2001 і 2003 роками тактова частота Pentium 4 подвоїлася з 1,5 до 3 ГГц), користувачам довелося задовольнятися десятими частками гігагерц, які змогли вичавити виробники (з 2003 до 2005 тактові частоти збільшилися всього з 3 до 3,8 ГГц). Розробники архітектури CPU підійшли до закону скорочення приросту: число транзисторів, що було потрібно додати для потрібного збільшення продуктивності, ставало все більшим, заводячи в глухий кут.

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

Основними властивостями якого є:

  • Використання графічного процесора для вирішення неграфічних задач;
  • Вся робота з GPU іде через API (OpenGL, D3D);
  • Програми використовують відразу 2 мови: одну традиційну(С++) і одну шейдерну;
  • Обмеження, притаманні графічним API;



Технологія CUDA

CUDA (. Compute Unified Device Architecture) — технологія GPGPU (англ. General-purpose computing on Graphics Processing Units), що дозволяє програмістам реалізовувати мовою програмування С алгоритми, що виконуватимуться на графічних процесорах Geforce восьмого покоління і старше (Geforce 8 Series, Geforce 9 Series, Geforce 200 Series), Nvidia Quadro і Tesla компанії Nvidia. Технологія CUDA розроблена компанією Nvidia. Технологія CUDA — це середовище розробки на С, яка дозволяє програмістам і розробникам писати програмне забезпечення для вирішення складних обчислювальних завдань за менший час завдяки багатоядерній обчислювальній потужності графічних процесорів. Простіше кажучи, графічна підсистема комп'ютера з підтримкою CUDA може бути використана, як обчислювальна. CUDA дає розробникові можливість на свій розсуд організовувати доступ до набору інструкцій графічного прискорювача і управляти його пам'яттю, організовувати на ньому складні паралельні обчислення. Графічний процесор з підтримкою CUDA стає потужною програмованою відкритою архітектурою подібно до сьогоднішніх центральних процесорів. Все це надає в розпорядження розробника низькорівневий, розподілюваний і високошвидкісний доступ до устаткування, роблячи CUDA необхідною основою при побудові серйозних високорівневих інструментів, таких як компілятори, відладчики, математичні бібліотеки, програмні платформи. Використовує grid-модель пам'яті, кластерне моделювання потоків і SIMD інструкції. Застосовується в основному для високозатратних графічних обчислень і розробок nvidia-сумісного графічного API. Включена можливість підключення до застосунків, що використовують OpenGL 9 і Microsoft Direct3D . Створений у версіях для Linux і Windows.

Основний підхід в технологіяї CUDA
Первинна версія CUDA SDK була представлена 15 лютого 2007 року. У основі CUDA API лежить розширена мова C. Для успішної трансляції коду цією мовою, до складу CUDA SDK входить власний C-компілятор командного рядка nvcc компанії Nvidia. Компілятор nvcc створений на основі відкритого компілятора Open64 і призначений для трансляції host-коду (головного коду, що управляє) і device-коду (апаратного коду) (файлів з розширенням .cu) в об'єктні файли, придатні в процесі збирання кінцевої програми або бібліотеки в будь-якому середовищі програмування.

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


Роботи з текстурною пам'яттю

Текстура
Текстурна пам'ять успадкувала свою назву і функціональність від терміну "текстура" 3D графіки. По суті, текстурна память - це механізм кешування ділянок глобальної пам'яті. Текстура, як правило, представляє собою 2D-масив і текстурна пам'ять спочатку була оптимізована під вибірку 2D даних фіксованого розміру. Після виділення області глобальної памятті допомогою спеціальної функції(cudaBindTexture*)вказівника, що дана ділянка памяті має розглядатися як текстура.

Один блок Texture доступний відразу для декількох мультипроцесорів . Даний блок реалізує в собі фіксовану функціональність по зверненню типу read-only до певних ділянок пам'яті. В силу такого графічного минулого текстури, пояснюють деякі можливості даного модуля:

  • Фільтрація текстурних координат
  • Білінійна або точкова інтерполяція
  • “розумне” повернення значення, у випадку коли значення текстурних координат виходить за межі допустимої границі
  • Звернення по нормальним або цілочисельним координатам
  • Повернення нормалізованих значень
  • Кешування даних


Фільтрація. Згортка

Використовуючи текстури, можна розглянути застосування CUDA в обробці цифрових сигналів. Якщо дані 2 функції f(x) і g(x), інтигруючихся на R, то з математичної точки зору, згортку можна представити у вигляді функції:

Fzgortku.JPG

Або в дискретній формі:

Duskrenta zgortka.JPG

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

Приклад. Gaussian Blur

Gaussian Blur - фільтрація, при якій можна використати врівноваження,яке буде пропорційно відстані від поточного пікселя.
Gaussian Blur одномірного сигналу
Для векторного сигналу Гаусове розмиття задає ваги по такій формулі:
Gaussian Blur двомірного сигналу
Gays vec.JPG


Для двомірного сигналу Гаусове розмиття задається аналогічно:

Fgays mas.JPG

Дана фільтрація має хорошу властивість сепарабельності: для фільтрації зображення можна спочатку провести фільтрацію по горизонталі, а потім - окремо по вертикалі. Розмиття по суті являється низькочастотним фільтром. Можна розглянути деякі випадкову величину (шумову функцію), рівномірно розподілену. З математичним сподіванням рівним 0.Тоді коли зображення буде одноколірним, але в кожному пікселі відбулося випадкове відхилення,то розмиття призведе до того, що шум просумується в деякій області даного пікселя, і тим самим при збільшенні радіуса області, можна ефективно подавити шум.

Приклад функції Gaussian Blur з допомогою CUDA

texture <ucar4, 2, CudaReadModeNormalizedloat>    g_Gaussian;
   _global_
void GaussianX_kernel (uchar4 * pDst,
   float     radius,
   float     sigma_sq,
   unit32  w,
   unit32  h, 
   unit32  p)
{
int tidx = threadIdx.x + blockIdx.x + blockDim.x;
int tidy = threadIdx.y + blockIdx.y + blockDim.y;
      if (tidx < w && tidy < h)
{
float4 r = {0.0f,0.0f, 0.0f, 0.0f};
float weight_sum=0.0f;
float weigth = 0.0f;
for (int_ic = -radius; ic <= radiuc; ic++)
    {
weigth = exp(-(ic*ic))/sigma_sq);
r += tex2D (g_Gaussian,tidx + 0.5f + ic, tidy+0.5f)* weight;
weight_sum += weight;
     }
r/=weight_sum;
pDst[tidx + tidy * p] = uc4(r*255.0f);
 }
    }


Аналоги технології CUDA


ATI Stream набір передових апаратних і програмних технологій, що дозволяють графічному і центральному процесорам узгоджено працювати, в цілях прискорення не тільки графічних задач. Це приводить до покращення збалансованості платформ, спроможних швидше ніж раніше спарвлятися з виконанням ресурсоємних задач.
BrookGPU є компілятор Стенфордського університету. BrookGPU компілює програми, написані з використанням програмування Брук потокової мови, який є варіантом ANSI C. Він може використовувати OpenGL v1.3 +, DirectX v9 +.


Список використаних джерел

  1. Боресков А.В., Харламов А.А. основи работи з технологией CUDA. – М.:ДМК Прес, 2010.
  2. www.thg.ru/graphic/nvidia_cuda/nvidia_cuda-05.html
  3. www.3dnews.ru/video/t-and-l
  4. uk.wikipedia.org/wiki/Графічний_процесор
  5. www.intuit.ru/search?text=cuda
  6. uk.edaboard.com/topic-1923862.0.html
  7. http://ru.wikipedia.org/wiki/GPGPU