Nie tylko do grafiki

Po co inżynierowi wydajna karta graficzna? Wydawać by się mogło, że odpowiedź na to pytanie jest prosta - do akceleracji wyświetlania i renderingu grafiki inżynierskiej w takich programach jak AutoCAD czy Autodesk Inventor. Okazuje się jednak, że taka karta może służyć również z powodzeniem do przyspieszania wysokowydajnych obliczeń.

Od dawna wiadomo, że do generowania realistycznej, trójwymiarowej grafiki o dużej rozdzielczości z prędkością wymaganą m.in. grach, która wynosi co najmniej trzydzieści klatek na sekundę, potrzeba ogromnej mocy obliczeniowej. Dlatego współczesne karty graficzne, aby sprostać tym wymaganiom, dysponują naprawdę ogromną mocą obliczeniową. Moc ta liczona jest już dzisiaj w bilionach operacji zmiennoprzecinkowych na sekundę. Z drugiej strony, współczesne układy graficzne coraz bardziej przypominają procesory ogólnego przeznaczenia, które można w łatwy sposób zaprząc do zadań zupełnie nie związanych z grafiką. Nic więc dziwnego, że inżynierowie projektujący karty graficzne zaczęli już jakiś czas temu zastanawiać się jak tą drzemiącą w kartach graficznych moc obliczeniową spożytkować do innych zadań niż tylko do generowania grafiki 3D.

Wykorzystać teraflopsy

Jak już wspomniałem, moc obliczeniowa układów graficznych często przekracza jeden TFLOPS (Tera FLOPS - FLoating Operations Per Second; liczba operacji zmiennoprzecinkowych na sekundę). Kość Nvidia GeForce GTX 280 dysponuje na przykład mocą obliczeniową wynoszącą 933 gigaflopsów czyli może wykonywać 933 miliardów operacji zmiennoprzecinkowych na sekundę. Z kolei najnowszy ATI Radeon HD 5870 ma moc 2,72 teraflopsa, czyli bazującą na nim karta graficzna może zrealizować niemal trzy biliony operacji zmiennoprzecinkowych na sekundę. Podobną, gigantyczną mocą będzie dysponować również najnowszy układ Nvidii GTX 480 (nazwa kodowa Fermi), który swoją premierę będzie miał wkrótce po ukazaniu się tego numeru MM Magazynu Przemysłowego w druku. Dla porównania czterordzeniowy procesor Intel Core i7 965 XE dysponuje mocą obliczeniową wynoszącą „zaledwie" 70 gigaflopsów, czyli jest to niemal 40 razy mniej niż dla najszybszego obecnie Radeona i kości Fermi.

Jeszcze ciekawsze jest porównanie mocy obliczeniowej kart graficznych do mocy superkomputerów. Okazuje się bowiem, że pojedyncza karta graficzna dysponuje obecnie mocą równą, a często i większą niż moc, którą dysponowały najlepsze superkomputery z przed kilku lat. Zaglądając na koniec listy TOP500, na której umieszczane są najszybsze obecnie superkomputery, okazuje się, że te maszyny mają moc obliczeniową niewiele większą od 2 teraflopsów, a więc są porównywalne z Radeonem HD 5870 czy układem Fermi. Trzeba jednak w tym miejscu wspomnieć jednak o tym, że podawana przez producentów kart graficznych moc obliczeniowa dotyczy rachunków wykonywanych z pojedynczą precyzją. W wypadku superkomputerów i procesorów podaje się zaś moc w obliczeniach realizowanych z podwójną precyzją, ale nawet po przeliczeniu rezultatów dla kart graficznych (moc obliczeniowa dla kości graficznych przy podwójnej precyzji stanowi ok. 40% mocy obliczeniowej dla operacji w pojedynczej precyzji) te wartości są w dalszym ciągu imponujące.

Obliczeniowe CUDA

Zarówno, teraz, jak i w przeszłości firmą produkującą układy graficzne, która była i jest również obecnie najbardziej zainteresowana wykorzystaniem mocy obliczeniowej kart graficznych do różnego typu zaawansowanych zadań obliczeniowych, jest Nvidia. Pierwsze prace nad wykorzystaniem akceleratorów 3D do obliczeń numerycznych nie związanych z grafiką rozpoczęto na początku 2004 roku. Dzięki współpracy inżynierów z Nvidii oraz naukowców z laboratorium w Los Alamos już w listopadzie 2004 roku udało zaprząc się kartę graficzną bazująca na układzie Nvidia Quadro FX 3400 do wykonania obliczeń związanych z symulacją zachowania zapadającej się gwiazdy. Podczas tego eksperymentu numerycznego, karta graficzna wykonała kalkulacje czterokrotnie szybciej niż liczący to samo zadanie komputer z procesorem Intel Pentium 4 Xeon 3.0 GHz.


Sukces ten sprawił, że Nvidia przekonała się, że warto zacząć wykorzystywać na szerszą skalę karty graficzne do obliczeń naukowo-inżynierskich i bardzo szybko podjęto próby zaimplementowania odpowiednich mechanizmów obliczeniowych do kolejnej generacji kart graficznych. Tak narodziła się koncepcja architektury i modelu programowania znanego obecnie pod nazwą CUDA (Compute Unified Device Architecture). Architektura i technologia CUDA pojawiły się po raz pierwszy w układach graficznych z serii GeForce 8800 GTX i są z niewielkimi zmianami wykorzystane we wszystkich kolejnych seriach układów graficznych Nvidii. Będzie ona też obecna w najnowszych kościach z rodziny Fermi.

W wypadku oryginalnej architektury układu GeForce 8800 GTX, jej podstawę stanowiło osiem jednostek cieniowania, z których każdy składał się z 16 jednostek obliczeniowych tzw. Streaming Processor. Układ ten dysponował łącznie 128-takimi jednostkami, które zgodnie z przyjętymi założeniami architektury CUDA są tak naprawdę 32-bitowymi bardzo prostymi skalarnymi procesorami RISC (Reduced Instruction Set Computers) uniwersalnego przeznaczenia. Oznacza to, że jednostka taka może wykonywać zarówno obliczenia charakterystyczne dla generowania grafiki, a także dowolnego innego typu kalkulacje.

Co ważne, jednostki Streaming Processor podczas obliczeń mogą być łączone w większe zespoły (klastry) obliczeniowe, a po skończeniu kalkulacji, taki moduł może być „rozformowany" i każda wchodząca w jego skład jednostka przydzielona do innych zadań. W ten sposób zwiększono nie tylko szybkość obliczeń ale również ich efektywność wykorzystania mocy obliczeniowej, eliminując w ten sposób przestoje.

cały tekst dostępny w numerze 4/2010 MM

Chcesz otrzymać nasze czasopismo?

Zamów prenumeratę