В тази статия съдържа информация, която ще ви помогне да се разберат основните принципи на GPU-програмиране.
Въведение в архитектурата на GPU
Разделете двата вида устройства - това, което контролира цялостната логика - домакин. и е в състояние бързо да изпълни набор от инструкции на голямо количество данни - устройство.
за GPU програмиране
Програми са написани на C езикови разширения от NVidia / OpenCL и събрани с помощта на специален компилатор включени в SDK. Всеки производител своя курс. Има два варианта за монтаж - за целевата платформа - както е ясно посочено какъв хардуер ще бъде изпълнено в някакъв код или междинен код, който, когато се движат по драйвера на съответния хардуер ще се превърне в набор от конкретни инструкции за архитектура (коригирани за хардуерни възможности).
В изпълнение на програмата за GPU, наречена ядро - ядрото - че за CUDA да OpenCL, че това ще бъде един набор от инструкции, които се прилагат за всички данни. Функция сам, както и данните, на които се извършват - различни - на принципа на SIMD.CUDA / OpenCL водача разделя входни данни в множество части (изпълнение нишки комбинирани в блокове), и определя да изпълнява за всеки поток процесор. Програмистът може да зададете на водача и трябва да се направи най-ефективно използване на съществуващите ресурси на компютъра, като се посочва блокови размери и броя на конци в тях. Разбира се, на максимално допустимите стойности варират от устройство на устройство. Добра практика - преди параметри искане изпълнение желязо, върху които да работят ядрото и въз основа на тях се изчислява оптималните размери.
Схематично, разпределението на задачите на графичния процесор е както следва:
изпълнение на програмата на GPU
работна позиция (OpenCL) или конци (CUDA) - и набор ядро данни се извършва на Stream Processor (обработка на елемент в случая ATI устройства).
работна група (OpenCL) или конци блок (CUDA) се извършва на Multi процесор (SIMD двигателя)
Grid (блокове, поставени като концепция е само Nvidia) = извършени върху цялото устройство - GPU. За изпълнение на графичния всички потоци се комбинират в основата (основа - CUDA) или veyffronty (фронта на вълната - OpenCL) - нишка басейн назначен да изпълнява един многопроцесорни. Това означава, че ако броят на дялове или работни групи е по-висок от броя на multiprotsessorov - в действителност, във всеки даден момент тече група (или групи), комбинирана основа - всички други чакат реда си.
Едно ядро може да се извърши на няколко GPU устройства (за CUDA и за OpenCL, както ATI карта и за NVidia).
Един графичния устройство може едновременно да изпълнява множество ядра (за CUDA и за OpenCL, за NVidia - от 20 и по-горе архитектура). Връзки по тези въпроси, които виждате. В края на краищата.
OpenCL модел памет (в скоби - CUDA терминология)
Най-важното нещо, за да си спомня за времето на достъп до всеки вид памет. Най-бавно тази глобална памет - от графичния адаптер днес чак до 6GB. Освен това, скоростта е споделена памет (споделено - CUDA, местни - OpenCL) - обща за всички теми, в блока (конец блок - CUDA, работна група - OpenCL) - но това никога не е достатъчно - 32-48 KB за многопроцесорни. Най-бързият е локалната памет в резултат на използването на регистрите и кеш, но трябва да се разбере, че всичко, което не се вписва в кешовете \ регистри - ще се съхраняват в глобалната памет, с всички последици.
Моделите на паралелно програмиране за GPU
Карта - GPU паралелен модел
Толкова е просто - да вземе сет на въвеждане на данни и се прилагат към всеки елемент от изявление - ядрото - не влияе на останалите елементи - това е, Ние чете и пише на определени места на паметта.
Съотношението - 12:59 (едно-към-едно).
Пример - матрични стъпки умножение оператор или понижавания приложени към всеки елемент на матрицата и т.н.
Точкова - GPU паралелен модел
За всеки елемент на входния масив, ние изчисляваме позиция в изходния масив, в който ще повлияе (чрез прилагане на съответния оператор).
Отношение - като един към много (един към много).
3. Транспониране
Транспониране - GPU паралелен модел
Този модел може да се разглежда като специален случай на разсейването модел.
Използва се за оптимизиране на компютри - преразпределение на елементите в паметта, можете да постигнете значително увеличение на производителността.
Съберете - GPU паралелен модел
Това е обратното на модел на разпръскване - за всеки елемент от изхода масива, ние изчисляваме индексите на елементите на входния масив, който ще окаже влияние върху него:
Отношение - някои за един (много-към-едно).
Шаблон - GPU паралелен модел
Този модел може да се разглежда като специален случай на модела се съберат. Тук, за да се получат изходните стойности във всяка клетка на масива се използва за изчисляване конкретен модел на всички елементи на входния масив, които ще се отрази на крайната стойност. Всички видове филтри са построени на този принцип.
Съотношението на няколко една (няколко към един)
Пример: Gaussian филтър.
Намаляване - GPU паралелен модел
Има ли някой (All-към-едно)
Пример - изчисляване на максималните количества или в масив.
При изчисляването на изходните стойности във всяка клетка на масива е необходимо да се помисли за стойността на всеки вход елемент. Има два основни изпълнение - Хилс и Стийл и Blelloch.
от [Ь] = F [Ь] = оператор (F [I-1] в [Ь])
Съотношението на всички на всички (всички към всички).
Примери за - сортиране на данните.
Полезни връзки
Въведение в CUDA: