OpenCL för FPGA-konstruktion

Uppdaterat med referens till artikel om OpenCL från Altera.

En ny version av OpenCL

För ett par veckor sedan släppte organisationen Khronos version 1.2 av OpenCL. OpenCL är en utökning av programspråket C99 samt ett ramverk med verktyg och bibliotek. Med OpenCL är det möjligt att bygga program som utnyttjar parallell beräkningskapacitet i processorer (CPU), grafikprocessorer (GPU) m.m. Inte minst viktigt är att OpenCL gör det möjligt att programmera heterogena system, dvs system där det finns olika typer av processorelement.

Kärnan i OpenCL är möjligheten att skapa segment kallade kernels av kod och data koden skall bearbeta. Det är upp till dig som programmerare att beskriva hur de parallella operationerna ska utföras, vilka dimensioner problemet ska ha etc. När väl din kernel är skapad och kompileras genereras kod som körs på den parallella hårdvaran samt sekventiell kontrollkod avsedd för en kontrollprocessor. Kontrollkoden ser till att skicka kernel och data till den parallella hårdvaran, får kernel exekverad och tar slutligen emot resultatet.

Den vanligaste användningen av OpenCL är för att programmera GPU:er i datorer. OpenCL börjar även användas för att programmera den ökande mängden processorkärnorna i vanliga processorer, nätverksprocessorer och digitala signalbehandlingsprocessorer (DSP). Inte minst är detta intressant i högpresterande inbyggda system som basstationer för mobilsystem.

För den som vill titta närmare på OpenCL 1.2 finns specifikationen här (pdf).

Sponsorer av OpenCL är företag som Apple, AMD, Intel och IBM, men även Ericsson stödjer Khronos och OpenCL.

En ny version av OpenCL är egentligen inte så intressant. Det som fick mig att reagera på EE Times artikel var istället att företaget Altera officellt börjat stödja OpenCL. Altera tillverkar inte processorer – hårdvara som har en fix instruktionsuppsättning man kompilerar sin kod till. Altera bygger FPGA:er.

Sidospår om FPGA-konstruktion

En FPGA är en digital krets fylld med små byggblock, ledningar och kopplingselement. Hur byggblocken fungerar och hur dom kopplas samman via ledningar och kopplingselementen styrs av bitar lagrade i kontrollregister. Genom att skriva ner en konfiguration i kontrollregistren går det att få FPGA:n att implementera olika digitala funktioner. Gränssnitt för Ethernet, MP3-avkodare, filter för bildbehandling och faktiskt hela processorer och digitala system går att implementera i en modern FPGA. Man kan till och med implementera en FPGA i en FPGA.

Poängen med en FPGA är att den är väldigt parallell med massor av små byggblock, men det finns ingen egentlig instruktionsuppsättning eller schemaläggare som styr hur exekveringen går till. Det är en ren digital struktur och det är upp till dig som användare att skapa den konfiguration du behöver. Detta arbete är mer likt traditionell digital konstruktion än att programmera en processor, även om du använder assembler.

Normalt används konstruktionsspråk som Verilog, SystemVerilog (SV) eller VHDL. Den generella abstraktionsnivån i dessa konstruktionsspråk är relativt låg. Så länge som jag arbetat med digital konstruktion (sedan mitten av 1990-talet) har det dock funnits en strävan, en trend mot att försöka lyfta abstraktionsnivån.

Det har kommit och gått en massa försök med högnivåsyntes till nya språk som SystemC. En i min åsikt gemensam egenskap med dessa lösningar har varit en stor komplexitet och oförmåga att leva upp till de produktivitetsökningar man utlovar. Genom att gräva ner sig i schemaläggningar, delning av resurser, optimeringar etc har verktygen blivit komplexa, svåra att arbeta med och kräver mycket datorresurser.

Altera C2H

En som tog en liten annan väg var faktiskt Altera som för några år sedan lanserade C2H. C2H är ett verktyg för att ta vanlig C-kod och konvertera till digital hårdvara. Och det som gör C2H så smart, var att de är så dum.

Du som konstruktör får hela ansvaret att skriva din C-kod så att C2H kan fatta hur motsvarande hårdvara ser ut. Använder du 17 multiplikationer i din funktion får du 17 multiplikatorer. Vill du använda färre multiplikationer får du skriva om din kod så att samma multiplikationsuttryck används flera gånger.

Å andra sidan är C2H snabb. På några minuter kan du generera hårdvara och få återmatning. Eftersom C2H även är en del av utvecklingsverktygen för Alteras processor Nios II kan du dessutom testa att köra koden som ren SW, profilera din kod och sedan försöka konvertera de kritiska funktionerna till hårdvara.

Den magi som finns i C2H är kopplingen mellan hårdvaran och den kontrollkod som skapas för Nios II-processorn som krävs för att styra den genererade hårdvaran och använda den i resten av applikationen.

För den som vill veta mer finns det utbildningsmaterial och användarguide för C2H. Det finns även ett exempel på acceleration av beräkning av Mandelbrotmängder. Den arkitektur som används ser ut så här:

Arkitekturen hos Alteras Mandelbrotsberäknare.

I exemplet nås 60 gångers prestanda jämfört med en ren SW-implementation.

Acceleratorn blir alltså en applikationsspecifik stödprocessor till processorn. Men det går att bygga coprocessorer som är kapabla att själva läsa och skriva till minnen och arbeta självständigt.

FPGA – den nya OpenCL-arkitekturen

När jag tittar igenom det material från Altera som finns om OpenCL får jag samma känsla som när jag såg C2H första gången.

Du som konstruktör får ansvaret för att styra vad som ska bli parallell hårdvara och att det data som skall bearbetas finns i rätt format etc. Och kanske det viktigaste – att försöka parallellisera de delar som spelar roll för applikationen. Den magi, infrastruktur får att få systemet att hänga ihop sköter Altera och OpenCL.

Att ha FPGA som målplattform för OpenCL öppnar upp för nya typer av heterogena arkitekturer med mulicore, GPU och FPGA:er blandat. En FPGA kommer aldrig att komma upp i de klockfeekvenser som en GPU snurrar i så för vissa applikationer kommer en FPGA inte att ersätta CPU eller GPU.

(En tumregel att en FPGA når en tiondel av klockfrekvensen som en direktimplementerad digital krets. Den funktion som implementeras kräver dessutom ungefär tio gånger så mycket digitala grindar i en FPGA.)

Fördelen med FPGA:n är istället att den är en generisk digital struktur med mängder av “processorelement”. Antalet element och hur elementen fungerar kan direkt anpassas (skapas) för att processa en OpenCL-kernel. Detta gör att du kan få mycket högre prestanda i en mer flexibel arkitektur. Och precis som med C2H kan du med OpenCL alltid pröva, och analysera din kod som ren SW-lösning på en multicore-maskin eller på GPU innan du konverterar valda delar till hårdvara.

Det finns en bra preso om OpenCl för FPGA (pdf) av Desh Singh från Altera som visar hur Altera tänker sig att det ska fungera. Från preson är det klart att Altera stödjer både system med FPGA:er på kort i traditionella datorer och system där även processorn implementeras i FPGA:n.

Det finns även en mycket bra artikel från Altera om hur OpenCL är tänkt att fungera (pdf). Artikeln visar hur OpenCL används för att skapa parallella instanser av kernelspecifik logik som processar data. Instanserna styrs sedan av kontrollkod som körs på mjuka processorer i FPGA:n (exempelvis Nios), hårda ARM-kärnor (Altera har FPGA:er med ARM-kärnor) eller x86-processorer.

I artikeln finns även ett prestandatest i form av en Black Scholes. Enligt artikeln är själva OpenCL-koden är på ungefär 300 rader och är porterbar till CPU, GPU och FPGA.

en fyrkärnig Intel Xeon-processor ger 240 miljoner simuleringar/s, en GPU 950 miljoner/s och Alteras Stratix IV-krets 2200 miljoner simuleringar/s.

Slutsatser

För hårdvaruarkitekturer är det en gammal sanning av det är programmeringsverktygen som avgör. Oavsett hur bra, snygg och smart din arkitektur är, kommer ingen att vilja använda den om det inte finns verktyg – program som gör att det effektivt går att programmera applikationer för arkitekturen. Detta gäller microcontrollers, desktopprocessorer, DSP:er, närverksprocessorer. Och FPGA:er.

Jag tror att Altera med satsningen på OpenCL visar att man faktiskt fattar detta och ger sina kunder och användare nya sätt att bygga hårdvara som implementeras i deras FPGAer. Själva poängen är ju för Altera att sälja fler FPGA:er – och gärna genom att hitta nya marknader och kunder än de som traditionellt bygger egna digitala konstruktioner.

Jag ser inte OpenCL som ersättning för C2H. Visst, du kan bygga motsvarande hårdvara med C2H som OpenCL, men egentligen är verktygen för olika typer av problemdomäner.

OpenCL ancvänder du för att bygga parallell hårdvara för att maximera prestanda i problem där du parallellisera upp delberäkningar. C2H använder du för att bygga systemet runt din parallella hårdvara.

När du byggt din AES-kernel till din parallella AES-kryptoknäckare i OpenCL använder du C2H för att bygga paketprocessing och koppla Gbit Ethernet-gränssnitten med AES-motorn. Slutligen lägger du kontrolllkod i Nios II-processorn för att få allt att arbeta ihop.

Heterogent. Inbyggt. I en FPGA-krets. Snyggt.


Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *

Följande HTML-taggar och attribut är tillåtna: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>