Wydajność przetwarzania sporej ilości obrazów

0

Dane:
kolekcja(50~360 zdjęć) obrazów(nawet 4000x4000) do przetworzenia(odszumienia, interpolacja na 3d, segmentacja, itd).
technologia:
CUDA, lub OpenCL

Java z racji narzutu na jvm i automatycznego zwalniania obiektów(których w tym przypadku będzie dużo) będzie wolniejsza niż c++.

Pytanie tylko jakiej różnicy(5% czy może 50%) można się spodziewać?

0

Zależy jak dużo rzeczy będziesz wykonywał po stronie Javy i ile będzie wywołań JNI/ JNA. Jeśli Java będzie służyć generalnie do samego I/O i GUI to narzut powinien być znikomy.

0

Miałem na myśli całość kodu w danym języku.

0

cześć,
ostatnio właśnie pisałem program do obróbki obrazów w C++/OpenCl więc się wypowiem:
-jeśli masz wybór - wybierz dedykowany GeForcom CUDA (aktualnie technologia zapewnia większą wydajność niż "świeży" i uniwersalny OpenCl)
-mierząc czas samego przetwarzania obrazu(bez jego ladowania z dysku) - CUDA vs CPU da Ci nawet kilkudziesięciokrotne przyspieszenie (w zależności jaki masz sprzęt). Wynika to z : kilku(nasto) krotnie większej przepustowości pamięci video niż ram, zrównoleglenia obliczen do nawet kilkuset jednostek przetwarzania w GPU wobec 2-4 rdzeni CPU, z dedykowanej przetwarzaniu obrazów architekturze kart graficznych (np zoptymalizowanej pod kątem dostępu do danych w formacie RGBA).
Osobiście, na gf9500GS vs C2D T5550 w laptopie uzyskalem 3-5x przyspieszenie filtrowania obrazow na OpenCl (filtr gaussa 7x7)
pozdrawiam!

0

Są dwie możliwości:

  • czas przepychania danych do GPU jest znikomy: wtedy nie ma wielkiego znaczenia język który wypycha te dane na GPU,
  • przeciwny przypadek jest znowu mało sensowny - po co tracić czas na przepychanie danych po PCI-Express jeżeli obliczenia są krótkie?

Jeśli chodzi o CUDA i OpenCL to sprawa jest taka, że CUDA jest tylko na GeForce, a OpenCL jest na GeForce, Radeony, x86, PowerPC itd Wydajność OpenCL, przy odpalaniu na CPU, jest wyraźnie wyższa niż Javy przy tych samych algorytmach i generalnie niewiele ustępuje kodowi natywnemu kompilowanemu z setkami egzotycznych flag. Pisząc kod w OpenCL będzie go mógł odpalić ktoś kto posiada GPU niezdolne do odpalenia OpenCL'a - wtedy kodem zajmie się CPU.

Argumentem za CUDA jest spora liczba bibliotek, jeżeli OpenCLowi brakuje sporych bibliotek, które są w CUDA, a których nie masz zamiaru pisać to wybierz CUDA. W innym przypadku lepiej OpenCL.

0

Zwrócę jeszcze uwagę na jeden fakt odnośnie do OpenCl. Nie wszystkie funkcje OpenCl są emulowane przez CPU. Np funkcje dedykowane działające na teksturach (zapewniają duże przyspieszenie przy przetwarzaniu obrazów). Dlatego możliwe, że na sprzecie niezgodnym bedziesz musial zaimplementowac fallback'a w postaci normalnego kodu na CPU. To mi się właśnie przytrafiło...

1

A jaką masz wersję OpenCL'a dla CPU i dla GPU? Np w przypadku CPU Intela i GPU nVidii może być tak, że dla GPU masz sterowniki do OpenCL 1.1, a dla CPU stery tylko do OpenCL 1.0. Myślę, że braki w implementacjach są mało prawdopodobne - jeżeli coś np ma wspierać OpenCL 1.1 to ma wspierać w 100%, inaczej nie dostanie certyfikacji.

0

@Wibowit
wiesz, to jest nawet bardzo prawdopodobne, bo stery do procesora mialem z pakietu ati sdk, wiec troche namieszalem w systemie.

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