ЦУДА
ЦУДА (енгл. Compute Unified Device Architecture) је платформа за паралелну обраду коју је креирала Нвидиа, и имплементирана је на графичким процесорима које они производе.[1] ЦУДА даје програмерима директан приступ виртуелном скупу инструкција и меморији за паралелну обраду у ГПУ.
Помоћу ЦУДА платформе, ГПУ се може користити и за генерално програмирање, а не само за графику. Овај приступ је познат као ГПГПУ (енг. Генерал-пурпосе цомпутинг он грапхицс процессинг унитс). За разлику од ЦПУ, ГПУ поседује паралелност кроз архитектуру која наглашава извршавање више конкурентних нити спорије, уместо извршавања једне нити веома брзо.
ЦУДА платформа је доступна програмерима кроз ЦУДА библиотеке, компајлерске директиве, и екстензије програмских језика C, C++ и Фортран. C/C++ програмери користе 'ЦУДА C/C++', компајлер са "нвцц", ЛЛВМ C/C++ компајлером.[2]
Осим библиотека, директива, ЦУДА C/C++ и ЦУДА Фортран, ЦУДА платформа подржава и друге интерфејсе као што су ОпенЦЛ, Мицрософт ДирецтЦомпуте (интерфејс који је део ДирецтX СДК) и C++ АМП.[3]
У индустрији рачунарских игара, ГПУ се осим за графичко рендеровање користи и за математичка израчунавања у физици за ефекте попут ватре, дима, и динамике флуида. ЦУДА се за ову сврху користи у НВИДИА ПхyсX и Буллет физичким машинама. Осим у видео играма, ЦУДА се такођер користи и за убрзавање израчунавања у биологији, криптографији и другим научним пољима са интензивном применом математичких израчунавања.[4][5][6][7][8]
ЦУДА обезбеђује АПИ ниског нивоа, као и АПИ високог нивоа. Прва верзија ЦУДА СДК је представљена 15. Фебруара 2007. за Мицрософт Wиндоwс и Линуx. Мац ОС X подршка је додана касније у верзији 2.0.[9] ЦУДА ради на свим Нвидиа ГПУ почевши од Г8x серије, Нвидиа ГеФорце, Нвидиа Qуадро и Нвидиа Тесла брендовима.
Позадина
[уреди | уреди извор]ГПУ, као специјални процесор, обавља веома интензивне задатке везане за 3Д графику високе резолуције у реалном времену.
ГПУ је еволуирао у паралелни вишепроцесорски систем који омогућава веома ефикасну обраду великих блокова података. ГПУ је ефикаснији него општенаменски ЦПУ за алгоритме где се велики блокови података обрађују паралелно, попут:
- пусх-релабел алгоритам максималног протока графа;
- брзо сортирање великих листи;
- симулације молекуларне динамике;
Предности
[уреди | уреди извор]ЦУДА има неколико предности над обрадом помоћу графичких АПИ-ја:
- Разбацано читање - код може бити прочитан са произвољне адресе у меморији;
- Дељена меморија – ЦУДА излаже брзе регионе дељене меморије (до 48КБ по мулти-процесору) који могу бити дељени између нити. Ово се може користити као кориснички кеш, пружајући већи пропуст података него што је то могуће помоћу методе тражења текстура (енг. теxтуре лоокупс метход);[10]
- Бржи ток података из/у ГПУ;
- Пуна подршка за целобројне и битовне операције, укључујући целобројно претраживање текстура;
Ограничења
[уреди | уреди извор]- ЦУДА не подржава пуни C стандард, тако да се валидан C код, али погрешан C++ код неће компајлирати;[11][12]
- Рендеровање текстура није подржано;
- Копирање података између хоста и меморије уређаја може резултовати опадањем перформанси због пропуста и кашњења системске магистрале;
- Нити би се требале извршавати у групама од по барем 32 нити за најбоље перформансе. Гранања у програму немају утицаја на перформансе, под претпоставком да свака од 32 нити има исти извршни ток;
- ЦУДА је доступна само на ГПУ које производи Нвидиа;[13]
- Валидан C++ код понекад може бити означен што спречава његово компајлирање због техника оптимизације које компајлер користи;
- ЦУДА користи подскуп C језика, без рекурзије и показивача на функције са додатним мањим проширењима. Међутим, појединачан процес се мора извршавати на више раздвојених меморијских простора за разлику од осталих C извршних окружења;
- Реални бројеви двоструке прецизности (ЦУДА цомпуте цапабилитy 1.3+) одступају од ИЕЕЕ 754 стандарда: "заокружи на најближи паран" је једини подржан мод заокруживања за реципрочне вредности, дељење, и квадратни корен;[14]
Подржани ГПУ
[уреди | уреди извор]ЦУДА цомпуте цапабилитy табела за ГПУ и графичку карту. Такођер директно доступно на: Нвидиа:
ЦУДА цомпуте цапабилитy (верзија) |
ГПУ | Графичке картице |
---|---|---|
1.0 | Г80, Г92, Г92б, Г94, Г94б | ГеФорце ГТ 420*, ГеФорце 8800 Ултра, ГеФорце 8800 ГТX, ГеФорце ГТ 340*, ГеФорце ГТ 330*, ГеФорце ГТ 320*, ГеФорце 315*, ГеФорце 310*, ГеФорце 9800 ГТ, ГеФорце 9600 ГТ, ГеФорце 9400ГТ, Qуадро ФX 5600, Qуадро ФX 4600, Qуадро Плеx 2100 С4, Тесла Ц870, Тесла Д870, Тесла С870 |
1.1 | Г86, Г84, Г98, Г96, Г96б, Г94, Г94б, Г92, Г92б | ГеФорце Г110М, ГеФорце 9300М ГС, ГеФорце 9200М ГС, ГеФорце 9100М Г, ГеФорце 8400М ГТ, ГеФорце Г105М, Qуадро ФX 4700 X2, Qуадро ФX 3700, Qуадро ФX 1800, Qуадро ФX 1700, Qуадро ФX 580, Qуадро ФX 570, Qуадро ФX 470, Qуадро ФX 380, Qуадро ФX 370, Qуадро ФX 370 Лоw Профиле, Qуадро НВС 450, Qуадро НВС 420, Qуадро НВС 290, Qуадро НВС 295, Qуадро Плеx 2100 Д4, Qуадро ФX 3800М, Qуадро ФX 3700М, Qуадро ФX 3600М, Qуадро ФX 2800М, Qуадро ФX 2700М, Qуадро ФX 1700М, Qуадро ФX 1600М, Qуадро ФX 770М, Qуадро ФX 570М, Qуадро ФX 370М, Qуадро ФX 360М, Qуадро НВС 320М, Qуадро НВС 160М, Qуадро НВС 150М, Qуадро НВС 140М, Qуадро НВС 135М, Qуадро НВС 130М, Qуадро НВС 450, Qуадро НВС 420, Qуадро НВС 295 |
1.2 | ГТ218, ГТ216, ГТ215 | ГеФорце ГТ 240, ГеФорце ГТ 220*, ГеФорце 210*, ГеФорце ГТС 360М, ГеФорце ГТС 350М, ГеФорце ГТ 335М, ГеФорце ГТ 330М, ГеФорце ГТ 325М, ГеФорце ГТ 240М, ГеФорце Г210М, ГеФорце 310М, ГеФорце 305М, Qуадро ФX 380 Лоw Профиле, НВИДИА НВС 300, Qуадро ФX 1800М, Qуадро ФX 880М, Qуадро ФX 380М, НВИДИА НВС 300, НВС 5100М, НВС 3100М, НВС 2100М |
1.3 | ГТ200, ГТ200б | ГеФорце ГТX 280, ГеФорце ГТX 275, ГеФорце ГТX 260, Qуадро ФX 5800, Qуадро ФX 4800, Qуадро ФX 4800 фор Мац, Qуадро ФX 3800, Qуадро CX, Qуадро Плеx 2200 Д2, Тесла Ц1060, Тесла С1070, Тесла М1060 |
2.0 | ГФ100, ГФ110 | ГеФорце ГТX 590, ГеФорце ГТX 580, ГеФорце ГТX 570, ГеФорце ГТX 480, ГеФорце ГТX 470, ГеФорце ГТX 465, ГеФорце ГТX 480М, Qуадро 6000, Qуадро 5000, Qуадро 4000, Qуадро 4000 фор Мац, Qуадро Плеx 7000, Qуадро 5010М, Qуадро 5000М, Тесла Ц2075, Тесла Ц2050/Ц2070, Тесла М2050/М2070/М2075/М2090 |
2.1 | ГФ104, ГФ106 ГФ108,ГФ114, ГФ116, ГФ119 | ГеФорце ГТX 560 Ти, ГеФорце ГТX 550 Ти, ГеФорце ГТX 460, ГеФорце ГТС 450, ГеФорце ГТС 450*, ГеФорце ГТ 640 (ГДДР3), ГеФорце ГТ 630, ГеФорце ГТ 620, ГеФорце ГТ 610, ГеФорце ГТ 520, ГеФорце ГТ 440, ГеФорце ГТ 440*, ГеФорце ГТ 430, ГеФорце ГТ 430*, ГеФорце ГТX 675М, ГеФорце ГТX 670М, ГеФорце ГТ 635М, ГеФорце ГТ 630М, ГеФорце ГТ 625М, ГеФорце ГТ 720М, ГеФорце ГТ 620М, ГеФорце 710М, ГеФорце 610М, ГеФорце ГТX 580М, ГеФорце ГТX 570М, ГеФорце ГТX 560М, ГеФорце ГТ 555М, ГеФорце ГТ 550М, ГеФорце ГТ 540М, ГеФорце ГТ 525М, ГеФорце ГТ 520МX, ГеФорце ГТ 520М, ГеФорце ГТX 485М, ГеФорце ГТX 470М, ГеФорце ГТX 460М, ГеФорце ГТ 445М, ГеФорце ГТ 435М, ГеФорце ГТ 420М, ГеФорце ГТ 415М, ГеФорце 710М, ГеФорце 410М, Qуадро 2000, Qуадро 2000Д, Qуадро 600, Qуадро 410, Qуадро 4000М, Qуадро 3000М, Qуадро 2000М, Qуадро 1000М, НВС 5400М, НВС 5200М, НВС 4200М |
3.0 | ГК104, ГК106, ГК107 | ГеФорце ГТX 770, ГеФорце ГТX 760, ГеФорце ГТX 690, ГеФорце ГТX 680, ГеФорце ГТX 670, ГеФорце ГТX 660 Ти, ГеФорце ГТX 660, ГеФорце ГТX 650 Ти БООСТ, ГеФорце ГТX 650 Ти, ГеФорце ГТX 650, ГеФорце ГТX 780М, ГеФорце ГТX 770М, ГеФорце ГТX 765М, ГеФорце ГТX 760М, ГеФорце ГТX 680МX, ГеФорце ГТX 680М, ГеФорце ГТX 675МX, ГеФорце ГТX 670МX, ГеФорце ГТX 660М, ГеФорце ГТ 750М, ГеФорце ГТ 650М, ГеФорце ГТ 745М, ГеФорце ГТ 645М, ГеФорце ГТ 740М, ГеФорце ГТ 730М, ГеФорце ГТ 640М, ГеФорце ГТ 640М ЛЕ, ГеФорце ГТ 735М, ГеФорце ГТ 730М, Qуадро К5000, Qуадро К4000, Qуадро К2000, Qуадро К2000Д, Qуадро К600, Qуадро К500М, Тесла К10 |
3.5 | ГК110, ГК208 | ГеФорце ГТX ТИТАН, ГеФорце ГТX 780 Ти, ГеФорце ГТX 780, ГеФорце ГТ 640 (ГДДР5), Qуадро К6000, Тесла К40, Тесла К20x, Тесла К20 |
'*' - ОЕМ производи
Табела уређаја који подржавају платформу ЦУДА:[13]
|
|
|
Спецификације и својства верзија
[уреди | уреди извор]Подршка својства | ЦУДА цомпуте цапабилитy (верзија) | ||||||
---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.x | 3.0 | 3.5 | |
Целобројне атомске функције над 32-битним речима у глобалној меморији | Не | Да | |||||
атомицЕxцх() над 32-битним вредностима бројева са покретном тачком у глобалној меморији | |||||||
Целобројне атомске функције над 32-битним речима у дељеној меморији | Не | Да | |||||
атомицЕxцх() над 32-битним вредностима бројева са покретном тачком у дељеној меморији | |||||||
Целобројне атомске функције над 64-битним речима у глобалној меморији | |||||||
Wарп воте функције | |||||||
Операције над бројевима са покретном тачком двоструке прецизности | Не | Да | |||||
Атомске функције за обраду 64-битних целобројних вредности у дељеној меморији |
Не | Да | |||||
Атомске функција сабирања бројева са покретном тачком над 32-битним речима у дељеној меморији | |||||||
_баллот() | |||||||
_тхреадфенце_сyстем() | |||||||
_сyнцтхреадс_цоунт(), _сyнцтхреадс_анд(), _сyнцтхреадс_ор() | |||||||
Функције за површине | |||||||
3Д мрежа блокова нити | |||||||
Wарп функције | Не | Да | |||||
Фуннел схифт | Не | Да | |||||
Динамичка паралелност |
Техничке спецификације | ЦУДА цомпуте цапабилитy (верзија) | ||||||
---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.x | 3.0 | 3.5 | |
Максимална димензионалност мреже блока нити | 2 | 3 | |||||
Максимална x-, y-, или з-димензија мреже блока нити | 65535 | 231-1 | |||||
Максимална димензионалност блока нити | 3 | ||||||
Максимална x- или y-димензија блока | 512 | 1024 | |||||
Максимална з-димензија блока | 64 | ||||||
Максималан број нити по блоку | 512 | 1024 | |||||
Wарп величина | 32 | ||||||
Максималан број резидентних блокова по мултипроцесору | 8 | 16 | |||||
Максималан број резидентних нити по мултипроцесору | 768 | 1024 | 1536 | 2048 | |||
Број 32-битних регистара по мултипроцесору | 8 К | 16 К | 32 К | 64 К | |||
Максималан број 32-битних регистара по нити | 128 | 63 | 255 | ||||
Максимална количина дељене меморије по мултипроцесору | 16 КБ | 48 КБ | |||||
Количина локалне меморије по нити | 16 КБ | 512 КБ | |||||
Величина константне меморије | 64 КБ | ||||||
Величина кеша по мултипроцесору за константну меморију | 8 КБ | ||||||
Величина кеша по мултипроцесору за меморију текстура | Зависно од уређаја, између 6 КБ и 8 КБ | 12 КБ | Између 12 КБ и 48 КБ | ||||
Максимална ширина за референцу 1Д текстуре везане за ЦУДА низ | 8192 | 65536 | |||||
Максимална ширина за референцу 1Д текстуре везане за линеарну меморију | 227 | ||||||
Максимална ширина и број слојева за референцу 1Д слојевите текстуре | 8192 × 512 | 16384 × 2048 | |||||
Максимална висина и ширина за референцу 2Д текстуре везане за ЦУДА низ | 65536 × 32768 | 65536 × 65535 | |||||
Максимална висина и ширина за референцу 2Д текстуре везане за линеарну меморију | 65000 × 65000 | 65000 × 65000 | |||||
Максимална висина,ширина, и број слојева за референцу 2Д слојевите текстуре | 8192 × 8192 × 512 | 16384 × 16384 × 2048 | |||||
Максимална висина,ширина, и дубина за референцу 3Д текстуре везане за ЦУДА низ или линеарну меморију | 2048 × 2048 × 2048 | 4096 × 4096 × 4096 | |||||
Максимална ширина (и висина) за референцу цубемап текстуре | Н/А | 16384 | |||||
Максимална ширина (и висина) и број слојева за референцу цубемап слојевите текстуре | Н/А | 16384 × 2046 | |||||
Максималан број текстура које се могу везати за кернел | 128 | 256 | |||||
Максимална ширина референце 1Д површине везане за ЦУДА низ | Није подржано |
65536 | |||||
Максимална ширина и број слојева референце 1Д слојевите површине | 65536 × 2048 | ||||||
Максимална ширина и висина за референцу 2Д површине везане за ЦУДА низ | 65536 × 32768 | ||||||
Максимална ширина, висина, и број слојева референце 2Д слојевите површине | 65536 × 32768 × 2048 | ||||||
Максимална ширина, висина, и дубина референце 3Д површине везане за ЦУДА низ | 65536 × 32768 × 2048 | ||||||
Максимална ширина (и висина) референце за цубемап површину везану за ЦУДА низ | 32768 | ||||||
Максимална ширина (и висина) и број слојева референце за цубемап слојевиту површину | 32768 × 2046 | ||||||
Максималан број површина које се могу повезати у кернелу | 8 | 16 | |||||
Максималан број инструкција по кернелу | 2 миллион | 512 миллион |
Спецификације архитектуре | ЦУДА цомпуте цапабилитy (верзија) | |||||||
---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.0 | 2.1 | 3.0 | 3.5 | |
Број језгара за функције које извршавају целобројну аритметику и аритметику са покретним зарезом | 8 | 32 | 48 | 192 | 192 | |||
Број јединица за филтрирање текстура по излазној рендеринг јединици | 2 | 4 | 8 | 32 | 32 | |||
Број wарп распоређивача | 1 | 2 | 2 | 4 | 4 | |||
Број инструкција издатих одједном од стране распоређивача | 1 | 1 | 2 | 2 | 2 |
Пример
[уреди | уреди извор]Пример кода у C++ који учитава текстуру из слике у низ на ГПУ:
texture<float, 2, cudaReadModeElementType> tex;
void foo()
{
cudaArray* cu_array;
// Alokacija niza
cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
cudaMallocArray(&cu_array, &description, width, height);
// Kopiranje podataka iz slike u niz
cudaMemcpyToArray(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice);
// Postavka parametara teksture
tex.addressMode[0] = cudaAddressModeClamp;
tex.addressMode[1] = cudaAddressModeClamp;
tex.filterMode = cudaFilterModePoint;
tex.normalized = false; // do not normalize coordinates
// Vežemo teksturu za niz
cudaBindTextureToArray(tex, cu_array);
// Izvršavamo kernel
dim3 blockDim(16, 16, 1);
dim3 gridDim((width + blockDim.x - 1)/ blockDim.x, (height + blockDim.y - 1) / blockDim.y, 1);
kernel<<< gridDim, blockDim, 0 >>>(d_data, height, width);
// Poništavamo vezu tekstura-niz
cudaUnbindTexture(tex);
} //end foo()
__global__ void kernel(float* odata, int height, int width)
{
unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
if (x < width && y < height) {
float c = tex2D(tex, x, y);
odata[y*width+x] = c;
}
}
Тренутна и будућа употреба ЦУДА платформе
[уреди | уреди извор]- Убрзано приказивање 3Д графике
- Убрзана конверзија формата видео фајлова
- Убрзана енкрипција, декрипција и компресија
- Израчунавања у биологији
- Симулације у физици, нарочито код динамике флуида.
- Дистрибуирана обрада
Референце
[уреди | уреди извор]- ^ „НВИДИА ЦУДА Хоме Паге”. Архивирано из оригинала 06. 01. 2014. г. Приступљено 05. 01. 2014.
- ^ ЦУДА ЛЛВМ Цомпилер
- ^ ДирецтЦомпуте Оцеан Демо Руннинг он Нвидиа ЦУДА-енаблед ГПУ на сајту YouTube
- ^ Гиоргос Василиадис; Спирос Антонатос; Мицхалис Полyцхронакис; Евангелос П. Маркатос; Сотирис Иоаннидис (2008). „Гнорт: Хигх Перформанце Нетwорк Интрусион Детецтион Усинг Грапхицс Процессорс” (ПДФ). Процеедингс оф тхе 11тх Интернатионал Сyмпосиум он Рецент Адванцес ин Интрусион Детецтион (РАИД). Бостон, МА, УСА.
- ^ Сцхатз, M.C.; Трапнелл, C.; Делцхер, А.L.; Варсхнеy, А. (2007). „Хигх-тхроугхпут сеqуенце алигнмент усинг Грапхицс Процессинг Унитс”. БМЦ Биоинформатицс. 8:474: 474. ПМЦ 2222658 . ПМИД 18070356. дои:10.1186/1471-2105-8-474.
- ^ Пyрит – Гоогле Цоде http://code.google.com/p/pyrit/
- ^ Усе yоур Нвидиа ГПУ фор сциентифиц цомпутинг Архивирано на сајту Wayback Machine (28. децембар 2008), BOINC official site (December 18, 2008)
- ^ „Nvidia CUDA Software Development Kit (CUDA SDK) – Release Notes Version 2.0 for MAC OSX”. Архивирано из оригинала 06. 01. 2009. г. Приступљено 5. 01. 2014.
- ^ Silberstein, Mark; Schuster, Assaf; Geiger, Dan; Patney, Anjul; Owens, John D. (2008). „Proceedings of the 22nd annual international conference on Supercomputing - ICS; chapter: Efficient computation of sum-products on GPUs through software-managed cache'08”: 309—318. ISBN 978-1-60558-158-3. doi:10.1145/1375527.1375572.
- ^ NVCC forces c++ compilation of .cu files
- ^ C++ keywords on CUDA C code
- ^ а б „CUDA-Enabled Products”. CUDA Zone. Nvidia Corporation. Приступљено 3. 11. 2008.
- ^ CUDA and double precision floating point numbers
Spoljašnje veze
[уреди | уреди извор]