2011-12-30 14 views
15

Chociaż procesory graficzne mają być używane z typami zmiennoprzecinkowymi, byłbym zainteresowany, jak szybko GPU może przetwarzać operacje bitowe. Są one najszybsze na procesorze, ale czy GPU emuluje operacje bitowe lub czy są one w pełni obliczane na sprzęcie? Planuję użyć ich w programach cieniujących napisanych przy pomocy GLSL. Również przypuszczam, że jeśli operacje bitowe mają pełną wydajność, to powinny również istnieć typy danych liczb całkowitych, ale potrzebuję potwierdzenia tego.Wydajność operacji na liczbach całkowitych i bitowych na GPU

Aby być bardziej precyzyjnym, docelowymi wersjami są OpenGL 3.2 i GLSL 1.5. Sprzętem, który powinien to uruchomić, jest jakakolwiek karta graficzna Radeon HD i seria GeForce 8 i nowsza. Jeśli są jakieś poważne zmiany w nowszych wersjach OpenGL i GLSL związane z szybkościami przetwarzania bitowych operacji/liczb całkowitych, byłbym zadowolony, gdybyś " Wskaż je.

+0

Musisz podać konkretną architekturę GPU lub przynajmniej wersję OpenGL. W tej chwili to pytanie jest strasznie niejasne. –

+0

@BenVoigt zaktualizowany, czy jest on wystarczająco dokładny, czy potrzebujesz konkretnej nazwy kodowej architektury (zmieniają się tak jak w przypadku każdej nowej karty) – Raven

+0

Raven: Istnieje kilka ogromnych zmian między Radeonem HD 1xxx i HD 7xxx, ale ta dodatkowa informacja to duża poprawa. Zakładając, że patrzysz na karty, które reklamują obsługę OpenGL 3.2 (lub później), to prawdopodobnie wystarczająco jasne. –

Odpowiedz

8

To pytanie zostało częściowo odpowiedział Integer calculations on GPU

W krótkich nowoczesnych GPU mają równoważną skuteczność INT i FP dla danych 32-bitowych. Więc twoje logiczne operacje będą działać z tą samą prędkością.

Z perspektywy programowania stracisz wydajność, jeśli masz do czynienia z danymi całkowitymi SCALAR. Procesory graficzne, takie jak praca z operacjami PARALLEL i PACKED.

for(int i=0; i<LEN_VEC4; i++) 
    VEC4[i] = VEC4[i] * VEC4[i]; // (x,y,z,w) * (x,y,z,w) 

Jeśli robisz coś takiego ...

for(int i=0; i<LEN_VEC4; i++) 
    VEC4[i].w = (VEC4[i].x & 0xF0F0F0F0) | (VEC4[i].z^0x0F0F0F0F)^VEC4[i].w; 

... robi wiele różnych operacji na elementach tego samego wektora będzie napotkasz problemy z wydajnością.

+0

Dzięki za odpowiedź. W połączeniu z postem powiązanym jest to wystarczające, ale mam jeszcze jedno pytanie. Jak napisano, wydajność INT i FP powinna być taka sama. Ale nic nie przypomina operacji bitowych dla FP (a przynajmniej byłoby to dziwne). Więc co oni mówią, że są równi ... dodawanie i tak dalej? A jeśli tak jest, to operacje bitowe (na przykład przesuwanie) są szybsze niż operacje matematyczne (dodawanie ..) dla typów danych INT lub wydajność jest również równa. – Raven

+0

To, czy "przesunięcie bitowe w lewo o 1" jest szybsze niż "x + x", zależy od architektury. Mam nadzieję, że podczas kompilacji Shadara nastąpi pewna optymalizacja (chyba że napiszesz ją w zespole GPU). "X dzielenie przez 2" jest źródłem wolniejszym niż "X bit shift right 1" tylko dlatego, że w dzielenie jest więcej logiki niż zmiana bitowa. –

+3

"Procesory graficzne, takie jak praca z operacjami PARALLEL i PACKED." Najnowsze procesory graficzne NVidii i AMD to architektury skalarne. Tak więc wydajność operacji czysto skalarnych jest w rzeczywistości wyższa niż w przypadku operacji wektorowych. – datenwolf

Powiązane problemy