2011-11-16 13 views
7

Rozważamy przeniesienie aplikacji z dedykowanego układu przetwarzania cyfrowego sygnału do uruchomienia na ogólnym sprzęcie x86. Aplikacja wykonuje wiele przekształceń Fouriera i na podstawie krótkich badań wydaje się, że FFT są dość dobrze przystosowane do obliczeń na GPU, a nie na CPU. Na przykład, ta strona ma pewne odniesienia z Core 2 Quad i GF 8800 GTX, które wskazują na spadek 10-krotnie w czasie obliczeń przy użyciu GPU:Czy warto odciążyć obliczenia FFT na osadzonym GPU?

http://www.cv.nrao.edu/~pdemores/gpu/

Jednak w naszych produktów, ograniczeń wielkości ogranicz nas do małych form, takich jak PC104 lub Mini-ITX, a więc do raczej ograniczonych wbudowanych procesorów graficznych.

Czy odciąć procesorowi GPU coś, co warto robić tylko z mięsistymi kartami graficznymi na właściwej magistrali PCIe, czy nawet wbudowane procesory graficzne oferują poprawę wydajności?

+0

Nie sądzę, że te tablice są już ograniczone; nie [jeśli mają na przykład Sandybridge i7] (http://www.silentpcreview.com/zotac-h67itx) – sehe

+0

@musiem, że obsługa Mini-ITX (a nawet PC104) ma modele obsługujące najnowsze procesory , moje pytanie brzmi, czy ich na pokładzie * G * PUs warto martwić się. Mini-ITX często dostarcza gniazdo PCIe, ale rozmiar naszego produktu ogranicza moduł przetwarzania do pojedynczej płytki o mniej więcej rozmiarze Mini-ITX i nie pozwala nam na dodanie dodatkowej karty graficznej wystającej z płyty głównej. –

+0

Jak duże są twoje FFT? Czy twój algorytm pozwala ci robić to w "trybie wsadowym", gdzie obliczysz wiele z nich (wszystkie tego samego rozmiaru) w tym samym czasie? –

Odpowiedz

2

Model 8800 ma około 100 rdzeni pracujących z częstotliwością około pół GHz. Nie sądzę, aby którykolwiek z obecnie wbudowanych procesorów graficznych dla małych elementów miał jakikolwiek inny obszar niż tyle rdzeni shaderów/obliczeniowych.

5

Należy porównać koszt przeniesienia danych do pamięci GPU i od niej, a także dowolną korzyść wynikającą z prędkości korzystania z GPU. Chociaż możliwe jest nałożenie na siebie operacji We/Wy i obliczeń, możesz nadal cierpieć, jeśli wymagania dotyczące przepustowości we/wy są większe niż przepustowość obliczeniowa. Jeśli masz jakieś dodatkowe obliczenia, które można wykonać na danych FFT, gdy jest on rezydentny w pamięci GPU, może to pomóc złagodzić koszty We/Wy.

Należy również zauważyć, że FFT oparte na GPU zwykle zapewniają dobrą wydajność danych pojedynczej precyzji. Ponadto musisz porównać z najlepszą możliwą opartą na procesorze FFT, np. FFTW zbudowany dla pojedynczej precyzji i przy użyciu SSE.

1

Jednym z problemów może być uzyskanie informacji technicznych potrzebnych do załadowania i uruchomienia kodu na GPU oraz komunikacji i wymiany danych z procesorem. Nvidia udostępnia interfejs API o nazwie CUDA specjalnie do tego celu. Wybierz więc kartę z procesorem graficznym Nvidia obsługującym CUDA i prawdopodobnie możesz eksperymentować i porównywać po bardzo niskich kosztach, a nawet prototyp na zwykłym komputerze stacjonarnym.

W odniesieniu do sprzętu o małej obudowie może być istotne znaczenie dla urządzenia this discussion.

6

Po opracowaniu procedur FFT zarówno na sprzęcie x86, jak i na procesorach graficznych (przed CUDA, 7800 GTX Hardware) odnalazłem z moich własnych wyników, że przy mniejszych rozmiarach FFT (poniżej 2^13) procesor był szybszy. Powyżej tych rozmiarów procesor graficzny był szybszy. Na przykład, FFT 2^16 obliczył 2-4x szybciej na GPU niż równoważne przekształcenie na CPU. Zobacz tabelę czasów poniżej (Wszystkie czasy są podane w sekundach, porównując 3GHz Pentium 4 z 7800GTX.) Ta praca została wykonana w 2005 roku, więc stary sprzęt i jak powiedziałem, bez CUDA Nowsze biblioteki mogą pokazywać większe ulepszenia)

 
N  FFTw (s) GPUFFT (s) GPUFFT MFLOPS GPUFFT Speedup 
8  0   0.00006  3.352705  0.006881 
16  0.000001 0.000065 7.882117  0.010217 
32  0.000001 0.000075 17.10887  0.014695 
64  0.000002 0.000085 36.080118  0.026744 
128  0.000004 0.000093 76.724324  0.040122 
256  0.000007 0.000107 153.739856  0.066754 
512  0.000015 0.000115 320.200892  0.134614 
1024 0.000034 0.000125 657.735381  0.270512 
2048 0.000076 0.000156 1155.151507  0.484331 
4096 0.000173 0.000215 1834.212989  0.804558 
8192 0.000483 0.00032  2664.042421  1.510011 
16384 0.001363 0.000605 3035.4551  2.255411 
32768 0.003168 0.00114  3450.455808  2.780041 
65536 0.008694 0.002464 3404.628083  3.528726 
131072 0.015363 0.005027 3545.850483  3.05604 
262144 0.033223 0.012513 3016.885246  2.655183 
524288 0.072918 0.025879 3079.443664  2.817667 
1048576 0.173043 0.076537 2192.056517  2.260904 
2097152 0.331553 0.157427 2238.01491  2.106081 
4194304 0.801544 0.430518 1715.573229  1.861814 

Jak sugerują inne plakaty, transfer danych do/z GPU jest hitem, który bierzesz. Mniejsze FFT mogą być wykonywane na CPU, niektóre implementacje/rozmiary całkowicie w pamięci podręcznej. To sprawia, że ​​procesor jest najlepszym wyborem dla małych FFT (poniżej ~ 1024 punktów). Jeśli z drugiej strony musisz wykonywać duże partie pracy na danych przy minimalnych ruchach do/z GPU, wtedy GPU pokona procesor CPU.

Proponuję użyć FFTW, jeśli chcesz szybką implementację FFT lub bibliotekę matematyki Intel, jeśli chcesz jeszcze szybszą (komercyjną) implementację. W przypadku FFTW wykonywanie planów przy użyciu flagi FFTW_Measure będzie mierzyć i testować najszybszą możliwą procedurę FFT dla określonego sprzętu.Zajmę się szczegółami na ten temat w this question.

W przypadku implementacji GPU nie można uzyskać lepszej wersji niż wersja NVIDIA CUDA. Wydajność procesorów graficznych znacznie się zwiększyła od czasu moich eksperymentów na 7800GTX, więc sugerowałbym, aby ich SDK spełniał określone wymagania.

+0

chociaż odpowiedź jest świetna, wydaje się nieaktualna. czy kiedykolwiek porównywałeś urządzenia mobilne nowej generacji, w których pamięć jest udostępniana gpu dla FFT? (edytuj: nie mam na myśli tylko telefonów lub tabletów, gdy pisałem telefon komórkowy, ale także nowe urządzenia, itp.) – emrahgunduz

+1

Tak, to było ponad 10 lat temu zrobiłem to. Dzisiejszy GPus ma znacznie szybszą przepustowość do przenoszenia z pamięci głównej do pamięci GPU, ale podobnie procesory i pamięć podręczna są znacznie szybsze. Nie testowałem tego, ale wyobrażam sobie, że podobne problemy istnieją dzisiaj: mniejsze zbiory danych będą szybciej obliczać w C++ zoptymalizowanym pod kątem SIMD, większe zbiory szybciej na GPu. Dokładnie tam, gdzie jest linia? To jest kwestia testowania! –

1

Chciałbym dodać na twoje pytanie konkretnie wbudowane procesory graficzne.

Zasadniczo mają one niewiele rdzeni shaderów, mniejsze rejestry dla rdzeni i mniejszą przepustowość pamięci w porównaniu do wysokiej klasy procesorów graficznych widocznych na komputerach. Jednak uruchamianie aplikacji podobnych do FFT na osadzonym GPU może dać lepszą wydajność w porównaniu do wbudowanego procesora wielordzeniowego [1]. Główną zaletą wbudowanych procesorów graficznych jest to, że dzielą wspólną pamięć z procesorem, dzięki czemu unika się procesu kopiowania pamięci z hosta do urządzenia.

Prawie wszystkie wbudowane procesory graficzne, takie jak Mali z ARM, adreno z Qualcomm, obsługują OpenCL, więc wykorzystanie biblioteki OpenCL do FFT na osadzonym GPU może dać lepszą wydajność (clFFT z AMD jest dobrze znany i opensource). Tuning kod OpenCL dla osadzonych architektury GPU może zrobić to lepiej. (Patrz ARM Mali-T600 Series GPU OpenCL Developer Guide na http://infocenter.arm.com)

[1] Arian Maghazeh, Unmesh, Bordoloi Petru, Eles Peng. Ogólne Zastosowanie Obliczenia na procesorach GPU o małej mocy: Czy to jest Przyjdź wieku?