TechTalk: Een korte geschiedenisles<br> over GPGPU

TechTalk: Een korte geschiedenisles
over GPGPU

In het verleden werden videokaarten alleen maar gebruikt voor 2D en 3D desktop applicaties en games. Al snel werd echter duidelijk dat deze kaarten ook gebruikt konden worden voor wetenschappelijke toepassingen waarbij grote hoeveelheden (floating point) data parallel en met hoge snelheid bewerkt wordt.

De drivers van videokaarten waren closed sourced, en summier gedocumenteerd (tot grote frustratie van Linus Torvalds) en daardoor praktisch gezien ontoegankelijk voor derden. Na 2001 werden de shaders programmeerbaar en daarmee toegankelijk om middels shader languages en (macro) assembly languages eenvoudige bewerkingen op datasets te doen. Helaas gold dit voor slechts een deel van de functionaliteit van een videokaart, waardoor men nog niet in staat was om complexe bewerking en algoritmes te implementeren. Ook waren de kaarten leverancier-specifiek (Nvidia, AMD, Intel e.d.) en ging debuggen erg lastig.

Met de komst van softwarebibliotheken als DirectX en OpenGL werden videokaarten steeds geschikter voor generieke toepassingen en ook steeds gemakkelijker te programmeren, hoewel de nadruk van die bibliotheken voornamelijk ligt op 3D visualisatie en raytracing. In 2007 lanceerde Nvidia en API zodat software ontwikkelaars en engineers volledig toegang kregen tot de hardware. In 2009 werd OpenCL (Open Computing Language) uitgebracht door Khronos Group waarmee men platformonafhankelijk voor verschillende platformen toegang kon krijgen tot CPU’s, GPU’s, DSP’s en FPGA’s.

Ook voor industriële applicaties is die onafhankelijkheid zeer relevant. Grafische kaarten hebben een levensduur van 2 a 3 jaar. Je wilt natuurlijk voorkomen dat een heel nieuw ontwikkeltraject gestart moet worden op het moment dat een nieuwe videokaart met nieuwe functionaliteit uitkomt. Tegenwoordig zijn er zelfs videokaarten die de 1 TFlops bereikt hebben, dit is snel genoeg om een product in line en real time te inspecteren.

senseIT werkt momenteel aan de upgrade van onze huidige 3D fringecamera. Deze technologie is oorspronkelijk ontwikkeld op basis van een DSP-chip, maar we lopen nu toch echt tegen de grenzen aan van de mogelijkheden van dit platform. Twee camera’s die elk streamen met 5Mpixels @ 60Hz leveren in korte tijd behoorlijk wat data op welke verwerkt dient te worden. Ook bevatten sommige van onze inspectiecellen wel drie fringecamera’s! Alhoewel het decoderen van projector pixels nog steeds gebeurt via een post-processing DSP, worden alle intensieve floating point nu berekend met behulp van een grafische kaart met 2560 Cuda Cores. Door de parallellisatie (en het snelle geheugen) kunnen we in bepaalde gevallen een snelheidswinst van 100x de snelheid van een standaard I7 CPU boeken!

Nadat afzonderlijke pointclouds gegenereerd zijn moeten deze gestitched, uitgelijnd en bewerkt worden. Aangezien een 3D object gemakkelijk > 1GB groot kan zijn en je binnen 5 tot 10 seconden resultaat wil, ontkom je er niet aan om bepaalde bewerkingen over te hevelen naar gespecialiseerde acceleratie platformen. Toch blijft optimalisatie een vak apart en hangt het per situatie af of er via SIMD geoptimaliseerd moet worden (voornamelijk voor integer operaties), of dat het het overwegen waard is om gebruik te maken van een GPU.