Z czego nauczyć się używać OpenCL?

0

Witam
Mam zrealizować problem porównywania wartości kilku tablic z pewną tablicą wzorcową. Zadanie mam rozwiązać na 2 sposoby, przy urzyciu C/C++ lub CUDA'y oraz właśnie OpenCL.
Problemem niesttey jest to że wszędzie widzę tylko jak zacząć pracę z OpenCL'em a nigdzie jakiegoś kursu obszerniejszego do tej biblioteki. Czy ktoś zna jakiś dobry tutorial??
Oczywiście w językach polskim lub angielskim jedynie.

0

Oficjalne PDFy + dokumentacja producenta karty graficznej.

0

Oficjalne PDFy? a skąd je wziąć? Ciężko mi było sie połapać na stronie grupy Khronos
a jak już zauważyłem tam coś interesującego to okazało się, że to był PDF tłumaczący bardziej zasadę działania OpenCL.

0

Ja mam u siebie takie pliki i z nich korzystałem:
AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide-rev-2.7.pdf
AMD_OpenCL_Programming_Optimization_Guide.pdf
AMD_OpenCL_Programming_User_Guide.pdf
GCN_Architecture_whitepaper.pdf
opencl-1.0.pdf
opencl-1.1.pdf
opencl-1.2.pdf
opencl-1.2-extensions.pdf
opencl-2.0.pdf
opencl-2.0-extensions.pdf
opencl-2.0-openclc.pdf
OpenCL-1.2-refcard.pdf
OpenCL-2.0-refcard.pdf

Te PDFy od AMD bardzo dużo mi pomogły ze zrozumieniem działania OpenCLa na ich kartach graficznych.

Do tego mam SDK od AMD, a w nim masę przykładów do przerabiania. Jeśli twoje zadanie jest dość proste to najlepiej właśnie przerobić jakiegoś gotowca, zamiast wszystko przerabiać od podstaw.

0

Jest to proste zadanie
porównanie 2ch tablic i wypisanie ile elementów się pokrywa w tych dwóch tablicach.

0

To weź najprostszy przykład ze zliczaniem sumy elementów w tablicy i zamiast jednej tablicy podaj dwie i sumuj wyniki porównań. Potrafisz znaleźć przykład na sumowanie tablicy w OpenCL i go odpalić u siebie?

0

Na razie nie. Poza tym nie wiem gdzie te przykłady znaleźć? w visualu? czy platformy mają własne kompilatory i przykłady gdzieś poukrywane?
obecnie mam pakiet deweloperski NVIDII

1

Chyba niczego nie przeczytałeś o OpenCLu. OpenCL działa jako biblioteka, tak jak np OpenGL. Tak samo jak OpenGLowe programy możesz pisać w dowolnym języku mającym bindingi do OpenGLa, tak samo możesz w OpenCLu. Shadery OpenGLowe podawane są bibliotece jako ciągi znaków i (uwaga niespodzianka!) kernele (czyli wprost odpowiedniki shaderów) też są podawane OpenCLowi jako ciągi znaków. Kompilacja odbywa się na komputerze użytkownika z użyciem sterownika OpenCL (analogicznie - shadery są kompilowane na komputerze użytkownika z użyciem sterownika OpenGL).

Przykłady są w SDK. Nie mam sprzętu nVidii więc jej pakietu nie ściągałem. Kilka sekund szukania w Google daje nawet taki wynik: https://developer.nvidia.com/opencl a tam jest bardzo prosty przykład o nazwie OpenCL Vector Addition. Jest to bardzo proste sumowanie dwóch tablic do trzeciej tablicy (a'la for (i = 0; i < n; i++) c[i] = a[i] + b[i]). Zobacz czy uda ci się to odpalić.

Później opisz dokładnie zadanie, bo opis typu:

Mam zrealizować problem porównywania wartości kilku tablic z pewną tablicą wzorcową.

niewiele mówi. Porównywanie elementów nie daje efektów ubocznych, więc robienie porównania dla samego porównania nie ma sensu. Trzeba potem coś z tym zrobić. Może policzyć ilość par z niejednakowymi elementami? Szklanej kuli nie mam.

0

Zatem zadanie wygląda tak. Mam tablicę wzorcową [x][x][4] (x - dowolna wartość, 4 ponieważ mają być 4 kanały R,G,B,A) ta tablica początkowo zapełniona jest wartościami 0 1. Mam również kilka tablic o takich samych wymiarach wypełnionych również wartościami 0 1 i w tym momencie mam porównać ile elementów tych tablic pokrywa się z wartościami tablicy wzorcowej z podziałem na kanały.
Kanały są stąd ze miało być to zadanie porównywania obrazów ale prowaszący zmienił na tablice gdzie jedna komórka zawiera wartości opisujące jeden pixel. Dla uproszczenia można było zamienić 255 na 1 bo to żadna zmiana w kodzie.
Np.

tablica_wzorcowa[2][2][4]={{{1,1,1,1}{0,0,0,0}}
                                        {{0,1,0,1}{1,0,1,0}}} 
tab1[2][2][4]={{{1,0,1,0}{0,1,0,1}}
                      {{0,1,0,1}{1,0,1,0}}}

i teraz porównuję czy element pierwszy tab1 jest taki sam jak el wzorcowy, jeśli tak to inkrementuję zmienną wynikową danego kanału jeśli nie to nic nie robię porównuję następny element
Wynikiem są wartości zmiennej wynikowej po wykonaniu porównań. Oczywiście zmienna wynikowa dotyczy tylko jednej tablicy porównywanej
czyli w przypadku gdy będę miał 5 tablic + jedna wzorcową to tych zmiennych powinno być 5 (ewentualnie tablica by nie bawić się w gromadzenie zmiennych)
Wynik przykładu powyżej to {4,2,4,2}.

Zadanie mam zrealizować albo poprzez porównanie czasu jego wykonania dla CPU (C/C++) i GPU (OpenCL) albo mam mierzyć czas wykonania gop na GPU ale raz kodem w CUDA a raz w OpenCL.

Jeżeli jest to pogmatwane to przepraszam ale sam wykładowca przekazał nam tą treść jeszcze gorzej tak ze przez kilka tyg nikt nie wiedział o co tak na prawdę chodzi.

Dziękuję za stronę z przykładami. Wiem że OpenCL jest biblioteką tak jak OpenGL ort! że OpenGL ma wszędzie tutoriale itp a OpenCL jest traktowany tak trochę na odwal się i są tutorialę jak zacząć, a potem radź sobie sam niestety a po tamtych tutorialach ja nadal niewiele umiem, poza przeklepaniem kodu ze strony a nie o to mi chodzi. By się czegoś nauczyć trzeba to zrozumieć a tamto mi w tym nie pomogło

`dodanie znaczników i ``` - @furious programming

0

Czyli wynikiem ma być czteroelementowy wektor/ tablica?

Moim pomysłem na w miarę efektywne, a zarazem banalnie proste rozwiązanie w OpenCLu na GPGPU byłoby:

  1. Zamiana pikseli na wektory z wynikami porównań, czyli 0 lub 1.
  2. Sumowanie hierarchiczne.
    Sumowanie hierarchiczne czyli wieloprzebiegowe, a w każdym przebiegu każdy work item sumuje 100 wektorów i wypluwa jednego. Czyli po pierwszym przebiegu zostaje 100x mniej elementów do zsumowania, w kolejnym znowu 100x mniej, itd aż zostanie jeden element (wynikowy wektor).

Najpierw jednak musisz odpalić jakiś przykład, spróbować z nim coś podmienić i odpalić taki zmieniony. Dokumentacja w SDK powinna być wystarczająca by zrozumieć jak należy skompilować i odpalić OpenCLowego hello worlda.

0

Dokładnie tak. Wynikiem ma być czteroelementowa tablica.

Nie rozumiem twojego pomysłu. Zgodnie z zadaniem porównywanie ma być realizowane na GPU.

0

No to był przepis na GPU. Chodziło mi o to, żeby zwiększyć ilość work-itemów. Jeśli będzie tylko jeden to wydajność będzie mega niska. GPU ma bardzo niską wydajność jednowątkową, dlatego wątków musisz odpalić tysiące naraz, by uzyskać dobre wykorzystanie sprzętu.

0

To wiem. Tylko jak to zrealizować.
Wybacz, że tak męczę, ale trochę tego nie rozumiem i stąd ta masa pytań.

1

Jeśli jeden work-item będzie sumował 100 elementów to wtedy work-itemów będzie 100x mniej niż elementów do zsumowania. Czyli jeśli np elementów do zsumowania będzie 100 tysięcy to work-itemów będzie tysiąc, a to już będzie wystarczająco dużo by karta pokazała pazur. Można też zmniejszyć współczynnik, np do 10x by wątków było jeszcze więcej, ale jeśli zmniejszy się zbyt mocno to z drugiej strony będzie więcej roboty do wykonania co może w praktyce wydłużyć cały proces sumowania.

Jak zrealizować? Prosto. Masz dwa kernele:

  • jeden do zamiany pikseli na wektory z wynikami porównań,
  • drugi do częściowego sumowania wektorów,
    Odpalasz pierwszy jedokrotnie, a drugi dopóki zostaje coś do zsumowania.

Czyli np jeśli na wejściu masz 123456 pikseli to:

  • odpalasz pierwszy kernel i dostajesz 123456 wektorów,
  • odpalasz drugi kernel i dostajesz ceil(123456 / 100) = 1235 wektorów,
  • odpalasz drugi kernel i dostajesz ceil(1235 / 100) = 13 wektorów,
  • odpalasz drugi kernel i dostajesz ceil(13 / 100) = 1 wektor,
  • voila - masz wektor z sumą,
0

Mam pewien problem. W swoim laptopie, na którym piszę program o którym mowa w moim temacie na forum, uruchamiam program z tutorialu:
https://holisz.pl/opencl-tutorial-czesc-2-listowanie-dostepnych-urzadzen/
Wynikiem działania tego programu jest:

 Platform: 0
Name: Intel(R) OpenCL
Vendor: Intel(R) Corporation
 
No OpenCL devices found on platform 0.

I tylko tyle a to dziwne ponieważ mam w menedżerze urządzeń 2 karty:
Intel(R) HD Graphics
NVIDIA GeForce GT 330M.

W tym momencie nie wiem co mam zrobić ponieważ projekt mam ukończyć na czwartek i w czwartek mam go oddać, to ostateczny termin.

0

Możliwe, że twój sprzęt po prostu nie obsługuje OpenCLa, bądź producenci nie zadbali o wsparcie w sterownikach.

Na tej liście https://www.khronos.org/conformance/adopters/conformant-products/ nie znalazłem GT 330M, ale to jest trochę dziwne - gorsze karty mają wsparcie, więc może coś przeoczyli w tej liście.
Z tej listy http://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units wynika, że integry Intela obsługują OpenCL dopiero od 2012 roku.

Możliwe, że sterowniki od nVidii masz niezainstalowane lub źle zainstalowane (tzn bez wsparcia dla OpenCL).

Ewentualnie poszukaj sterownika OpenCL Intela dla CPU i na nim popróbuj, a jak będziesz miał odpowiedni sprzęt lub coś zaskoczy i będziesz miał OpenCLa na GPU to wtedy odpalisz na GPU.

0

Już to robiłem :-/ nic to nie dało. Efekt taki sam :-(

0

Spróbuj zainstalować AMD APP SDK (zawiera sterownik OpenCL do CPU) i/ lub sterownik OpenCL Intela do CPU.

0

Poza tym, nie wiedzieć czemu, ale sterowniki NVIDII ściągnięte ze strony NVIDII zawsze uważają, że nie ma na moim komputerze sprzętu dla którego są potrzebne, także mam sterowniki ściągnięte ze strony producenta laptopa (Acer).

0

Sterowniki nvidii są pod określony sprzęt (wybiera się przed wyszukaniem).
Najnowsze jakie znalazłem dla 330M to 341.44 (luty 2015).

0

Ależ wiem o tym, pobierałem zawsze sterowniki wyprodukowane dla danej karty graficznej i to nie zdawało egzaminu. Za każdym razem gdy ze strony NVIDII pobieram sterownik wyprodukowany dla mojej karty graficznej to za każdym razem otrzymuję komunikat że nie ma urządzenia które wymagałoby tego sterownika i tyle.

Chyba, że aktualizacja sterownika przy pomocy opcji aktualizuj sterownik w menedżerze urządzeń zainstaluje mi ten sterownik, ale jakoś nie mam co do tego zaufania, parę razy mocno namieszało mi to w systemie.

`zamiana znaczników na ``` - @furious programming

0

Spróbuj starszej wersji. Sterowniki od producenta kompa mogą nie zawierać OpenCL.

0

Próbuję tak od 2011 roku z każdym nowym sterownikiem który wychodzi.
Laptopa mam od 2009-2010 nie pamiętam dokładnie

0

Ta karta na pewno wspiera OpenCL, mam identyczna w lapku (samsung r580). Musisz cos ze sterownikami pokombinowac

0

Tylko skąd je zdobyć jak oryginalne ze strony NVIDII nie widzą karty graficznej?

1

Szczerze mowiac - nie wiem. Bawilem sie tym dobrych pare lat temu, wieczorem moge sprawdzic jaka wersje sterownikow mam u siebie, ale z tego co pamietam to nie robilem jakichs cudów ze sterownikami

0

Byłbym bardzo wdzięczny bo powoli mnie to przerasta.
Próbowałem pobierać sterowniki ze strony NVIDII, próbowałem z programami do aktualizacji sterowników ale za każdym razem efekt taki sam :/

0

A jesteś pewny że ta karta jest aktywna?
Może coś się w międzyczasie przestawiło i pracujesz na zintegrowanej?

Próbowałeś tego SDK-a od AMD?
http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/
ponoć działa na Intel / nvidia.

Próbowałeś emulatora OpenCL?
http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-emulator-debugger/

Próbowałeś testera OpenCL od nvidii?
patrz "OpenCL Device Query" z: https://developer.nvidia.com/opencl

Próbowałeś "GPU Caps Viewer"?
http://ozone3d.net/gpu_caps_viewer/

0

Nie próbowałem tych programów.

Jak sprawdzić czy karta jest aktywna?

Program "CPU Caps Viewer" wyświetla mi obie karty grafiecze ale informuje że nie obsługują OpenCL, jedyne urządzenie obsługujące opencla jest to mój procesor (Incel Core i5)

0

Instalowałeś sterowniki OpenCL dla CPU od Intela? Są tutaj (5 sekund szukania w Google): https://software.intel.com/en-us/articles/opencl-drivers#win64

1 użytkowników online, w tym zalogowanych: 0, gości: 1