Programowanie współbieżne, Języki programowania, Aplikacje, Gry

CPU vs GPU: Architektura cz. 2

Kwiecień 1st, 2011 Marcin Borowiec

W poprzednim poście przedstawiłem różne sposoby zwielokrotniania jednostek obliczeniowych w procesorach. Dzisiaj opisze, z jakich jednostek obliczeniowych składają się popularne układy CPU. Ponieważ nie ma dużych różnic pomiędzy układami AMD i Intela opisze tylko jeden model procesora. Będzie to Intel Core i7-950, procesor ma 4 rdzenie, obsługuje technologię Hyper-threading i posiada obsługę instrukcji SSE w wersji 4.2.

Jako przykład specjalnie wybrałem wersję procesora z Hyper-threading. O tej technologii będę pisał dokładnie w kolejnych częściach. Dzisiaj wspomnę tylko jedną rzecz, która potrzebna jest do zrozumienia tego postu. Hyper-threading powoduje, że jeden rdzeń procesora jest w stanie obsłużyć dwa wątki sprzętowe w jednym momencie. Wątki są w pełni niezależne i z punktu widzenia podziału jednostek obliczeniowych z poprzedniego postu jeden rdzeń zawiera dwie jednostki typu MIMD. Mnożąc to razy ilość rdzeni otrzymujemy mini schemat procesora Intel Core i7-950:

Ten rysunek zakłada, że do operacji wykorzystujemy jedynie podstawowe instrukcje operujące na pojedynczych wartościach (całkowitych lub zmiennoprzecinkowych). Takie instrukcje wystarczają aby napisać dowolny program i pewien podzbiór programów używa tylko tych instrukcji. Opisywany procesor obsługuje także instrukcje SSE. Instrukcje te pozwalają na wykonywanie operacji na grupie spakowanych danych tworząc w ten sposób grupę jednostek typu SIMD. Ilość logicznych jednostek SIMD jest zależna od wielkości danych, na których operujemy. Ponieważ spakowane dane zajmują 128 bit to kombinacje jakie otrzymaliśmy to: 2 x 64 bit (całkowite lub zmiennoprzecinkowe), 4 x 32bit (całkowite lub zmiennoprzecinkowe), 8 x 16 bit (całkowite), 16 x 8 bit (całkowite). Na schemacie może to wyglądać tak:

W ten sposób otrzymujemy drzewo jednostek obliczeniowych. Procesor zawiera 8 jednostek MIMD z czego każda składa się z kilku jednostek SIMD. Oczywiście w danym momencie możemy np. na pierwszej jednostce MIMD korzystać ze zwykłych instrukcji na liczbach skalarnych podczas gdy na drugiej jednostce MIMD będziemy liczyć na wektorze czterech 32 bitowych liczb a na trzecim MIMD będziemy liczyć na wektorze dwóch 64bitowych liczb.

Procesory AMD działają bardzo podobnie. Jedyna różnica to taka, że otrzymujemy SSE w nieco uboższej trzeciej wersji i żaden z modeli produkowanych przez AMD nie posiada technologii Hyper-Threading. Pewną zmianą są natomiast procesory z drugiej generacji Intel Core i7 i Intel Core i5. Posiadają one zestaw nowych instrukcji o nazwie AVX. W stosunku do SSE różnią się przede wszystkim wielkością spakowanej liczby, która teraz wynosi 256bit co zwiększa dwukrotnie ilość logicznych jednostek SIMD dla danej wielkości liczb.

W kolejnym poście przedstawię budowę GPU Nvidi.