2014-05-06 13 views
11

Używam CUDA 6.0 i implementacji OpenCL, która jest dołączona do zestawu SDK CUDA. Mam dwie identyczne jądra dla każdej platformy (różnią się one od słów kluczowych związanych z platformą). Czytają i zapisują pamięć globalną, każdy wątek ma inną lokalizację. Konfiguracja uruchamiania dla CUDA to 200 blocks of 250 threads (1D), która odpowiada bezpośrednio konfiguracji OpenCL - 50,000 global work size and 250 local work size.Porównanie CUDA vs OpenCL

Kod OpenCL działa szybciej. Czy to jest możliwe, czy też mam na to czas? Rozumiem, że implementacja OpenCL firmy NVIDIA opiera się na implementacji CUDA. Osiągam około 15% lepszą wydajność dzięki OpenCL.

Byłoby wspaniale, gdybyś mógł zasugerować, dlaczego widzę to i być może pewne różnice między CUDA i OpenCL implementowane przez NVIDIA?

+0

Wyniki nie są spójne we wszystkich problemach i przypadkach. Ale twój może mieć rację. OpenCL działa domyślnie asynchronicznie, więc jeśli użyjesz CUDA takim, jakim jest (nie asynchronicznym), prawdopodobnie spowoduje to nieco wolniejszą wydajność niż OpenCL. – DarkZeros

+0

Słyszałem już, że wdrożenie OCL nVIDII oparte jest na CUDA. Jednak za każdym razem, gdy próbowałem znaleźć jakieś źródła, nigdy nie znalazłem żadnych dowodów na to. Doszedłem do wniosku, że jest to błąd oparty na tym, że CUDA jest błędnie używana jako nazwa języka, podczas gdy w rzeczywistości jest to "równoległa platforma obliczeniowa i model programowania" (Compute Unified Device Architecture) według Wikipedii. Stąd, gdy zobaczysz slajd z NVIDII pokazujący, że w OCL jest coś takiego jak CUDA, czyli GPU, który jest chipem CUDA. Czy możesz opublikować źródło, jeśli je posiadasz? Chciałbym wiedzieć na pewno. – CaptainObvious

+1

OpenCL i CUDA są zupełnie inne. Obaj używają tego samego HW na końcu. Ale tak jak OpenGL i DirectX, jeden nie jest pod innym lub viceversa. Główne punkty do stwierdzenia, że ​​biblioteki są różne, kompilatory są różne, a model wykonania jest inny. Niektóre części mogą być powszechne, ale większość nie. – DarkZeros

Odpowiedz

13

Jądra wykonywane na nowoczesnym GPU prawie nigdy nie są obliczane i prawie zawsze są związane z przepustowością pamięci. (Ponieważ jest tak wiele rdzeni obliczeniowych działających w porównaniu do dostępnej ścieżki do pamięci.)

Oznacza to, że wydajność danego jądra zwykle zależy w dużej mierze od wzorców dostępu do pamięci wyświetlanych przez dany algorytm.

W praktyce sprawia to, że bardzo trudno jest przewidzieć (lub nawet zrozumieć), jakiego działania należy oczekiwać z wyprzedzeniem.

Obserwowane różnice wynikają prawdopodobnie z subtelnych różnic w wzorcach dostępu do pamięci pomiędzy dwoma jądrami, które wynikają z różnych optymalizacji dokonanych przez pakiet narzędzi OpenCL vs CUDA.

Aby dowiedzieć się, jak zoptymalizować jądro procesora graficznego, warto zapoznać się ze szczegółami dostępnego sprzętu do buforowania pamięci i jak z niego korzystać, aby jak najlepiej wykorzystać. (np. strategiczne wykorzystanie "lokalnych" pamięci podręcznych vs zawsze bezpośrednio do "globalnej" pamięci w OpenCL.)

Powiązane problemy