O niezwykłości tej konstrukcji nie świadczy jednak to, że Intel po wielu latach wrócił do idei wytwarzania oddzielnych układów graficznych (tym, którzy nie pamiętają, przypomnę, że w 1998 roku Intel zaprezentował karty z układem Intel i740, wykorzystujące rendering kafelkowy), ale to, że Larrabee jest graficznym procesorem interpretującym kod x86.
Larrabee jest również bardzo dobrym przykładem odzwierciedlającym dwa trendy w rozwoju procesorów i kart graficznych, które wyraźnie widać w najnowszych konstrukcjach CPU i GPU – wykorzystanie wielordzeniowości oraz dążenie do jak największej uniwersalności układów przy zachowaniu sporej szybkości obliczeń dzięki zawarciu w układach specjalizowanych takich jednostek, jak moduły MMX czy SSE.
Przyglądając się kartom graficznym i procesorom pod tym właśnie kątem, łatwo zauważyć, że zarówno karty graficzne, jak i procesory to jednostki wielordzeniowe mogące wykonywać jednocześnie po kilka wątków. Oba rodzaje układów to przecież konstrukcje wielordzeniowe zawierające wiele niezależnych jednostek wykonawczych.
Drugi trend dotyczy bardziej kart graficznych. Do niedawna były to wyłącznie specjalizowane układy przystosowane do generowania grafiki 3D. Jednak pojawienie się jednostek cieniowania wierzchołków (ang. vertex shader) i pikseli (ang. pixel shader) sprawiło, że w coraz większym stopniu stały się one programowalne, a więc zbliżyły się do procesorów. Następnym krokiem na drodze do elastyczności ich działania stało się połączenie jednostek cieniowania pikseli i wierzchołków w uniwersalne jednostki zunifikowane. To one mogą wykonywać obliczenia zbliżone do tych realizowanych przez CPU.
Układy GPGPU
Zanim jednak przejdziemy do omówienia ujawnionych przez Intela szczegółów konstrukcji Larrabee, trzeba powiedzieć kilka słów o idei GPGPU (ang. General-Purpose Computing on Graphics Processing Units), którą przed chwilą nakreśliliśmy we wstępie, niejako przy okazji omawiania trendów.
Układy typu GPGPU to nic innego jak układy graficzne, które mogą zostać również wykorzystane do obliczeń zupełnie niezwiązanych z grafiką. Do niedawna najlepszym przykładem układu GPGPU była produkowana od nieco ponad dwóch lat przez NVIDI-ę Tesla. Tesla to po prostu zmodyfikowana na potrzeby skomplikowanych obliczeń numerycznych karta graficzna GeForce GTX 280 (nazwa kodowa GT200), a we wcześniejszej wersji – GeForce 8800 GTX (G80). Tesle trafiły do wielu instytutów naukowo-badawczych i centrów superkomputerowych. NVIDIA chwali się, że Tesla wykorzystywana jest w 39 ośrodkach naukowo-badawczych, w tym tak znanych i prestiżowych, jak MIT (Massachusetts Institute of Technology), gdzie z powodzeniem zajmują się obliczeniami inżynierskimi i naukowymi, niemającymi nic wspólnego z generowaniem grafiki 3D, a które zarezerwowane były do niedawna dla superkomputerów.
Jak wiadomo, podstawą architektury G80/GT200 są stosunkowo proste skalarne, 32- lub 64-bitowe (w GT200) zmiennoprzecinkowe jednostki obliczeniowe nazwane w wypadku G80 procesorami strumieniowymi (ang. streaming processor), a GT200 – procesorami wątkowymi (ang. thread processor) – obie karty pod tym względem niewiele różnią się od siebie. Nowa Tesla T10P ma ich do dyspozycji 240, starsza miała 128. Procesory te mogą nie tylko przetwarzać typowy kod związany z przetwarzaniem strumienia graficznego, ale również bez kłopotu można je w dowolny sposób programować za pośrednictwem środowiska programistycznego C o nazwie CUDA (ang. Compute Unified Device Architecture).
Operacje wektorowe, wykonywane w poprzedniej generacji kart graficznych przez jednostki cieniowania wierzchołków i pikseli, w wypadku kości G80 i GT200 prowadzone są za pośrednictwem jednostek skalarnych. Łączy się je wówczas w grupy po dwie (GT200) lub cztery (G80) jednostki, które działają razem w trybie SIMD (ang. Single Instruction Multiple Data). Co ciekawe, jak twierdzi NVIDIA, obliczenia skalarne dla jednostek wektorowych wiążą się z 75% niewykorzystaniem ich obliczeniowego potencjału.
Procesory strumieniowe w G80/GT200 mogą w jednym cyklu wykonać dwie (G80) lub cztery (GT200) stałoprzecinkowe instrukcje mnożenia lub dodawania oraz jedną operację mnożenia lub dodawania zmiennoprzecinkowego. Pojedynczy procesor dysponuje jedną jednostką zmiennoprzecinkową, jedną stałoprzecinkową i jedną (G80) lub trzema (GT200) jednostkami arytmetyczno-logicznymi. Jak widać, bardziej jest on zbliżony do architektury RISC niż do klasycznego układu graficznego, gdyż inżynierowie z NVIDI-i doskonale zdawali sobie sprawę, że znacznie łatwiej zaprojektować wydajny układ graficzny, który złożony będzie z wielu prostych uniwersalnych procesorów, niż taki zbudowany z kilku lub kilkunastu specjalizowanych, skomplikowanych modułów wektorowych przeznaczonych tylko do generowania grafiki. Osiągnięty rezultat jest wówczas lepszy, gdyż proste układy można taktować znacznie szybszym zegarem. Niejako przy okazji cała konstrukcja jest wówczas znacznie bardziej uniwersalna, tak że karta graficzna z powodzeniem może wykonywać obliczenia do tej pory zarezerwowane dla CPU. Podobnie skonstruowane są również najnowsze karty graficzne ATI, z tym że nie były dotąd wykorzystywane do innych obliczeń niż te związane z generowaniem grafiki i fizyką w grach.
Larrabee to też GPGPU
Jak można się domyślić, nie napisalibyśmy w tym miejscu nic o Tesli, gdyby Larrabee nie był również układem typu GPGPU. Jednak geneza jego konstrukcji jest nieco inna niż w wypadku NVIDI-i. Intel wykorzystał w niej bowiem to, na czym się zna najlepiej, a więc architekturę klasycznego procesora interpretującego kod x86. Za podstawę wzięto zaś stosunkowo prostą, jak na dzisiejsze czasy, architekturę wywodzącą się wprost od procesora Pentium.
Dzięki wykorzystaniu do tworzenia grafiki 3D klasycznej architektury procesora zgodnej z kodem x86 uzyskano bardzo uniwersalny, łatwy w programowaniu procesor GPGPU. Larrabee będzie się w stanie zająć nie tylko tworzeniem trójwymiarowych scen, ale również obliczeniami związanymi z fizyką postaci i przedmiotów umieszczonych na scenie 3D, przetwarzaniem strumieni wideo oraz strumieni audio. Patrząc na jego budowę, znacznie lepiej określić go mianem procesora strumieniowego przystosowanego do wykonywania operacji graficznych, który jednocześnie charakteryzuje się bardzo dużą skalowalnością, znacznie większą niż w przypadku typowego procesora GPU.
Na powyższym rysunku wyraźnie widać, że podstawę konstrukcji Larrabee stanowią układy o nazwie Multithreaded Wide SIMD. Są to odpowiednio zmodyfikowane jądra procesorów Pentium. Każdy taki procesor pozwala na jednoczesną obsługę czterech wątków. Rdzenie komunikują się między sobą za pośrednictwem pierścieniowej, dwukierunkowej magistrali (ang. ring-bus) o szerokości 1024 bitów (po 512 bitów w każdą stronę). Dzięki temu wymiana danych między poszczególnymi procesorami może odbywać się bardzo szybko. Za jej pośrednictwem każdy z rdzeni ma również dostęp do pamięci podręcznej L2 innego rdzenia. Co więcej, zysk wynikający z takiego rozwiązania jest znacznie większy, gdyż dane pobrane przez jeden z rdzeni do własnej pamięci L2 są również dostępne (jeśli okażą się potrzebne) dla innych rdzeni – tego typu pamięć nazywa się pamięcią koherentną. W wypadku zwykłych kart graficznych każda z grup jednostek obliczeniowych ma własną pamięć podręczną, do której nie mają dostępu inne grupy jednostek, i w razie potrzeby już raz sprowadzone dane muszą zostać ponownie wczytane przez inną grupę procesorów do ich własnej pamięci podręcznej. Poprzez wspomnianą magistralę pierścieniową rdzenie komunikują się też z pozostałymi elementami układu Larrabee – kontrolerem pamięci, interfejsem odpowiedzialnym za wyświetlanie wygenerowanego obrazu oraz jednostką teksturującą
Intel nie ujawnił, z jaką prędkością będzie działała magistrala pierścieniowa, wiadomo jednak, że każdy z rdzeni będzie miał do dyspozycji po 32 kilobajty pamięci podręcznej L1 dla instrukcji i 32 kilobajty dla danych oraz wydzieloną dla siebie 256-kilobajtową pamięć L2, do której zajrzeć mogą inne rdzenie.
Co w procesorze siedzi
Dwa poniższe schematy przedstawiają wewnętrzną budowę pojedynczego procesora „Multithreaded Wide SIMD" oraz znajdującej się w nim jednostki wektorowej.
Jak widać, budowa pojedynczego procesora w Larrabee nie jest zbyt skomplikowana. Zastosowana w Larrabee jednostka skalarna to dobrze znana z Pentium, unowocześniona jednostka ALU (ang. Arithmetic Logic Unit), która może wykonywać operacje 64-bitowe oraz działać w trybie wielowątkowym. Swoją budową przypomina zatem w dużym stopniu jednostki ALU znane z procesorów Intel Atom i podobnie jak ALU w Atomie jest ona w stanie wykonywać rozkazy wyłącznie w kolejności, tak jak wymaga tego program (ang. in order execution), brak w niej bowiem jednostek przewidywania skoków i rozgałęzień (ang. branch prediction) oraz modułu wykonującego obliczenia poza kolejnością (ang. out of order execution). Krótki jest też potok wykonawczy; niestety, Intel nie ujawnił, jaka jest jego długość.
W stosunku do oryginalnego Pentium modyfikacjom poddano również kontroler pamięci pierwszego i drugiego poziomu. Obsługuje on funkcję prefetch, pozwalającą na wcześniejsze pobranie z pamięci danych, które za chwilę będą potrzebne podczas obliczeń – jest to niezbędny warunek przy wykonywaniu obliczeń typu SIMD, gdyż oczekiwanie na dane zniweczyłoby cały zysk płynący z jednoczesnego wykonywania jednej instrukcji na kilku operandach. Niemniej kontroler odpowiedzialny za ładowanie danych z przyspieszeniem jest również prostszy niż ten znany z Atomu, gdyż przewidywanie, które dane muszą zostać załadowane z pamięci podczas renderowania sceny 3D, jest znacznie łatwiejsze niż w wypadku wykonywania typowego programu x86.
Znacznie ciekawsza jest jednostka wektorowa. Swoją budową przypomina ona jednostki wektorowe stosowane w kartach ATI. Składa się ona z jednostki wektorowej o szerokości wektora wynoszącej 16, która jest w stanie przetworzyć 16 32-bitowych operacji w czasie jednego cyklu zegarowego. Operuje ona na liczbach pojedynczej i podwójnej precyzji i potrafi między innymi wykonywać konwersje między różnymi formatami danych, takimi jak Int32, FP32 i FP64, czy łączyć w jedną operację wielokrotne dodawanie (na trzech argumentach). Obsługiwane są też wszystkie wymagane dla jednostek VPU (ang. Vector Processing Unit) operacje, takie jak: separowanie danych dla każdej linii przetwarzanego wektora, rozrzucanie i zbieranie danych wektorowych podczas pobierania ich z pamięci i zapisywania do pamięci czy maskowanie wybranych do zapisu linii po to, aby kontrolować równoległy przepływ danych. Układ Larrabee ma również obsługiwać nowy zestaw instrukcji o nazwie Advanced Vector Extensions (AVE). Pozwoli on na jednoczesne przetwarzanie całych wektorów danych. Instrukcje AVE są specjalnym rozszerzeniem istniejących instrukcji SIMD, które będą niezwykle przydatne przy skomplikowanych operacjach przetwarzania grafiki trójwymiarowej.
Jednostka teksturująca
Mimo nacisku, jaki postawiono na uniwersalność poszczególnych jednostek wykonawczych, inżynierowie zdecydowali się jednak na jednostkę specjalizowaną. Jest to jednostka teksturująca. Do jej zadań należą wszystkie operacje na teksturach, w tym: kompresja, dekompresja tekstur, wykonywanie operacji filtrowania anizotropowego dwu- bądź trzyliniowego, mapowanie tekstur, mapowanie nierówności (ang. bump-mapping), wygładzanie krawędzi (ang. anti-aliasing), nakładanie cieni oraz dodawanie w procesie postprocessingu tzw. efektów atmosferycznych (mgły, dymu itp.)
Oczywiście możliwe jest wykonanie wyżej wymienionych operacji przy użyciu uniwersalnych rdzeni (w końcu np. program graficzny 3ds max takie operacje wykonuje, używając wyłącznie uniwersalnego procesora), jednak proces taki będzie mało efektywny. Stworzenie wyspecjalizowanej jednostki teksturującej wiąże się z tym, że proces teksturowania wykorzystuje bardzo specyficzne operacje, w których przetwarzanie odbywa się np. na blokach wielkości 2×2, a filtrowanie jest zoptymalizowane do operacji 8-bitowych (używa się głównie tekstur RGBA 8888). Jak wyliczyli inżynierowie z Intela, wyspecjalizowana jednostka wykona filtrowanie ok. 12 razy szybciej niż rdzenie Larrabee i 40 razy szybciej poradzi sobie z kompresją i dekompresją danych.
Jak już wspomnieliśmy, jednostka teksturująca komunikuje się z rdzeniami za pomocą magistrali pierścieniowej, przez którą uzyskuje dostęp do pamięci podręcznej drugiego poziomu, służącej nie tylko do wymiany danych, ale również jako bufor kolejności wymiany danych, w tym przy rozgałęzieniach programowych.
Grafika na 16 rdzeni
Obecnie projektowana wersja układu Larrabee ma mieć 16 rdzeni (Intel oficjalnie tego nie potwierdza), ale też mają się pojawić wersje układu 8-, 24-, 36- i 48-rdzeniowe. Szybkość taktowania układu ma wahać się od 1,7 do 2,5 GHz, a jego wydajność szacowana jest na od 1,7 do 2,5 teraflopa. Układ ma współpracować z pamięcią GDDR5 o pojemności od 512 do 2048 megabajtów.
Intel podkreśla, że Larrabee jest w stanie generować sceny 3D przy wykorzystaniu techniki raytracingu w czasie rzeczywistym – Intel technologię tę określa skrótem RTRT (ang. Real-Time RayTracing). Technika ta bierze w obliczeniach pod uwagę zarówno światło pochodzące bezpośrednio ze źródeł światła, jak i to odbite od znajdujących się na trójwymiarowej scenie przedmiotów. W metodzie raytracingu, w skrócie, w obliczeniach śledzony jest tor promienia światła, od jego źródła poprzez poszczególne odbicia aż do opuszczenia przez niego sceny 3D. Karty graficzne z układem Larrabee mogą zatem zostać wykorzystane nie tylko do gier, ale również do zastosowań profesjonalnych w wizualizacji komputerowej i profesjonalnej grafice 3D.
Karty Larrabee mogą być także wykorzystywane w diagnostyce medycznej, wszędzie tam, gdzie na bieżąco generowany jest trójwymiarowy obraz prześwietlanych narządów, w symulacjach inżynierskich, w modelowaniu i wizualizacji zjawisk fizycznych, w projektowaniu CAD czy wreszcie w prognozowaniu pogody. Można też sobie wyobrazić zupełnie nowy, trójwymiarowy typ interfejsu użytkownika, ułatwiający obsługę komputera.
Na zakończenie warto też wspomnieć o tym, że Larrabee jest zgodny z dowolnym graficznym API – wymaga tylko odpowiednich napisanych pod dany API sterowników. Obecnie jest zatem zgodny z bibliotekami graficznymi DirectX 10 i OpenGL 2.0, za rok będzie bez problemu obsługiwać gry napisane pod DirectX 11 czy OpenGL 3.0, nawet jeśli karta kupiona zostanie kilka lat wcześniej, niż miała miejsce premiera danego API.