ОпенЦЛ

С Википедије, слободне енциклопедије
ОпенЦЛ

ОпенЦЛ (енгл. Open Computing Language) је програмски оквир за писање програма који се извршавају на хетерогеним платформама сачињеним од ЦПУ, ГПУ, процесора за обраду дигиталних сигнала, ФПГА и других процесора. ОпенЦЛ садржи језик за писање кернела (функције која се извршава на ОпенЦЛ уређајима), плус АПИ који се користи за дефинисање и контролу платформе. ОпенЦЛ пружа паралелну обраду преко паралелизма задатака и паралелизма података. ОпенЦЛ је стандард који одржава Кхронос Гроуп. Касније је усвојен од стране компанија попут Аппле, Интел, Qуалцомм, АМД, Нвидиа, Самсунг.


Историја[уреди | уреди извор]

ОпенЦЛ је развијен од стране Apple-а у сарадњи са техничким тимовима из АМД, ИБМ, Qуалцомм, Интел, и НВИДИА компанија. Аппле је предложио иницијалну спецификацију Кхронос групи. 16. Јуна 2008. формирана је тзв. Кхронос Цомпуте Wоркинг група[1] са представницима из компанија за производњу ЦПУ, ГПУ, уграђених система и софтвера. Ова група је радила пет месеци да би 18. Новембра 2008. завршила техничке детаље за спецификацију ОпенЦЛ 1.0. .[2] Ове техничке спецификације су прегледане од стране чланова Кхронос-а и допуштено је издавање у јавност 8. Децембра 2008. [3]

ОпенЦЛ 1.0[уреди | уреди извор]

ОпенЦЛ 1.0 је пуштен у јавност са излазком Мац ОС X Сноw Леопард оперативног система. АМД је одлучио да подржи ОпенЦЛ уместо Цлосе то Метал програмског оквира. [4][5]

9. Децембра 2008. Нвидиа је изјавила намеру да пружи пуну подршку за ОпенЦЛ 1.0 спецификацију за ГПУ које производе. [6] 30. Октобра 2009. ИБМ је издао прву имплементацију ОпенЦЛ као део XL компајлера. [7]

ОпенЦЛ 1.1[уреди | уреди извор]

ОпенЦЛ 1.1 је потврђен 14. Јуна 2010. и додаје значајно побољшање у флексибилности паралелне обраде, функционалности и перформансама попут:

  • Нови типови података укључујући тро-компонентне векторе и додатне формате за слике;
  • Управљање наредбама од вишеструких хост нити и процесирање бафера преко више уређаја;
  • Операције над регијом бафера, читање, писање и копирање 1Д, 2Д или 3Д правоугаоне регије;
  • Побољшана употреба догађаја за вођење и контролу извршења наредби;

ОпенЦЛ 1.2[уреди | уреди извор]

Кхронос је најавио ОпенЦЛ 1.2 спецификације 15. Новембра 2011. ОпенЦЛ 1.2 додаје значајну функционалност у односу на претходне верзије, као и побољшање перформанси и новине за флексибилније паралелно програмирање. Најзначајније новине су:

  • Партиција уређаја: могућност да се изврши партиција уређаја на мање целине тако да се посао може доделити индивидуалним јединицама за обраду. Ово је корисно за резервисање подручија уређаја да би се смањило кашњење за послове код којих време игра кључну улогу;
  • Подељено компајлирање и линковање објеката: могућност да компајлирамо ОпенЦЛ у вањске библиотеке како би их користили у другим програмима;
  • Побољшана подршка за слике: 1.2 додаје подршку за 1Д и 1Д/2Д низове за рад са сликама;
  • Уграђени кернел: кернел може бити позван да користи специјалне аспекте хардвера. На пример, видео кодирање/декодирање и обрада дигиталних сигнала;
  • ДирецтX функционалност;

ОпенЦЛ 2.0[уреди | уреди извор]

У Јулу 2013. пуштене су привремене спецификације за ОпенЦЛ 2.0. [8] Додаци и новине које доноси ОпенЦЛ 2.0 чине:

  • Дељена виртуелна меморија;
  • Динамички паралелизам;
  • Генерички адресни простор;
  • Слике;
  • Цеви;
  • Екстензија за Андроид;

Имплементација[уреди | уреди извор]

ОпенЦЛ се састоји од скупа заглавља и дељених објеката који се учитавају за време извршавања. Клијент за учитавање драјвера (ИЦД лоадер) се мора инсталирати на платформи за сваку класу произвођача да би се омогућила подршка за извршавање ОпенЦЛ. На пример, да би се омогућила подршка за НВИДИА уређаје на Линуx платформи, НВИДИА ИЦД се мора инсталирати како би ОпенЦЛ током извршавања могао да пронађе ИЦД произвођача и преусмери позиве коректно. Сваки произвођач мора имплементирати сваки ОпенЦЛ позив у драјверу.[9]

ОпенЦЛ језик[уреди | уреди извор]

Програмски језик за писање извршног кернела се базира на Ц99 стандарду са неким ограничењима, као и додацима. Изостављени су показивачи на функције, рекурзија, поља битова, низови променљиве величине и стандардна Ц99 заглавља.[10] Језик је надограђен за једноставну употребу паралелизма са векторским типовима и операцијама, и синхронизацијом. [11] Поседује меморијске квалификаторе: __глобал, __лоцал, __цонстант, и __привате.

Пример: рачунање ФФТ[уреди | уреди извор]

Овај пример учитава имплементацију за рачунање брзе Фуријерове трансформације (ФФТ).

[12]

  context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);

  clGetDeviceIDs( NULL, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, NULL );
  queue = clCreateCommandQueue(context, device_id, 0, NULL);

  memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL);
  memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL);

  program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);

  clBuildProgram(program, 0, NULL, NULL, NULL, NULL);

  kernel = clCreateKernel(program, "fft1D_1024", NULL);

  clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);
  clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);
  clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL);
  clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL);

  global_work_size[0] = num_entries;
  local_work_size[0] = 64; //Nvidia: 192 or 256
  clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

Рачунање ФФТ-а: (засновано на Фиттинг ФФТ онто тхе Г80 Арцхитецтуре):[13]

  // Ovaj kernel računa FFT dužine 1024. 
  
  __kernel void fft1D_1024 (__global float2 *in, __global float2 *out,
                          __local float *sMemx, __local float *sMemy) {
    int tid = get_local_id(0);
    int blockIdx = get_group_id(0) * 1024 + tid;
    float2 data[16];

    in = in + blockIdx;  out = out + blockIdx;

    globalLoads(data, in, 64); 
    fftRadix16Pass(data);      
    twiddleFactorMul(data, tid, 1024, 0);

    localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));
    fftRadix16Pass(data);               
    twiddleFactorMul(data, tid, 64, 4); 

    localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));

    fftRadix4Pass(data);      
    fftRadix4Pass(data + 4);  
    fftRadix4Pass(data + 8);  
    fftRadix4Pass(data + 12); 

    globalStores(data, out, 64);
  }

ОпенЦЛ-сагласни производи[уреди | уреди извор]

ОпенЦЛ-сагласни продуцтс[14]
АМД АПП СДК (подржава ОпенЦЛ ЦПУ и АПУ(енг. Аццелератед Процессинг Унит) уређаје) X86 + ССЕ2 компактибилни ЦПУ 64-бит и 32-бит;[15] Линуx 2.6 ПЦ, Wиндоwс Виста/7 ПЦ АМД Фусион Е-350, Е-240, C-50, C-30 wитх ХД 6310/ХД 6250 АМД Радеон/Мобилитy ХД 6800, ХД 5x00 серија, иГПУ ХД 6310/ХД 6250 АТИ ФиреПро Вx800 серија
Интел СДК за ОпенЦЛ апликације 2013[16] (подржава Интел Цоре процесоре и Интел ХД Графику 4000/2500) Интел процесори са ССЕ (енг. Стреаминг СИМД Еxтенсионс) 4.1, ССЕ 4.2 или АВX (енг. Адванцед Вецтор Еxтенсионс) подршком.[17][18] Wиндоwс, Линуx Интел Цоре и7, и5, и3; Друга генерација Интел Цоре и7/5/3, Трећа генерација Интел Цоре процесора са Интел ХД Графиком 4000/2500 Интел Цоре 2 Соло, Дуо Qуад, Еxтреме Интел Xеон 7x00,5x00,3x00
ИБМ сервери са ОпенЦЛ СДК Архивирано на сајту Wayback Machine (9. август 2011) за Линуx на Поwер ВСX[19][20] ИБМ Поwер 755 (ПЕРЦС), 750 ИБМ БладеЦентер ПС70x Еxпресс ИБМ БладеЦентер ЈС2x, ЈС43 ИБМ БладеЦентер QС22
ИБМ ОпенЦЛ Цоммон Рунтиме (ОЦР) Архивирано на сајту Wayback Machine (14. јун 2011)

[21]

X86 + ССЕ2 компактибилни ЦПУ 64-бит и 32-бит;[22] Линуx 2.6 ПЦ АМД Фусион, Нвидиа Ион и Интел Цоре и7, и5, и3; Друга генерација Интел Цоре и7/5/3 АМД Радеон, Нвидиа ГеФорце и Интел Цоре 2 Соло, Дуо, Qуад, Еxтреме АТИ ФиреПро, Нвидиа Qуадро и Интел Xеон 7x00,5x00,3x00
Нвидиа ОпенЦЛ драјвери и алати[23] Нвидиа Тесла C/D/С Нвидиа ГеФорце ГТС/ГТ/ГТX Нвидиа Ион Нвидиа Qуадро ФX/НВX/Плеx

Физија уређаја[уреди | уреди извор]

Физија уређаја - уведена у ОпенЦЛ стандард са верзијом 1.2, допушта индивидуалним наредбама да се користе за специфичне области уређаја. На пример, помоћу Интел СДК можемо креирати упит за наредбу која се мапира директно на индивидуално језгро процесора. АМД такођер омогућава функционалност за физију уређаја преко екстензије. Физија уређаја се користи у облиастима где је потребан високи ниво поузданости.

Поређење са ЦУДА платформом[уреди | уреди извор]

Природно је да поредимо ОпенЦЛ са ЦУДА платформом. Иако се обе платформе могу извршавати на НВИДИА ГПУ, циљеви ЦУДА и ОпенЦЛ су различити. Дизајнерски, ЦУДА је ограничена на ГПУ које производи НВИДИА и директно је везана за платформу на којој се извршава. Кључна карактеристика ОпенЦЛ-а је преносивост преко апстрактне меморије и извршног модела, и програмер не може да користи директно технологије везане за ГПУ попут ПТX (енг. Параллел Тхреад Еxецутион) све док жели преносивост апликације.

Референце[уреди | уреди извор]

  1. ^ „Кхронос Лаунцхес Хетерогенеоус Цомпутинг Инитиативе” (Саопштење). Кхронос Гроуп. 16. 6. 2008. Архивирано из оригинала 20. 6. 2008. г. Приступљено 18. 6. 2008. 
  2. ^ „ОпенЦЛ гетс тоутед ин Теxас”. МацWорлд. 20. 11. 2008. Приступљено 12. 6. 2009. 
  3. ^ „Тхе Кхронос Гроуп Релеасес ОпенЦЛ 1.0 Специфицатион” (Саопштење). Кхронос Гроуп. 8. 12. 2008. Архивирано из оригинала 13. 7. 2010. г. Приступљено 12. 6. 2009. 
  4. ^ „АМД Дривес Адоптион оф Индустрy Стандардс ин ГПГПУ Софтwаре Девелопмент” (Саопштење). АМД. 6. 8. 2008. Приступљено 14. 8. 2008. 
  5. ^ „АМД Бацкс ОпенЦЛ, Мицрософт ДирецтX 11”. еWеек. 6. 8. 2008. Архивирано из оригинала 19. 03. 2012. г. Приступљено 14. 8. 2008. 
  6. ^ „Нвидиа Аддс ОпенЦЛ То Итс Индустрy Леадинг ГПУ Цомпутинг Тоолкит” (Саопштење). Нвидиа. 9. 12. 2008. Приступљено 10. 12. 2008. 
  7. ^ „ОпенЦЛ Девелопмент Кит фор Линуx он Поwер”. алпхаWоркс. 30. 10. 2009. Архивирано из оригинала 09. 08. 2011. г. Приступљено 30. 10. 2009. 
  8. ^ „Кхронос Релеасес ОпенЦЛ 2.0”. Кхронос Гроуп. 22. 7. 2013. Приступљено 9. 9. 2013. 
  9. ^ ОпенЦЛ ИЦД спецификација
  10. ^ АМД. Интродуцтион то ОпенЦЛ Программинг 201005 Архивирано на сајту Wayback Machine (16. мај 2011), page 89-90
  11. ^ AMD. Introduction to OpenCL Programming 201005, page 89-90
  12. ^ „OpenCL” (PDF). SIGGRAPH2008. 14. 8. 2008. Архивирано из оригинала (PDF) 19. 03. 2012. г. Приступљено 14. 8. 2008. 
  13. ^ „Fitting FFT onto G80 Architecture” (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. maj 2008. Приступљено 14. 11. 2008. 
  14. ^ „Conformant Products”. Приступљено 11. 8. 2011. 
  15. ^ „OpenCL and the AMD APP SDK”. AMD Developer Central. developer.amd.com. Архивирано из оригинала 6. 9. 2011. г. Приступљено 11. 8. 2011. 
  16. ^ „About Intel OpenCL SDK 1.1”. software.intel.com. intel.com. Приступљено 11. 8. 2011. 
  17. ^ „Product Support”. Приступљено 11. 8. 2011. 
  18. ^ „Intel OpenCL SDK - Release Notes”. Приступљено 11. 8. 2011. 
  19. ^ „Announcing OpenCL Development Kit for Linux on Power v0.3”. Приступљено 11. 8. 2011. 
  20. ^ „IBM releases OpenCL Development Kit for Linux on Power v0.3 - OpenCL 1.1 conformant release available”. OpenCL Lounge. ibm.com. Приступљено 11. 8. 2011. 
  21. ^ „IBM releases OpenCL Common Runtime for Linux on x86 Architecture”. Приступљено 10. 9. 2011. 
  22. ^ „OpenCL and the AMD APP SDK”. AMD Developer Central. developer.amd.com. Архивирано из оригинала 6. 9. 2011. г. Приступљено 10. 9. 2011. 
  23. ^ „Nvidia Releases OpenCL Driver”. Приступљено 11. 8. 2011. 

Spoljašnje veze[уреди | уреди извор]