Hoog niveau synthese van een hardware-accelerator voor het real time berekenen van dynamische heatmaps met een FPGA

Pieter Ideler

Promotoren: ing. Johan Beke, prof. dr. Steven Verstockt

Masterproef ingediend tot het behalen van de academische graad van Master of Science in de industriële wetenschappen: elektronica-ICT

Vakgroep Elektronica en Informatiesystemen Voorzitter: prof. dr. ir. Rik Van de Walle Faculteit Ingenieurswetenschappen en Architectuur Academiejaar 2015-2016

Hoog niveau synthese van een hardware-accelerator voor het real time berekenen van dynamische heatmaps met een FPGA

Pieter Ideler

Promotoren: ing. Johan Beke, prof. dr. Steven Verstockt

Masterproef ingediend tot het behalen van de academische graad van Master of Science in de industriële wetenschappen: elektronica-ICT

Vakgroep Elektronica en Informatiesystemen Voorzitter: prof. dr. ir. Rik Van de Walle Faculteit Ingenieurswetenschappen en Architectuur Academiejaar 2015-2016 4 Toelating tot bruikleen

De auteur geeft de toelating deze masterproef voor consultatie beschikbaar te stellen en delen van de masterproef te kopiëren voor persoonlijk gebruik. Elk ander gebruik valt onder de bepalingen van het auteursrecht, in het bijzonder met betrek- king tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit deze masterproef. Pieter Ideler, 5 september 2016

5 6 Hoog niveau synthese van een hardware-accelerator voor het real time berekenen van dynamische heatmaps met een FPGA

door

Pieter Ideler

Masterproef ingediend tot het behalen van de academische graad van Master of Science in de industriële wetenschappen: elektronica-ICT

Academiejaar 2015–2016

Promotoren: ing. Johan Beke, prof. dr. Steven Verstockt

Faculteit Ingenieurswetenschappen en Architectuur Universiteit Gent

Vakgroep Elektronica en Informatiesystemen Voorzitter: prof. dr. ir. Rik Van de Walle

Samenvatting

In deze masterproef wordt een algoritme om heatmaps te genereren geïmplementeerd op een FPGA door gebruik te maken van hoog niveau synthese. Een FPGA biedt de mogelijkheid om dataver- werking parallel uit te voeren. Om deze functionaliteit optimaal te benutten worden de wiskundige methodes die aan de basis liggen van heatmaps geanalyseerd. Het parallellisme wordt blootgelegd en aangewend om een efficiënte implementatie te bekomen. Hoog niveau synthese wordt aan- gewend om op een hoog niveau van abstractie de configuratie van de FPGA voor te stellen. De performantie van het bekomen resultaat wordt vergeleken met implementaties op PC en in VHDL.

Trefwoorden

Heatmap, Hoog niveau synthese, FPGA 8 High-level synthesis of a hardware accelerator for real-time heatmap generation Pieter Ideler Supervisor(s): ing. Johan Beke, prof. dr. Steven Verstockt

Abstract This master dissertation concerns the imple- A heatmap can also be used as an alternative to scatter mentation of a heatmap algorithm on an FPGA using High plots. In a scatter plot every sample is represented by Level Synthesis. ++ was used to congure the FPGA to achieve faster heatmap generation compared to utilizing a a dot. The location and the density of the dots can be standard PC. visually interpreted. This visualization method has some Keywords Heatmap, High-Level Synthesis, FPGA drawbacks. When visualising huge datasets, points overlap and the cumulation of points is not visible. The possibility to observe trends is also very dependent on the chosen scale. I. Introduction By calculating the density of the data and depicting it on EATMAPS are an ecient way of portraying high a heatmap a much more usable and scalable representation volumes of data, especially in a geographical context. is obtained. TheirH use is very popular in many sports as a tool for analysing strategies and game play. The time-consuming B. Density Estimation calculations needed to generate a heatmap, however, keep A dataset of observations does not have a known density. it from being used in real-time applications, like crowd- Therefore the density has to be estimated. control. A widely known method for density estimation is the When analysing the mathematics underlying a heatmap, histogram. The space of the dataset is divided in bins and we can conclude that the calculations expose a high degree the histogram depicts the portion of the dataset in every of parallelism. This makes them a very good candidate for bin. This method can be described as inaccurate. implementation on an FPGA, a Field Programmable Gate A more accurate method is the naive estimator, which is Array. dened by Equation 1. The conguration of an FPGA is normally coded us- ing RTL-languages1 such as VHDL or . However, 1 n 1 x X the growing complexity and expanding recources an FPGA fˆ(x) = w − i (1) n h h oers, spurs the demand for a higher abstraction level. i=1   Also, the development of heterogeneous high-performance X computing utilizing the FPGA calls for a more computer- 1 if programming oriented way to congure FPGAs. High- with 2 x < 1 w(x) = elsewhere| | Level Synthesis tries to meet these needs by synthesising (0 code, written in a high-level computer language, like C++, into a logic design. fˆ(x) is the estimation of the density using observations In this master dissertation, we expose the parallel Xi. h is called the window width or bandwidth, it con- nature of the calculations for heatmaps. Using High-Level trols the smoothness of the estimation. w(x) is the weight Synthesis, we implement an algorithm and optimize its function. throughput speed. The naive estimator can be interpreted as putting a box with height 1/2 for every observation. It can be generalized II. Heatmaps to the Kernel Estimator in Equation 2. A. Introduction 1 n x X A heatmap is a representation of values depending on fˆ(x) = K − i (2) two variables. The independent variables are represented nh h i=1   by horizontal and vertical position on the map. The de- X When using the weight function as a kernel, the result pendent variable is represented by a color from a color will be the naive estimator. But, other kernels can be scale. used. This way, a more aesthetically pleasing result can In genomics, this is used to represent expression values be achieved. depending on genes and subjects. For spatial data the data can be presented by using latitude and longitude as the C. Parallelism dependent variables. Looking at Equation 2 it is clear that the kernel density 1RTL: Register-Transfer Level estimation consists of the calculation of a kernel for every sample. These kernels are independent and can be calcu- to the heatmap is the primary limiting factor for exploiting lated in parallel. the parallel nature of the heatmap creation. The output of a heatmap algorithm will be a rasterized If every value in the heatmap would have to be read image. Every kernel will consist of a raster section that is and written one by one all potential parallelism would be summed with the complete raster. To calculate this sec- lost. For this reason a form of interleaved memory was tion, the kernel has to be evaluated at every position of implemented by using four memory block. This way all this raster. The calculation for every position is independ- memory needed to add one kernel to the heatmap can be ent of the calculation at a dierent position. This reveals accessed simultaneously. a second possibility for parallelism. To make use of this parallelism we utilize an FPGA. In VI. Results contrast to a traditional CPU, which can execute only a The implementation can be compared to an implement- limited number of instruction in parallel, an FPGA can be ation for PC and an implementation coded in VHDL, both congured for massive parallel execution. made by Ewout Devos. The PC implementation needs 54 980 ns per datapoint. III. FPGA: Field Programmable Gate Array The VHDL-implementation accelerated this 1,7 times to A Field Programmable Gate Array or FPGA is an IC 29 325 ns. The HLS-implementation managed to speed that can be congured to implement any logic circuit, as this up to 119 ns per datapoint. This is an acceleration of long as it ts within the available resources of the particu- 462 compared to the PC and 246 compared to the VHDL- lar FPGA. At rst, this technology was primarily used to implementation. prototype and test logic design. The current acceleration still has a lot of potential for op- Recently, the FPGA is also being used for signal pro- timization. Higher frequencies can be explored and pipelin- cessing and high-performance computing. The congurab- ing can be implemented. ility makes it possible to implement custom functionality, that would need a complex combination of various instruc- VII. Discussion tions on a CPU, often in a more energy-ecient and a By using the ne-grained control oered by VHDL, one more performant way. The logic circuitry of an FPGA is should be able to implement a faster solution. However, also inherently parallel. Operations can be performed on the HLS-implementation managed a remarkable speed-up many values at the same time which speeds up calculations over both the PC as the VHDL-implementation. considerably. Part of this can probably be boiled down to the accessib- ility of HLS for a computer programmer. Both Ewout and IV. HLS: High-Level Synthesis I are primarily trained in IT, with embedded devices being Most of the time, the conguration of an FPGA is coded a minor part of our training. in RTL-languages, like VHDL or Verilog. These languages While using VHDL a lot of low-level implementation de- oer ne-grained control over the implementation o a logic tails had to be gured out. Using HLS the focus could circuit in an FPGA. As the resources available in one single be on the high-level exploitation of the parallel nature of FPGA proliferate and logic circuits keep getting more com- heatmaps. plex a more abstract way of coding the logic for an FPGA has been introduced. High-Level Synthesis takes an al- gorithm, written in a computer programming language, and converts it to an RTL-design. In this dissertation Vivado HLS was used. To be able to optimize the synthesis and to provide certain implementation details to the synthesis tool, Xilinx intro- duced directives. They are pragmas that provide control over certain details. This way the user can balance between performance and used area.

V. Implementation A heatmap based on the kernel density estimator using the weight function was implemented. The dissertation focusses on the heatmap algorithm, so input of data and output of the heatmap were kept minimal. To input the data block RAM was congured as a ROM initialized with a small dataset. Output was done using the VGA capabil- ities found on the test board. The heatmap is located in dual-port RAM. One port is accessed by the HLS-core produced by the HLS-tool. The other porst is accessed by the output logic. Memory access Inhoudsopgave

Overzicht 7

1 Doelstelling 17

2 Densiteit-heatmaps 19 2.1 Heatmaps ...... 19 2.2 Densiteit ...... 22 2.2.1 De kansdichtheidsfunctie ...... 22 2.2.2 Univariate Densiteitsbenadering ...... 22 2.2.3 Niet-parametrische densiteitsbenadering ...... 22 2.2.4 Multivariate kernel densiteitsbenadering ...... 26 2.3 Algoritmische eigenschappen van heatmaps ...... 28

3 FPGA 31 3.1 Historiek ...... 31 3.2 State of the Art ...... 33 3.3 De FPGA als accelerator ...... 33 3.3.1 Parallellisme ...... 35 3.3.2 Flexibiliteit ...... 35

4 HLS: High Level Synthesis 37 4.1 Klassieke Design Methoden ...... 37 4.2 Niveau’s van abstractie ...... 37 4.3 HLS ...... 38 4.4 C++ in Xilinx Vivado HLS ...... 38 4.4.1 Beperkingen ...... 38 4.4.2 Interface ...... 39 4.4.3 Optimalisatie ...... 39

5 Uitwerking 41 5.1 Data-invoer ...... 41 5.2 Heatmap ...... 42 5.3 Data-verwerking ...... 42 5.3.1 Interface ...... 43 5.3.2 Tiles kiezen en uitlezen ...... 44 5.3.3 Dataverwerking ...... 46 5.3.4 Tiles wegschrijven ...... 47 5.4 Data-uitvoer ...... 47

6 Resultaten 49

11 12 INHOUDSOPGAVE

7 Nabespreking 51 7.1 VHDL versus HLS ...... 51 7.2 Potentieel tot verdere versnelling ...... 51 7.3 Potentieel tot functie-uitbreiding ...... 52 Lijst van figuren

1.1 Heatmaps van de wedstrijd België-Ierland ...... 17

2.1 Heatmap van uitingswaarden van genen [3] ...... 19 2.2 Visualisatie van de data van de cholera-epidemie in 1854 in Londen [5] ...... 20 2.3 Point cloud visualisatie van ”armed conficlt” voor het jaar 2003 [4] ...... 21 2.4 Emotie-heatmap voor het jaar 2003 [4] ...... 21 2.5 Histogrammen van de behandeltermijn in een zelfmoordstudie [6, blz. 11] . . . . . 23 2.6 Benaderingen van de duurtijd van uitbarstingen van de ”Old Faithfull” [6, blz. 9, 13] 24 2.7 Kernel-benadering van een bimodiale densiteit [6, blz. 16] ...... 25 2.8 Afbeelding van 4 kernels ...... 27 2.9 Afbeelding van 4 multivariate kernels ...... 29

3.1 PLA architectuuur [10, blz. 109] ...... 32 3.2 PAL architectuuur [10, blz. 109] ...... 32

4.1 Pipelining ...... 40

13 14 LIJST VAN FIGUREN Lijst van tabellen

2.1 Kernels en hun efficiëntie vergeleken met de Epanechikov kernel [6, blz. 43] . . . . 26

3.1 Oplijsting van architecturale eigenschappen [13] ...... 34

15 16 LIJST VAN TABELLEN Hoofdstuk 1

Doelstelling

In deze masterproef wordt de mogelijkheid verkend om het genereren van heatmaps te versnellen met een FPGA-hardware-accelerator. Voor de configuratie van deze hardware-accelerator wordt gebruik gemaakt van HLS (High Level Synthesis). Heatmaps zijn een interessant hulpmiddel voor het visualiseren van geografische informatie. Een populaire toepassing hiervan is voetbal-analyse. Bij de verslaggeving gebruikt men heatmaps om te tonen waar een ploeg, of één enkele speler, zich op het veld bevond tijdens de match. Figuur 1.1 bestaat uit heatmaps van keeper Courtois en spits Lukaku. Heatmaps zouden ook een interessant hulpmiddel vormen bij ”crowd control”, risicobeheersing bij massa-evenementen. Aan de hand van heatmaps zouden risico’s kunnen worden herkend en zou men sneller kunnen ingrijpen. Het genereren van een geavanceerde heatmap vraagt echter heel wat dataverwerking, waar noe- menswaardige verwerkingstijd voor nodig is. Voor statische gegevens, zoals een voetbalwedstrijd die afgelopen is, vormt deze verwerkingstijd geen probleem. Bij dynamische gegevens, zoals crowd control, die continu moeten worden weergegeven en bijgewerkt wordt de verwerkingstijd echter te groot.

Figuur 1.1: Heatmaps van de wedstrijd België-Ierland Wedstrijd op 18 juni 2016 tijdens het Eufa Euro 2016 toernooi. Links: keeper Thibaut Courtois. Rechts: spits Romelu Lukaku. [1]

17 18 HOOFDSTUK 1. DOELSTELLING

Tijdens het aanmaken van een heatmap moeten op één datapunt verschillende berekeningen worden uitgevoerd. Deze berekeningen zijn onafhankelijk van elkaar en kunnen dus gelijktijdig uitgevoerd worden. Op klassieke computersystemen zijn de mogelijkheden om berekeningen pa- rallel uit te voeren echter beperkt. Een FPGA heeft veel meer mogelijkheden tot parallellisatie. De configuratie van een FPGA voor het versnellen van een specifieke taak noemt men hardware- acceleratie. Voor het configureren van een FPGA wordt traditioneel gebruik gemaakt van beschrijvende talen zoals VHDL en Verilog. Deze talen zijn ontwikkeld om digitale logische schakelingen te beschrijven die geconfigureerd moeten worden in de FPGA. Door de opbouw van deze talen is het echter moeilijk om een geavanceerd algoritme op een duidelijk leesbare manier weer te geven. HLS maakt gebruik van klassieke algoritmische talen, zoals C of C++. In deze talen kan het gewenste algoritme in een meer begrijpbare vorm worden uitgeschreven. De HLS-synthese- software dit algoritme om naar een traditionele beschrijvende taal, die dan met de klassieke FPGA-toolset verder kan worden verwerkt. Hoofdstuk 2

Densiteit-heatmaps

2.1 Heatmaps

Op bladzijdes 538-539 van [2] staat het volgende te lezen: Een heatmap is een matrix van waarden die een kleur kregen toegekend, meestal zo dat hogere waarden helderder en lagere waarden donkerder zijn, naar analogie met temperatuur. De kolommen en de rijen van de matrix hebben over het algemeen een betekenis. In de genetica kunnen de kolommen en rijen genen en subjecten voorstellen en wel zo dat een heldere kleur in een cel betekent dat dit gen zich sterk uit bij dat subject. Meestal zijn de rijen en kolommen gegroepeerd diegenen in dezelfde groep naast elkaar staan; dit leidt tot figuren die bestaan uit homogene rechthoeken. (i.e. Figuur 2.1)

Een concept dat hiermee gerelateerd is, is dat kleur de densiteit van punten kan voor- stellen. In een scatter-plot van een grote dataset kunnen punten dicht bij elkaar liggen

Figuur 2.1: Heatmap van uitingswaarden van genen [3] De heatmap toont uitdrukkingswaarden die afgebeeld worden door een kleurschaal van weinig (groen) naar veel uitdrukking (rood). De experimenten werden geordend volgens een hiërarchisch dendrogram. De volgorde van de genen en de kleur van de gen identificaties is bepaald met QT clustering.

19 20 HOOFDSTUK 2. DENSITEIT-HEATMAPS

in sommige regios en dun verspreid zijn in andere regios. In zulke gevallen kan een lokale densiteit van datapunten per oppervlakte-eenheid worden toegekend aan recht- hoekige gebieden en kunnen de densiteitswaarden worden gediscretiseerd en voorgesteld door kleuren, helder voor hoge densiteit en donker voor lage densiteit.

Door heatmaps op basis van densiteit te gebruiken kunnen grote datasets in een geografische context beter gevisualiseerd worden. Zo heeft een groep onderzoekers van de universiteit van Illi- nois de volledige Engelse versie van Wikipedia verwerkt om er van alle vermeldingen van ”armed conflict” de geografische locatie en de emotionele stemming rond het jaar 2003 uit te extraheren [4]. Van deze data werd een emotie-heatmap opgebouwd door middel van spatiale analyse (kernel den- sity estimation en spatiale interpolatie). Figuur 2.3 toont ons de wereld van ”armed conflict” anno 2003 volgens Wikipedia door middel van een point cloud waar elke vermelding wordt voorgesteld door een gekleurd punt. Figuur 2.4 toont dezelfde dataset door middel van de emotie-heatmap die beschreven wordt in de paper. Op de point cloud wordt het door het grote aantal punten moeilijk om trends waar te nemen. Op de heatmap daarintegen vallen direct de meest besproken gebieden op. Een voordeel van het gebruik van densiteit is dat de schaalfactor van de visualizatie minder invloed zal hebben op de waarneembaarheid van trends. In [5] wordt een klassiek voorbeeld om de efficiëntie van visualisatie door punten te demonstreren gebruikt: de ”John Snow Map”. Deze geeft de doden ten gevolge van de cholera epidemie in 1854 in Londen weer. Er werd een hogere puntdensiteit waargenomen in de buurt van een pomp in het Soho dostrict. Hierdoor kon John Snow deze pomp als oorzaak van de epidemie identificeren. In Figuur 2.2 a is een scatter-plot van deze data afgebeeld. Hierin zijn duidelijke gebieden herkenbaar waar de densiteit van de punten hoger is. Als de geografische schaal van de kaart echter wordt verkleind zoals in Figuur 2.2 b wordt zichtbaar dat het veel moeilijker is om deze verschillen in densiteit waar te nemen. Een densiteit-heatmap van deze data in de oorspronkelijke schaal en de kleinere schaal is te zien in respectievelijk Figuren 2.2 c en d. Ondanks de schaalverkleining zijn de dense gebieden nog steeds goed te herkennen.

(a) (b)

(c) (d)

Figuur 2.2: Visualisatie van de data van de cholera-epidemie in 1854 in Londen [5] (a) 512x512 kaart van de originele data, (b) 256x256 weergave, door occlusie is het moeilijk om dense gebieden te ontdekken, (c) 512x512 visualisatie met gebruik van een densiteitsfunctie, (d) 256x256 heatmap, zelfs op een lage resolutie zijn dense regios eenvoudig op te sporen. 2.1. HEATMAPS 21

Figuur 2.3: Point cloud visualisatie van ”armed conficlt” voor het jaar 2003 [4] Elke vermelding wordt afgebeeld door een gekleurd punt (helder groen is heel positief tot helder rood voor heel negatief)

Figuur 2.4: Emotie-heatmap voor het jaar 2003 [4] 22 HOOFDSTUK 2. DENSITEIT-HEATMAPS

Om een densiteit-heatmap op te stellen is er behoefte aan een wiskundige functie die de densiteit beschrijft en een methode om deze functie af te leiden uit de geleverde data.

2.2 Densiteit 2.2.1 De kansdichtheidsfunctie Een willekeurige grootheid X die f als kansdichtheidsfunctie heeft wordt verondersteld. De kans dat X in ] a , b [ ligt wordt gegeven door Vergelijking 2.1.[6, blz. 1]

Z b ∀a < b, P (a < X < b) = f(x)dx (2.1) a De kansdichtheidsfunctie f of densiteit is de waarde die afgebeeld wordt in de heatmap. Deze functie is echter zelden beschikbaar. In de plaats wordt een dataset gebruikt die bestaat uit waarnemingen van X. Uit deze waarnemingen zou de densiteit moeten worden berekend of, beter verwoord, benaderd.

2.2.2 Univariate Densiteitsbenadering De methodes om functies te benaderen kunnen opgedeeld worden in twee grote groepen: parame- trisch en niet-parametrisch.

Parametrische densiteitsbenadering Als de kansdichtheidsfunctie behoort tot een gekende parametrische distributiefamilie kan parametrische densiteitsbenadering toegepast worden. Bij- voorbeeld, veronderstel dat geweten is dat de densiteitsfunctie van de vorm is van de normale distributie met gemiddelde µ en variantie σ2 (Vergelijking 2.2). De parameters µ en σ2 kunnen worden benaderd aan de hand van de waargenomen data en deze benaderingen in de formule voor de normale densiteit substitueren. Parametrische densiteitsbenadering vereist dat de distributie van de waarnemingen voldoet aan strakke voorwaarden.[6, blz. 1] Aan deze voorwaarden kan men vaak niet voldoen.

1x − µ2 1 − f(x) = √ e 2 σ (2.2) σ 2π

Niet-parametrische densiteitsbenadering In 1951 waren Fix en Hodges [7] (opnieuw gepu- bliceerd in 1989 [8]) de eerste om het probleem van densiteitsbenadering aan te pakken zonder onderstellingen te maken over parametrisch vorm. De enige veronderstelling die gemaakt wordt is dat de waargenomen waarden beschikken over een densiteitsfunctie. De densiteitsfunctie hoeft echter niet te behoren tot een bepaalde parametrische familie. [6, blz. 1, 2] De grotere vrijheid die niet-parametrische densiteitsbenadering biedt is de reden waarom deze zal gebruikt worden voor het opbouwen van de heatmaps. Als de densiteitsfunctie aan strikte vorm-voorwaarden zou moeten voldoen zou dit de inzetbaarheid drastisch verminderen. In het volgende deel zullen enkele methoden voor niet-parametrische densiteitsbenadering voorgesteld worden.

2.2.3 Niet-parametrische densiteitsbenadering Histogram

De oudste en meest gebruikte densiteitsbenadering is het histogram. Gegeven een oorsprong x0 en een klassebreedte (bin width) h, worden de klassen van het histogram gedefinieerd als de intervallen [ x0 + mh , x0 + (m + 1)h [ met integers m. De densiteitsbenadering van het histogram kan dan geschreven worden als 2.2. DENSITEIT 23

#X in zelfde klasse x fˆ(x) = i met X , ..., X , ..., X waarnemingen n · h 1 i n n het aantal observaties in de set (2.3) h de klassebreedte (bepaald afvlakking) Een meer algemene vorm kan verkregen worden door de klassebreedte toe te laten te variëren: #X in zelfde klasse x fˆ (x) = i (2.4) d n · breedte van klasse die x bevat Merk op dat, om een histogram te construeren, zowel een oorsprong als een klassebreedte moet worden gekozen. De klassebreedte kan op voorhand vast worden gelegd of ze kan afhankelijk zijn van de data. [6, blz. 9, 10]

Afvlakking De klassebreedte zal de graad van afvlakking bepalen. Hoe groter de afvlakking hoe duidelijker grote trends zullen worden. Ook zal eventuele ruis op de waarnemingen minder invloed hebben. Details kunnen echter onzichtbaar worden. Minder afvlakking zal dan weer lijden tot meer ruis, maar details zullen beter zichtbaar zijn. Deze afweging zal bij elke soort densiteitsbenadering moeten worden gemaakt.

Optimale afvlakking Hoe goed een densiteitsbenadering is kan uitgedrukt worden door de "Mean Integrated Square Error"(MISE [6, blz. 38-40]). Vanuit de MISE kan mathematisch de optimale afvlakking bepaald worden. Deze optimale afvlakking is terug te vinden in [6, blz. 40]. Zonder in detail te gaan worden enkele waarnemingen meegegeven. De optimale afvlakking is afhankelijk van de densiteit, van de data, die zou moeten worden benaderd. Dit maakt de opti- male afvlakking dus niet praktisch bruikbaar, vermits de densiteit niet gekend is. Wel kan worden afgeleid dat de optimale afvlakking heel langzaam naar 0 convergeert voor groter wordende waar- nemingsaantallen. De optimale afvlakking zal ook kleiner zijn bij densiteiten die veel fluctueren.De conclusie is dat de ideale afvlakking afhankelijk zal zijn van de data, wat de bedoeling is zichtbaar te maken en persoonlijke voorkeur.

Een grote zwakte van het histogram is de keuze van de oorsprong. In Figuur 2.5 is twee maal dezelfde data weergegeven in histogrammen met gelijke klassebreedte, maar met een andere oor- sprong. De grafiek toont de lengte van een behandeling. Terwijl in het eerste histogram de kortste behandelingsduur duidelijk het vaakst voor komt, lijkt het tweede histogram aan te tonen dat dit niet zo is. De tweede grafiek toont ook een daling van het voorkomen van een behandeling van ca. 200 dagen, terwijl dit in de eerste grafiek helemaal niet zichtbaar is.

Figuur 2.5: Histogrammen van de behandeltermijn in een zelfmoordstudie [6, blz. 11]

In het algemeen kunnen histogrammen worden omschreven als weinig nauwkeurig, met een grote afhankelijkheid van de oorsprong. Bij data in meerdere dimensies komt hierbij ook nog een afhankelijkheid van de keuze van de richting van de assen. 24 HOOFDSTUK 2. DENSITEIT-HEATMAPS

De ”naive estimator” Uit de definitie van de densiteit (Vergelijking 2.1) kan worden afleid dat als een willekeurige variabele X densiteit f heeft dat

P (x − h < X < x + h) f(x) = lim (2.5) h→0 2h P (x − h < X < x + h) kan worden benaderd door het aandeel van de waarnemingen dat in ] x − h , x + h [ valt. Door h klein te kiezen wordt een vanzelfsprekende densiteitsbenadering bekomen:

#X in ] x − h , x + h [ fˆ(x) = i (2.6) 2 · h · n Dit wordt de ”naive estimator” of naïve benadering genoemd. De kan ook worden geschreven als

n ( 1 1 X 1 x − Xi als |x| < 1 fˆ(x) = w( ) met w(x) = 2 (2.7) n h h 0 anders i=1 w(x) wordt de gewichtsfunctie genoemd. Uit deze vorm valt duidelijk te begrijpen dat de benadering opgebouwd wordt door een box te plaatsen op elke waarneming en deze te sommeren. De boxen hebben als breedte 2h en als hoogte 1/(2nh). De naive estimator heeft een duidelijke relatie met het histogram. Stel een histogram met klassebreedte 2h. In het midden van elke klasse zal fˆ(x) gelijk zijn aan de hoogte van die klasse. De naive estimator kan dus worden gezien als een histogram waar elke waarneming in het midden van een klasse valt. Op deze manier is het histogram bevrijdt van zijn afhankelijkheid van de keuze van de oorsprong. De keuze van h blijft en zal de afvlakking bepalen. [6, blz. 11, 12] In Figuur 2.6 is de verdeling van de duurtijd van de uitbarstingen van de geiser Old Faithfull te zien. In de linkse figuur is een histogram gebruikt, terwijl in rechtse figuur gebruik werd gemaakt van de naive estimator. De hogere nauwkeurigheid van de naive estimator valt direct op. De naive estimator heeft echter, net als het histogram, duidelijke discontinuiteiten, wat niet mooi oogt. Het stapsgewijze karakter van de naive estimator houdt ook een zekere wiskundige onjuistheid in.

Figuur 2.6: Benaderingen van de duurtijd van uitbarstingen van de ”Old Faithfull” [6, blz. 9, 13]

De ”kernel estimator” Het is eenvoudig om de naive estimator te veralgemenen om een aantal nadelen die hierboven aangehaald werden te verhelpen. Vervang de gewichtsfunctie w door een kernel functie K die voldoet aan 2.2. DENSITEIT 25

Z +∞ K(x)dx = 1 (2.8) −∞ Meestal, maar niet altijd, zal K een symmetrische kansdichtheidsfunctie zijn, zoals de normale densiteit of de gewichtsfunctie van de naive estimator. Naar analogie met de naive estimator in Vergelijking 2.7 wordt de kernel estimator met kernel K gedefinieerd: n   1 X x − Xi fˆ(x) = K (2.9) nh h i=1 Parameter h wordt de vensterbreedte, de afvlakkingsparameter of de bandbreedte genoemd. Zoals de naive estimator kon worden beschreven als een som van boxen, kan de kernel estimator worden beschreven als een som van ”bumps”. De kernel functie K bepaalt de vorm van de de bump, terwijl de vensterbreedte h hun breedte bepaalt. [6, blz. 13, 15] Het effect van de vensterbreedte wordt geïllustreerd in Figuur 2.7. De kernel estimator werd toegepast op een pseudo-willekeurige set van 200 monsters, genomen van een bimodale densiteit, zoals te zien in Figuur 2.7 d. De normale densiteit werd gebruikt als kernel. Als de vensterbreedte te klein wordt gekozen dan wordt ruis zichtbaar. Met een grote h zal het bimodale karakter van de distributie vervagen.

(a) (b)

(c) (d)

Figuur 2.7: Kernel-benadering van een bimodiale densiteit [6, blz. 16] Benadering op basis van 200 gesimuleerde datapunten getrokken uit een bimodiale densiteit. Vensterbreedtes: (a) 0,1; (b) 0,3; (c) 0,6 (d) De bimodiale densiteit

De kernel estimator zal de continuïteit en gladheid overnemen van de kernel K. Als K een kansdichtheidsfunctie is (voldoet aan Vergelijking 2.8 en overal positief is) zal fˆ zelf ook een kans- dichtheidsfunctie zijn. Dankzij deze eigenschappen kan het discontinue en stapsgewijze karakter van de naive estimator worden verholpen. De kernel estimator heeft echter nog steeds een nadeel als hij gebruikt wordt voor ver uitlopende distributies. Doordat de vensterbreedte vastligt over de gehele distributie ontstaat de neiging tot 26 HOOFDSTUK 2. DENSITEIT-HEATMAPS het ontstaan van ruis in de uiteinden. Als de afvlakking verhoogt, worden details in het zwaarste deel van de distributie gemaskeerd. Om dit probleem op te lossen bestaan verschillende adaptieve technieken. Verdere methoden voor dichtheidsbenadering worden in deze masterproef echter niet besproken. Meer informatie kan men vinden in [6] en [9].

De optimale kernel Zoals reeds eerder vermeld kan hoe goed een densiteitsbenadering is wor- den uitgedrukt door de ”Mean Integrated Square Error” (MISE). Hieruit volgden enkele waar- nemingen over de grootte van de afvlakking h (zie bladzijde 23). Op dezelfde manier kan de optimale kernel worden afgeleid uit de MISE. Deze kernel werd voor het eerst voorgesteld voor densiteitsbenadering in 1969 door Epanechnikov en wordt dan ook vaak de Epanechnikov kernel genoemd. [6, blz. 41, 42]

 3  1  √ √  √ 1 − t2 − 5 ≤ t ≤ 5 4 5 5 Ke(t) = (2.10)  0 anders

Keuze van de kernel Als de efficiëntie van een kernel wordt gedefinieerd door die kernel te vergelijken met de Epanechnikov kernel, worden voor enkele kernels de waarden in Tabel 2.1 bekomen. Het valt op dat ondanks hun heel verschillende vorm (Figuur 2.8) en complexiteit (Tabel 2.1) hun efficiëntie altijd dicht bij 1 ligt. Dit betekent dat de keuze van een kernel beter gebaseerd wordt op andere eigenschappen van de kernel, zoals de complexiteit en de vorm.

Kernel K(t) Efficiëntie

 3  1  √  √ 1 − t2 |t| ≤ 5 4 5 5 Epanechnikov 1  0 anders

( 1 − |t| |t| ≤ 1 Driehoekig 0.9859 0 anders

1 − 1 t2 Gaussiaans √ e 2 0.9512 2π

1  |t| ≤ 1 Rechthoekig 2 0.9295 0 anders

Tabel 2.1: Kernels en hun efficiëntie vergeleken met de Epanechikov kernel [6, blz. 43]

2.2.4 Multivariate kernel densiteitsbenadering De densiteit in vorige sectie werd altijd benaderd als univariaat: slechts afhankelijk van één va- riabele. Een heatmap beschikt echter over twee variabelen waarvan de densiteit afhankelijk is. 2.2. DENSITEIT 27

Epanechikov Driehoekig 1 1

0.8 0.8

0.6 0.6 ) ) t t ( ( K 0.4 K 0.4

0.2 0.2

0 0 −2 0 2 −2 0 2 t t Gaussiaans Rechthoekig 1 1

0.8 0.8

0.6 0.6 ) ) t t ( (

K 0.4 K 0.4

0.2 0.2

0 0 −2 0 2 −2 0 2 t t

Figuur 2.8: Afbeelding van 4 kernels 28 HOOFDSTUK 2. DENSITEIT-HEATMAPS

De x- en de y-as, of de longitude en de latitude in een geografische context. Daarom moet de densiteitsbenadering worden omgezet naar een multivariate vorm. De algemene vorm van de product kernel estimator in een d-dimensionale ruimte wordt gegeven door   n d   1 X Y xj − (Xi)j  fˆ(x) = K (2.11) nh . . . h h 1 d i=1 j=1 j  Merk op dat de multidimensionale variabele x afgebeeld wordt met een romeinse letter in tegenstelling tot zijn ééndimensionale tegenhanger x. Hetzelfde principe is van toepassing op de multidimensionale waarnemingen Xi ten opzichte van Xi welke ééndimensionaal zijn. Ku is hier de univariate kernel zoals degene die tot nu toe gebruikt werden. Als in elke dimensie dezelfde vensterbreedte h wordt toegepast kan Vergelijking 2.11 vereen- voudigd worden tot   n d   1 X Y xj − (Xi)j  fˆ(x) = K (2.12) nhd h i=1 j=1 

Deze vorm kan ook geschreven worden in functie van de product kernel Kp. n   1 X x − Xi fˆ(x) = K (2.13) nhd p h i=1

Kp kan dan uit de univariante kernel afgeleid worden met

d Y Kp(x) = Ku(xj) (2.14) j=1 De product kernel is één methode om tot een multivariante kernel te komen. Er bestaan ook kernels die multivariant gedefinieerd zijn, zoals de Epanechnikov kernel: 1  c−1(d + 2)(1 − xT x) xT x < 1 2 d Ke(t) = (2.15) 0 anders waar cd het volume is van de d-dimensionale eenheidsbol: c1 = 2, c2 = π, c3 = 4π/3, enz. In Figuur 2.9 zijn vier veelgebruikt kernels gevisualiseerd. Het zijn multivariante vormen van de eerder aangehaalde univariante kernels. x werd 2-dimensionaal gekozen, bestaande uit variabele x en y.

2.3 Algoritmische eigenschappen van heatmaps

Een grafische weergave gebeurt in digitale electronica en computers aan de hand van een raster met kleurwaarden. De velden met kleurwaarden in dit raster zijn algemeen bekend als pixels. De heatmap die het resultaat is van een digitaal algoritme zal dus een tabel of matrix zijn met waarden die overeenkomen met een bepaalde kleurwaarde. De densiteitsfunctie die wordt afgebeeld op de heatmap is een continue functie. Om tot een matrix van waarden te komen zal de densiteitsfunctie moeten worden bemonsterd. De bemon- stering zal gebeuren op de locatie van de pixels. Hoe hoger de resolutie, hoe nauwkeuriger de bemonstering en dus ook de weergave zal zijn. Voor het berekenen van de heatmap wordt gebruik gemaakt van de kernel density estimator. Deze is eenvoudig te interpreteren vanuit algoritmisch standpunt. Vergelijking 2.9, de definitie van de kernel estimator, wordt hernomen maar in zijn multivariante vorm. 2.3. ALGORITMISCHE EIGENSCHAPPEN VAN HEATMAPS 29

Epanechikov Driehoekig

1 1 ) ) 0.5 0.5 x, y x, y ( ( K K 2 2 0 0 −2 0 −2 0 −1 0 −1 0 1 2 y 1 2 y x −2 x −2  2 (  (1 − (x2 + y2)) x2 + y2 < 1 1 − |x| − |y| + |xy| |x| < 1 en |y| < 1 K(x, y) = π K(x, y) = 0 anders 0 anders

Gaussiaans Rechthoekig

1 1 ) ) 0.5 0.5 x, y x, y ( ( K 2 K 2 0 0 −2 0 −2 0 −1 0 −1 0 1 2 y 1 2 y x −2 x −2 1 2 2 1 − x +y  |x| < 1 en |y| < 1 K(x, y) = e 2 K(x, y) = 4 2π 0 anders

Figuur 2.9: Afbeelding van 4 multivariate kernels 30 HOOFDSTUK 2. DENSITEIT-HEATMAPS

n   1 X x − Xi fˆ(x) = K (2.16) nh h i=1

Onafhankelijkheid tussen waarnemingen De bijdrage van elke waarneming Xi aan de dicht- heidsbenadering is volledig onafhankelijk van elke andere waarneming. Dit betekent dat elke waarneming, elk datapunt, onafhankelijk kan worden behandeld. Er wordt gestart met een lege heatmap waarin elke locatie waarde 0 heeft. Het resultaat van de behandeling van één waarneming wordt dan opgeteld bij deze heatmap om het uiteindelijke eindresultaat te bekomen. Doordat de bijdrage van de waarnemingen onafhankelijk is, kunnen de bijdragen van verschillende waarne- mingen gelijktijdig berekend worden.

Beperkt bereik van kernel De berekening van de bijdrage van één waarneming bestaat uit het samplen van de gekozen kernel voor elke pixel van de heatmap. Veel kernels hebben echter slechts voor een beperkt bereik een waarde verschillend van nul. Van de kernels die in voorgaande secties als voorbeeld werden aangehaald is enkel de normale kernel onbeperkt. Als de waarde van de kernel nul is betekent dit dat er op die positie geen wijziging hoeft te gebeuren aan de heatmap. Deze locaties kunnen dus genegeerd worden, dit zal het aantal berekeningen natuurlijk drastisch verminderen. Het heeft ook tot gevolg dat slechts een beperkt deel van de heatmap moet gemanipuleerd worden.

Berekening bijdrage van één waarneming Zoals reeds aangehaald bestaat de berekening van de bijdrage van één waarneming uit het samplen van de gekozen kernel voor elke pixel van de heatmap. Deze sampleberekeningen zijn onderling onafhankelijk en kunnen dus gelijktijdig gebeuren.

Complexiteit van kernel Zoals te zien in Tabel 2.1 is de wiskundige complexiteit van verschil- lende kernels heel uiteenlopend. Digitale systemen kunnen traditioneel slechts enkele bewerkingen efficiënt uitvoeren, zoals de som, het verschil en de vermenigvuldiging met machten van twee (bit-shift). Andere bewerkingen zijn complexer en vergen meer tijd (klokcycli), zoals de verme- nigvuldiging en deling. Sommige bewerkingen zijn heel complex en worden vaak geïmplementeerd als een combinatie van andere, eenvoudigere bewerkingen, zoals machten en vierkantswortels. De keuze van de kernel zal dus een grote invloed hebben op de rekentijd die nodig is voor een sam- plename.

Besluit Het berekenen van een heatmap door gebruik te maken van de kernel density estimator bestaat uit berekeningen die onafhankelijk zijn op twee niveau’s:

• Eén waarneming bestaat uit een verzameling onafhankelijke berekeningen

• Waarnemingen zijn onderling onafhankelijk

Deze onafhankelijke berekeningen kunnen gelijktijdig uitgevoerd worden. Er wordt gezegd dat de berekeningen parallel kunnen uitgevoerd worden, er is dus veel mogelijkheid tot parallellisme. De complexiteit van de berekeningen hangt af van de keuze van de kernel. Het parallelle karakter van het opbouwen van een heatmap is de reden om een FPGA als platform voor deze masterproef te kiezen. Dit wordt verduidelijkt in het volgende hoofdstuk. Hoofdstuk 3

FPGA

3.1 Historiek

De basis van digitale elektronische schakelingen zijn logische poorten. Aan de hand van één of meerdere invoersignalen worden één of meerdere uitvoersignalen gegenereerd. Deze uitvoersignalen worden bepaald aan de hand van een logisch ontwerp dat opgebouwd wordt uit logische poorten, zoals de fundamentele logische poorten AND, OR, NAND, NOR en NOT. [10, blz. 59] Logische poorten zijn beschikbaar als IC’s (”Integrated Circuit”: Geïntegreerde schakeling, een logische schakeling die uitgevoerd is in één chip), zoals de klassieke 7408 welke 4 AND-poorten bevat. Door IC’s te combineren kan men digitale schakelingen opbouwen. Bij een complexe schakeling leidt dit echter tot een groot aantal componenten die een grote oppervlakte zullen beslaan.[10, blz. 67, 104] Een alternatief is om het logisch ontwerp te implementeren in een ASIC, een ”Application Specific Integrated Circuit”. Dit is een IC die, zoals de naam het zegt, bedoelt is voor één toepassing. De opstartkost van de productie hiervan is hoog en de digitale schakeling ligt vast eenmaal de chip geproduceerd is. Dit betekent dat de functionaliteit onveranderlijk vast ligt. Eén van de eerste commerciële alternatieven voor een klassieke digitale schakeling maakte begin jaren 1970 zijn opmars. De microproccesor biedt een grote flexibiliteit en is wijd inzetbaar. Het logisch ontwerp van een microproccesor mag dan wel vastliggen, de programmacode waarmee de processor wordt aangestuurd kan naar believen worden aangepast. Het grootste nadeel van deze multifunctionele microprocessoren is echter dat aan snelheid wordt ingeboet. Een ASIC kan eenzelfde taak vele malen sneller afhandelen. Midden de jaren 1960 zag een ander concept het levenslicht: de PLD of ”Programmable Logic Device”. In PLD’s kunnen bestaande circuits aangepast worden door ze te configureren. Harris Semiconductor ontwikkelde de eerste PLD, de ”fuse configurable diode matrix”. Diodes in een ma- trix verbonden horizontale lijnen met verticale lijnen. De verbindingen konden verbroken worden door stroompulsen tijdens het configureren.[11, blz. 421] In 1970 werd hieruit het eerste PROM (Programmable Read-Only Memory) ontwikkeld. Een geheugen associeerd addressen met waarden. Door de addressen te zien als invoersignalen en de waarden te zien als uitvoersignalen kon een geheugen een logische schakeling implementeren.[11, blz. 421] De waarden hoeven nog niet gekend te zijn bij productie, maar kunnen achterof (eenmalig) worden geconfigureerd. Hierdoor kon de IC aangepast worden aan een specifieke toepassing zonder de hoge opstartkosten van een ASIC. Het principe van de PLD werd verder ontwikkeld en in 1975 presenteerden Intersil en ongeveer gelijktijdig de eerste FPLA’s: ”Field ”. Deze werden echter nooit een groot commercieel succes: ze werden aanzien als duur, complex en slecht gedocumen- teerd. Monolithic Memories Inc. bracht later, in 1978, de PAL (””) op de markt. Deze werd door zijn eenvoudig gebruik een groot succes.[11, blz. 421] Het principe van beide systemen is afgebeeld in Figuren 3.1 en 3.2.

31 32 HOOFDSTUK 3. FPGA

Figuur 3.1: PLA architectuuur [10, blz. 109]

Figuur 3.2: PAL architectuuur [10, blz. 109] 3.2. STATE OF THE ART 33

PLD’s werden steeds complexer met de introductie van CPLD’s (”Complex Programmable Logic Devices”) door en FPGA’s ("Field Programmable Gate Array") door Xilinx, beide in 1984 [12, blz. 37, 50]. CPLD’s combineren verschillende PAL’s, macrocells genoemd, die allemaal verbonden kunnen worden via een configureerbare interconnectie-matrix. Door hun niet-volatiele karakter wordt de geconfigureerd logica bewaard als de IC geen spanning meer krijgt. [10, blz. 110] Vandaag nog worden CPLD’s verkocht die kunnen lopen tot honderden in- en uitgangen en meer dan 1000 macrocells, dit zijn IC’s met meer dan 10000 configureerbare logische poorten. Terwijl CPLD’s nog steeds gebasseerd zijn op het combineren van AND- en OR-poorten maken FPGA’s gebruik van LUT’s (”Look-Up Table”). Een LUT is simpelweg een waarheidstabel die alle mogelijke invoercombinaties met de gewenste bijhorende uitvoer bevat. Door gebruik te maken van LUT’s kunnen producenten veel densere PLD’s maken met het equivalent van honderden keren het aantal logische poorten dat een CPLD bevat. Het grootste nadeel van FPGA’s is dat ze meestal uitgevoerd zijn met SRAM-technologie, welke volatiel is. De geconfigureerde logica gaat dus verloren als de IC niet langer onder spanning staat. [10, blz. 110-112]

3.2 State of the Art

FPGA’s werden oorspronkelijk gebruikt voor discrete logica, maar hun werkgebied is uitgebreid naar signaalverwerking en high-performance embedded computing. De recentste trend is hun gebruik als accelerators in high-performance computing. De moderne FPGA bestaat uit configureerbare logische blokken (met Look-Up Tables en Flip- Flops), DSP-blokken (Digital Signal Processing: Digitale Signaalverwerking), geheugen-blokken en eventueel traditionele CPU-blokken die allemaal zijn verbonden op een extreem flexibele manier. In Tabel 3.1 uit [13] worden de eigenschappen van 4 gangbare architecturen voor high-perform- ance computing vergeleken. De verwerkingssnelheid wordt uitgedrukt in Flops: ”Floating point operations per second”. De FPGA komt hier naar voor met een vrij gemiddelde performantie en prijs per performantie. Het verbruik is echter duidelijk het laagst, te zien aan het hoge aantal Gigaflops/watt. Wat echter niet naar voor komt in Tabel 3.1 is de hoge flexibiliteit van de FPGA. De floating- point operaties zijn heel traditionele CPU-bewerkingen. Maar de FPGA kan door zijn flexibele interconnectie geavanceerde, niet-standaard bewerkingen uitvoeren in minder klokcycli ten op- zichte van de meeste andere architecturen. Een belangrijke ontwikkeling om high-performance computing op FPGA toegankelijk te maken is de ontwikkeling van HLS. [13] verwijst nog naar de tijd en de kost van het configureren van FPGA’s met VHDL en Verilog als grootste minpunt. Dit is omdat deze talen gericht zijn op het ontwerp van logische schakelingen. Ze zijn niet vlot toegankelijk voor computerprogrammeurs. Door HLS (”High Level Synthesis”: hoog niveau synthese) wordt het mogelijk om accelerators te ontwikkelen in traditionele programmeertalen zoals C of C++. Ook typische parralel processing- talen zoals OpenCL behoren tot de mogelijkheden.

3.3 De FPGA als accelerator

In deze masterproef wordt de FPGA gebruikt als een accelerator. Dit houdt in dat de FPGA, binnen een groter systeem, een specifieke bewerking zal uitvoeren. De bedoeling is dat, door de specifieke mogelijkheden van de FPGA, deze bewerking sneller wordt uitgevoerd dan op de traditionele CPU van een computer. Op deze manier versnelt of accelereert de FPGA het volledige systeem. De keuze voor deze werkwijze hangt af van het algoritme dat moet uitgevoerd worden. De FPGA heeft namelijk sterke en zwakke punten ten opzichte van een traditionele CPU. 34 HOOFDSTUK 3. FPGA

GPU CPU CBEA FPGA (AMD/NVIDIA) Symmetric Symmetric Heterogeneous Heterogeneous Composition multicore multicore multicore multicore

Full cores 4 – 1 2

2016 DSP Accelerator cores 0 10/30 8 slices Intercore Explicit Cache None Mailboxes communication wiring

SIMD width 4 64/32 4 Configurable

Additional parallelism ILP VLIW/Dual-issue Dual-issue Configurable

Float operations 16 1600/720 36 520 per cycle

Frequency (GHz) 3.2 0.75/1.3 3.2 <0.55

Single precision 102.4 1200/936 230.4 550 gigaflops Double:single 1:2 1:5/1:12 1:2 1:4 precision performance

Gigaflops/watt 0.8 5.5/5 2.5 13.7

Megaflops/USD 70 800/550 >46 138

Accelerator N/A 109/102 204.8 N/A bandwidth (GB/s) Main memory 25.6 8 25.6 6.4 bandwidth (GB/s) Maximum memory System 24 2/4 16 size (GiB) dependent

ECC support Yes No Yes Yes

Tabel 3.1: Oplijsting van architecturale eigenschappen [13] De cijfers zijn van actuele hardware (artikel uit 2010) en de vermeldingen zijn per fysische chip. De CPU is een Core i7-965 Quad Extreme, de AMD GPU is een FireStream 9270, de NVIDIA GPU is een Tesla C1060, de CBEA is de IBM QS22 blad en de FPGA is de Virtex-6 SX475T. 3.3. DE FPGA ALS ACCELERATOR 35

3.3.1 Parallellisme De CPU is gespecialiseerd in het uitvoeren van sequentiele bewerkingen. Bewerkingen worden dus één voor één uitgevoerd. Dit betekent dat het eenvoudig is om meerdere bewerkingen na elkaar op dezelfde data uit te voeren. Ook kan het uitvoeren van bewerkingen op de data afhankelijk zijn van de waarde van de data. Er kan ruwweg gesteld worden dat de CPU één bewerking uitvoert per klokpuls. Hoe hoger de klokfrequentie hoe meer bewerkingen. Kloksnelheden van 3 Ghz of meer zijn niet ongewoon. Als op meerdere waarden dezelfde bewerking moet uitgevoerd worden zal de CPU deze waarden één voor één moeten verwerken, aan het tempo van de klokfrequentie. Voor FPGA’s gelden kloksnelheden rond 600 MHz als de bovengrens. Voor het uitvoeren van dezelfde sequentiele bewerkingen als de CPU zal de FPGA dan ook veel slechter presteren. De situatie verandert echter als eenzelfde bewerking moet uitgevoerd worden op meerdere waarden. Dan kan deze bewerking meerdere keren worden geconfigureerd in de FPGA. Op deze manier voert de FPGA meerdere bewerkingen parallel uit per klokcyclus, terwijl de traditionele CPU slechts één bewerking per klokcyclus uitvoert. Dit is een sterk vereenvoudigd beeld van de werking van CPU’s en FPGA’s, de realiteit is een stuk complexer. Maar dit verandert niets aan de conclusie die hieruit kan worden getrokken. De keuze voor een FPGA als accelerator zal afhangen van de mogelijkheid tot parallellisme dat het uit te voeren algoritme heeft. Een hardware-accelerator wordt slechts interessant als er een groot aantal onafhankelijke bewerkingen parallel kunnen uitgevoerd worden.

3.3.2 Flexibiliteit CPU’s hebben een instructieset die vast ligt. Een algoritme moet vertaald worden naar een sequentie van instructies uit de beschikbare instructieset. Een CPU is een bijzonder complexe logische schakeling. Elk van de instructies in de instructieset komt overeen met een deel van deze logische schakeling en zal bijzonder vergaand geoptimaliseerd zijn. Als een bewerking niet deel uitmaakt van de instructieset moet deze bewerking omgezet worden naar een sequentie van instructies met hetzelfde resultaat. Wat wil zeggen dat het aantal nodige klokcycli de som zal zijn van de nodige instructies. Voor veel bewerkingen is er echter een betere logische implementatie mogelijk dan de combinatie van instructies in een CPU. Door zijn configureerbaarheid kan in een FPGA een optimale implementatie gebruikt worden van de gewenste bewerking. Vaak zal deze implementatie een zelfde bewerking in minder klokcycli kunnen uitvoeren. Ook is een FPGA niet gebonden aan bepaalde data-breedtes. In een CPU wordt gebruik gemaakt van 8-bit, 16-bit, 32-bit, 64-bit en in sommige gevallen 128-bit waardes. Vaak zal de nauwkeurigheid die voor de applicatie nodig is niet precies overeenkomen met één van deze moge- lijkheden. In een FPGA kan de nauwkeurigheid vrij gekozen worden. De implementatie van het algoritme kan dan ook geoptimaliseerd worden voor de gewenste nauwkeurigheid. Dit komt zowel het verbruik als de snelheid ten goede. 36 HOOFDSTUK 3. FPGA Hoofdstuk 4

HLS: High Level Synthesis

4.1 Klassieke Design Methoden

PLD’s zoals de FPGA bevatten enorme hoeveelheden digitale logica. Deze logica is echter niet geconfigureerd om een bepaalde functie uit te voeren. Voor het genereren van de binaire code nodig om deze logica te configureren bestaan verschillende mogelijkheden. Bij de eerste generaties PLD’s werd deze binaire code met de hand opgesteld. Deel van het succes van enkele populaire PLD’s was echter toe te wijzen aan ondersteunende software om deze taak te vereenvoudigen. Een eerste mogelijkheid is om de logica die geïmplementeerd moet worden te tekenen in een software-pakket. Deze software zet de getekende logica om in het binair bestand nodig voor het configureer-proces. Dit wordt ”schematic capture” genoemd. Een andere manier om de logica te definiëren is gebruik te maken van een ”Hardware Descrip- tion Language” (HDL). De gekendste voorbeelden hiervan zijn VHDL1 en Verilog. Bij gebruik van een HDL worden de in- en uitgangen en de logische processen beschreven aan de hand van een programmeertaal die van uitzicht veel lijkt op C++. Deze methode is moeilijker aan te le- ren, maar kan een krachtiger en eenvoudiger hulpmiddel zijn om complexe en repetitieve logica te definiëren.[10, blz. 105]

4.2 Niveau’s van abstractie

De 3 methode’s beschreven in vorige sectie bevinden zich op de drie klassieke niveau’s van ab- stractie die gebruikt worden in FPGA design:

Register-Transfer Level (RTL) Op het register-transfer niveau wordt een systeem gezien als een verzameling verbonden opslag-elementen en functionele blokken. Het gedrag van de logi- sche schakeling wordt beschreven als een opeenvolging van data-overdrachten en -transformaties (”Transfer”) tussen opslagelementen (”Register”). Dit is het niveau waarin HDL-talen werken. De HDL-talen bevatten data-types, logische en rekenkundige bewerkingen, hiërarchiën en veel ty- pische programmeer-structuren (zoals loops). Hardware is echter inherent parallel en werkt niet met één instructie die op een bepaald ogenblik wordt uitgevoerd. Verschillende modules in een systeem zullen gelijktijdig tezamen werken, wat goed ondersteund wordt in HDL-talen.

Logic Level Het logische niveau beschrijft het gedrag van de schakeling als registers en logische poorten. Dit is het niveau waarop ”schematic capture” werkt. Een synthese-tool kan de RTL beschrijving in een HDL taal omzetten naar een netlist in het logisch abstractie-niveau.

1VHDL staat voor VHSIC Hardware Description Language, hierin staan VHSIC voor Very High-Speed Integrated Circuit

37 38 HOOFDSTUK 4. HLS: HIGH LEVEL SYNTHESIS

Device Level Op het Device Level zijn de primitieven (Look-up Tables, geheugen blokken, I/O-blokken ...) en het interconnectie netwerk van de FPGA te vinden. Dit is het niveau waarop met de eerste PLD’s werd gewerkt. Er was geen abstractie van de eigenlijke hardware die werd geconfigureerd. De omzetting van de netlist naar een implementatie op het Device Level bestaat uit verscheidene optimalisatiestappen. Deze houden de hoeveelheid nodige primitieven laag en de afstanden tussen de primitieven kort.

4.3 HLS

Zoals de naam laat uitschijnen introduceert HLS (”High Level Synthesis”: Hoog Niveau Synthese) een nieuw abstractie niveau. Het logisch circuit wordt niet langer beschreven aan de hand van een opeenvolging van data-overdrachten en -transformaties tussen opslagelementen. Het logisch circuit wordt nu beschreven door een algoritme.

4.4 C++ in Xilinx Vivado HLS

In deze masterproef werd gewerkt met Xilinx Vivado HLS, in C++. Deze tool neemt een C++ functie, de ”top-level” functie, en synthetiseert hieruit een IP-blok, klaar om te gebruiken in de RTL-level tool van Xilinx. Hoe de synthese wordt uitgevoerd kan verder worden gestuurd met directieven. Dit zijn pragma’s die in de code worden toegevoegd.

4.4.1 Beperkingen De top-level functie kan geschreven worden in standaard C++, maar er gelden enkele beperkingen.

Aanroepen van besturingssysteem-functionaliteit Binnen de functie kan er geen bestu- ringssysteem aangesproken worden. Bewerkingen zoals het lezen en schrijven van bestanden is niet mogelijk. Ook de datum of de tijd kunnen niet worden opgevraagd. Dit is wel mogelijk in de test bench die kan geschreven worden om de functie uit te testen.

Dynamisch geheugengebruik Alle geheugen in de FPGA wordt vast toegewezen en het is niet mogelijk om dynamisch geheugens aan te maken of te verwijderen. Gebruik van malloc(), alloc() en free() zijn dus niet mogelijk. Ook het dynamisch creëren van objecten met new is niet ondersteund.

Pointers Het casten van pointers wordt niet ondersteund, tenzij voor standaard C data types (zoals int en char). Een array van pointers wordt ondersteund, maar de pointers mogen niet opnieuw naar pointers verwijzen (wel naar arrays met scalars).

Recursie Recursieve functies (functies die zichzelf aanroepen) worden niet ondersteund.

Standard Template Libraries Omwille van voorgaande beperkingen kunnen de C++ Stand- ard Template Libraries niet gesynthetiseerd worden.

Klassen Het gebruik van C++ klassen is ondersteund, net zoals polyformisme en virtuele func- tie. Deze laatste twee kunnen echter niet dynamisch zijn en moeten kunnen worden bepaald voor synthese.

Vuistregel Als vuistregel kan gesteld worden dat de grootte en de toewijzing van alle geheugen, objecten en functies voor synthese moet kunnen worden bepaald door de tool. Dit is omdat al deze zaken in de FPGA in een vaste hardware-structuur worden gegoten. 4.4. C++ IN XILINX VIVADO HLS 39

4.4.2 Interface De interface van het IP-blok dat wordt gegenereerd wordt bepaald door de argumenten van de top-level functie en mogelijke directieven die worden meegegeven. Afhankelijk van de toepassing kan voor eenvoudige argumenten gekozen worden voor directe draadverbindingen, verbindingen met handshake of met een data-valid-poort. Array argumenten worden gesynthetiseerd in een BRAM-interface voor willekeurige toegang. Elk type argument kan ook uitgevoerd worden als AXI-lite-slave, AXI-master of AXI-stream.

4.4.3 Optimalisatie De optimalisatie van de HLS-synthese wordt gestuurd door de gebruiker. Er moet namelijk een afweging gemaakt worden tussen de oppervlakte aan logica die gebruikt wordt en de verwerkings- snelheid. Deze keuze kan niet gemaakt worden door de software.

Loop Unrolling Een typische vorm van versnelling wordt bekomen door Loop Unrolling. for(int i=0; i < 5; i++) { for(int j=0; j < 10; j++) { an_array[i][j] *= 3; } } Als bovenstaande loop wordt gesynthetiseerd, wordt voor de vijftig iteraties één vermenigvul- digingsblok 50 keer gebruikt. De data wordt sequentieel verwerkt. Door de directieve UNROLL toe te voegen aan de binnenste loop zal de loop uitgevoerd worden als tien onafhankelijke verme- nigvuldigingen die parallel worden uitgevoerd. Dit vergt dan ook bijna tien keer zoveel logische blokken. Als ook de buitenste loop wordt unrolled worden alle vijftig vermenigvuldigingen parallel uitgevoerd. Dit geeft ons een versnelling van vijftig, maar de schakeling neemt ook vijftig keer zoveel logische blokken in. Er kan ook gekozen worden om enkel de buitenste loop te unrollen en 5 keer zoveel logische oppervlakte te benutten. Deze keuzes liggen allemaal in de handen van de programmeur.

Pipelining De HLS-tool maakt bij synthese een Finite State Machine. Elk state zal ruwweg overeenkomen met één klokcyclus. Een scheduling-algoritme bepaalt hoeveel van de nodige be- werkingen uitgevoerd kunnen worden in één klokcyclus. Alle bewerkingen worden zo toegekend aan een bepaalde state. void toplevelfunction(int array[3]) { for(int i=0; i < 3; i++) { int tmp = an_array[i]; tmp *= 3; an_array[i] *= 3; } } Standaard wordt geen gebruik gemaakt van pipelining. Dit betekent dat bovenstaande loop, bijvoorbeeld, volledig sequentieel wordt uitgevoerd. De eerste stap van deze loop is een waarde uitlezen uit een geheugen. Er kunnen geen drie waarden tegelijk uit een geheugen gelezen worden, waardoor de loop unrollen geen optie is. Deze situatie wordt voorgesteld in Figuur 4.1 links. In deze situatie is het mogelijk om de loop te pipelinen. Hierbij worden de verschillende bewerkingen met overlapping parallel uitgevoerd. Hierdoor verloopt de geheugentoegang niet gelijktijdig (in de veronderstelling dat de geheugentoegang langs verschillende poorten verloopt voor lezen en schrijven). Toch wordt de loop in de helft van de tijd uitgevoerd. Een ander voordeel van pipelining is dat weinig extra logica vereist is, omdat de verschillende blokken hergebruikt worden. 40 HOOFDSTUK 4. HLS: HIGH LEVEL SYNTHESIS

Figuur 4.1: Pipelining

Arrays Een derde belangrijke vorm van optimalisatie is het hervormen van arrays. Arrays worden gebruikt om geheugentoegang voor te stellen. Er zijn drie vormen van optimalisatie mogelijk, om drie verschillende problemen op te lossen:

• Partitionering: arrays kunnen op verschillende manieren worden verdeeld over meerdere arrays. Op deze manier heeft het algoritme meer geheugenpoorten ter beschikking om de array te benaderen

• Mapping: arrays die data bevatten met een kleine databreedte kunnen te klein zijn om een geheugenblok efficiënt te benutten. Daarom kunnen verschillende kleine arrays samen gevoegd worden. • Reshaping: meerdere waarden uit een array combineren tot één waarde met een grotere da- tabreedte. Hierdoor kunnen geheugenblokken efficiënter benut worden. Daarnaast resulteert het ook in parallele toegang tot meerdere waarden van de array. Hoofdstuk 5

Uitwerking

De opbouw van dit experiment kan in 3 grote delen gesplitst worden.

Data-invoer Als data voor het experiment wordt een eenvoudige dataset van RouteYou ge- bruikt. De data-invoer is niet de klemtoon van deze masterproef. Daarom wordt een eenvoudig ROM-geheugen gebruikt, dat opgebouwd wordt uit Block RAM.

Data-verwerking De focus van deze masterproef ligt op de dataverwerking. Dit omvat een HLS-core die data aangeleverd krijgt van het ROM-geheugen. De HLS-core voert dan de nodige bewerkingen uit om de data toe te voegen aan de heatmap

Heatmap De heatmap fungeert als een soort video-geheugen. De HLS-core past, aan de hand van de geleverde data, dit RAM aan. De uitvoer-zijde leest dit RAM uit.

Uitvoer Als uitvoer wordt gekozen voor een computer- of televisiescherm. De uitvoer-zijde leest de heatmap uit en genereert de nodige VGA-signalen om een stabiel beeld te vormen van de heatmap.

5.1 Data-invoer

De dataset die gebruikt wordt bevat geografische data van het Vlaams Fietsknooppuntennetwerk. Als x- en y-as gelden respectievelijk de Longitude en de Latitude. Elk punt bevat ook een po- pulariteitswaarde die aangeeft hoe vaak men aan een bepaald knooppunt passeert. Deze waarde wordt de derde dimensie die op de kleurschaal weer wordt gegeven. De gegevens worden aangeleverd in JSON. Dit is een formaat dat geïnspireerd is op de web- scripttaal JavaScript. Om de data te kunnen gebruiken in een FPGA-ontwerp wordt ze omge- zet van deze tekstuele voorstelling in JSON naar een bit-voorstelling in een coe-bestand. Een coe-bestand, of coëfficiënten-bestand, is een Xilinx-formaat. Het wordt gebruikt om geheugens gemaakt met een memory generator te initialiseren met data. De aangeleverde data wordt voorgesteld door 24-bit getallen, in navolging van Ewout Devos.Op deze manier zijn de resultaten van de HLS-werkwijze in deze masterproef vergelijkbaar met de traditionele VHDL-werkwijze in zijn masterproef. De Longitude en Latitude worden op voorhand geschaald naar de resolutie van de uitvoer, namelijk 640x480 pixels. De x-waarde, een integer uit [0, 640[, wordt opgeslagen als 10-bit waarde. De y-waarde, een integer uit [0, 480[, wordt opgeslagen als 9-bit waarde. De populariteitswaarde wordt geschaald naar een 5-bit waarde. Deze 3-waarden vormen de 24-bit waarde, zoals te zien in figuur ....

41 42 HOOFDSTUK 5. UITWERKING

Het coe-bestand, opgebouwd uit deze 24-bit waardes, wordt gebruikt in de Xilinx Memory Generator. Deze wordt gebruikt om een single-port ROM aan te maken. Dit ROM wordt aan- gestuurd door een eenvoudige Binary Counter. Deze levert het geheugenadres aan. Zijn waarde wordt verhoogd telkens de HLS-core klaar is met de verwerking van een waarde. Op deze manier staat de volgende waarde klaar voor verwerking.

5.2 Heatmap

De heatmap wordt continu opgeslagen in BRAM op de FPGA. De map beslaat 640x480 data- punten. De dataverwerking moet telkens een gebied van 8x8 punten bestaande uit 6 bits kunnen uitlezen en wegschrijven. Dit gebied kan op elk punt starten. Voor de organisatie van het geheugen zijn er verschillende mogelijkheden. De meest voor de hand liggende worden overlopen en aan de hand hiervan wordt de finale keuze uitgelegd.

Per waarde De eenvoudigste implementatie is om het geheugen toegankelijk te maken per waarde. Zo kunnen precies die waardes worden uitgelezen die nodig zijn. Als een matrix van 8x8 waarden moet worden uitgelezen betekent dit dat er 64 klokcycli nodig zijn om de data uit te lezen en 64 klokcycli om de data weg te schrijven. Dit betekent dat de verwerking van één waarde uit de dataset minimaal 128 klokcycli nodig heeft.

Per tegel De tweede mogelijkheid bestaat er in om de 64 6-bitswaarden als één 384-bitswaarde uit te lezen. Deze groepering van 8x8 waarden wordt een tegel genoemd. Door de waarden als tegel te benaderen is er slechts één klokcyclus nodig om de data uit te lezen en één om de data weg te schrijven. Het gebied dat toegankelijk is kan nu echter niet meer vrij worden gekozen. De data is enkel op tegel-niveau te benaderen.

Verschillende tegels Om niet gebonden te zijn aan de toegang op tegel-niveau kunnen alle tegelsworden ingelezen die waarden bevatten die nodig zijn. In het slechtste geval zijn dit vier tegels. Dit zou neerkomen op 4 klokcycli om te lezen en 4 klokcycli om te schrijven. Dit is een sterke verbetering ten opzichte van waarde per waarde uitlezen. Er wordt ingeboet aan snelheid om volledige vrijheid te hebben in het kiezen van de waarden die worden bewerkt.

Interleaved Memory Dankzij het principe van Interleaved Memory [14, blz. 186] kunnen alle tegels in één klokcyclus worden uitgelezen. Op één rij wordt steeds de eerste tegel in een eerste geheugen opgeslagen, de tweede in een tweede geheugen, de derde terug in het eerste geheugen, de vierde in het tweede geheugen enz. Anders gezegd, de oneven tegels worden opgeslagen in geheugen 1 en de even in geheugen 2. Als twee opeenvolgende tegels nodig zijn, kunnen die steeds tegelijk worden benaderd, omdat elke tegel in een ander geheugen zal zitten. Hetzelfde principe kan ook op de kolommen worden toegepast. Hierdoor kunnen twee tegels die onder elkaar staan altijd gelijktijdig benaderd worden. Door het principe in beide dimensies toe te passen kunnen 4 tegels die in een aaneensluitende 2x2 matrix staan gelijktijdig worden benaderd. De 4 tegels die nodig zijn zijn steeds aaneengesloten en vormen een vierkant van 2x2 tegels. Door gebruik te maken van 4 interleaved geheugens kunnen dus alle nodige waarden worden uitgelezen in 1 klokcyclus en weg worden geschreven in 1 klokcyclus. Dit is dan ook de methode die toegepast werd.

5.3 Data-verwerking

De data-verwerking is uitgewerkt in C++. Deze code werd dan via HLS omgezet in VHDL voor verdere verwerking in de klassieke FPGA-toolchain. De breedte en hoogte van de vierkant kernel 5.3. DATA-VERWERKING 43

is 8, dit werd vastgelegd met #define TILESIZE 8.

5.3.1 Interface Functie-signatuur De interface van de HLS-core bestaat uit de waarden ”x” (10 bit), ”y” (9 bit) en ”value” (5 bit). Daarnaast is de HLS-core verbonden met de 4 geheugenblokken die de tiles van de heatmap bevatten. Hiervoor wordt de functie sq_kern met onderstaande signatuur gedefinieerd. 3 void sq_kern ( 4 ap_uint<10> x, 5 ap_uint<9> y, 6 ap_uint<5> value, 7 ap_uint<6> hm_part_0_0[480/(TILESIZE*2)][640/(TILESIZE*2)][TILESIZE][TILESIZE], 8 ap_uint<6> hm_part_0_1[480/(TILESIZE*2)][640/(TILESIZE*2)][TILESIZE][TILESIZE], 9 ap_uint<6> hm_part_1_0[480/(TILESIZE*2)][640/(TILESIZE*2)][TILESIZE][TILESIZE], 10 ap_uint<6> hm_part_1_1[480/(TILESIZE*2)][640/(TILESIZE*2)][TILESIZE][TILESIZE]) {

Zoals te zien in bovenstaande code is gebruik gemaakt van de generieke klasse ap_uint. Dit is een Xilinx-specifieke klasse die het mogelijk maakt om niet-standaard bit-breedtes te gebruiken. ap_uint vertegenwoordigt unsigned integers van i bits.

Pragma’s De 4 geheugenblokken die de heatmap bevatten worden voorgesteld als 4 arrays in C++. De geheugenblokken zijn dual-port block RAM. De HLS-core heeft echter van elk geheu- genblok slechts één poort ter beschikking, de andere poort wordt gebruikt voor uitvoer. Deze en soortgelijke implementatie-details worden aan de synthese-tool meegegeven. Dit gebeurt aan de hand van pragma’s die in de broncode worden toegevoegd. 11 #pragma HLS RESOURCE variable=hm_part_0_0 core=RAM_1P_BRAM latency=2 12 #pragma HLS RESOURCE variable=hm_part_0_1 core=RAM_1P_BRAM latency=2 13 #pragma HLS RESOURCE variable=hm_part_1_0 core=RAM_1P_BRAM latency=2 14 #pragma HLS RESOURCE variable=hm_part_1_1 core=RAM_1P_BRAM latency=2

Array reshape De eerste twee dimensies van de array’s bestaan buiten de HLS-core en vormen het geheugenadres dat uit het geheugenblok wordt gebruikt. De laatste twee dimensies bestaan enkel op algoritme niveau. De geheugenblokken bevatten op één adreslocatie een 384 bits-waarde. Op algoritmisch niveau wordt deze 384 bits-waarde als een tile met 8x8 6 bit-waarden geïnterpre- teerd. Aan de synthese-tool is de instructie gegeven de elementen van de array’s allemaal na elkaar te zetten en als één waarde te behandelen. 15 #pragma HLS ARRAY_RESHAPE variable=hm_part_0_0 complete dim=3 16 #pragma HLS ARRAY_RESHAPE variable=hm_part_0_1 complete dim=3 17 #pragma HLS ARRAY_RESHAPE variable=hm_part_1_0 complete dim=3 18 #pragma HLS ARRAY_RESHAPE variable=hm_part_1_1 complete dim=3 19 #pragma HLS ARRAY_RESHAPE variable=hm_part_0_0 complete dim=4 20 #pragma HLS ARRAY_RESHAPE variable=hm_part_0_1 complete dim=4 21 #pragma HLS ARRAY_RESHAPE variable=hm_part_1_0 complete dim=4 22 #pragma HLS ARRAY_RESHAPE variable=hm_part_1_1 complete dim=4

Beperkingen Xilinx’s HLS legt een aantal beperkingen op. Het gebruik van een struct wordt normaal gezien ondersteund. De twee-dimensionale arrays die de tile voorstellen waren voor de leesbaarheid oorspronkelijk binnen een struct geplaatst. De signatuur van sq_kern werd dan void sq_kern ( ap_uint<10> x, ap_uint<9> y, ap_uint<5> value, tile hm_part_0_0[480/(TILESIZE*2)][640/(TILESIZE*2)], tile hm_part_0_1[480/(TILESIZE*2)][640/(TILESIZE*2)], tile hm_part_1_0[480/(TILESIZE*2)][640/(TILESIZE*2)], tile hm_part_1_1[480/(TILESIZE*2)][640/(TILESIZE*2)]) { 44 HOOFDSTUK 5. UITWERKING

Er werd echter geen mogelijkheid gevonden om aan te geven dat de twee-dimensionale array in de tile-struct moest worden gereshaped.

5.3.2 Tiles kiezen en uitlezen Beperkingen Het gebruik van pointers is beperkt. Het gebruik van de correcte tiles werd oorspronkelijk geïmplementeerd met pointers: tile* top_left; tile* top_right; tile* bottom_left; tile* bottom_right;

if (tile_x_left % 2 == 1) { if (tile_y_top % 2 == 1) { top_left = &( hm_1_1[(tile_y_top/2) ][(tile_x_left/2) ]); bottom_left = &( hm_0_1[(tile_y_top/2)+1][(tile_x_left/2) ]); top_right = &( hm_1_0[(tile_y_top/2) ][(tile_x_left/2)+1]); bottom_right = &( hm_0_0[(tile_y_top/2)+1][(tile_x_left/2)+1]); } else{ top_left = &( hm_0_1[(tile_y_top/2) ][(tile_x_left/2) ]); bottom_left = &( hm_1_1[(tile_y_top/2) ][(tile_x_left/2) ]); top_right = &( hm_0_0[(tile_y_top/2) ][(tile_x_left/2)+1]); bottom_right = &( hm_1_0[(tile_y_top/2) ][(tile_x_left/2)+1]); } } else{ if (tile_y_top % 2 == 1) { top_left = &( hm_1_0[(tile_y_top/2) ][(tile_x_left/2) ]); bottom_left = &( hm_0_0[(tile_y_top/2)+1][(tile_x_left/2) ]); top_right = &( hm_1_1[(tile_y_top/2) ][(tile_x_left/2) ]); bottom_right = &( hm_0_1[(tile_y_top/2)+1][(tile_x_left/2) ]); } else{ top_left = &( hm_0_0[(tile_y_top/2) ][(tile_x_left/2) ]); bottom_left = &( hm_1_0[(tile_y_top/2) ][(tile_x_left/2) ]); top_right = &( hm_0_1[(tile_y_top/2) ][(tile_x_left/2) ]); bottom_right = &( hm_1_1[(tile_y_top/2) ][(tile_x_left/2) ]); } } Xilinx Vivado HLS weigerde deze constructie echter te synthetiseren. Daarom werd overge- schakeld naar een gesplitste structuur van tiles uitlezen en wegschrijven.

Tile-adressering Aan de hand van de x- en y-waarde moeten de correcte tiles worden aange- sproken in de geheugenblokken. Met onderstaande code achterhaalt het programma de coördinaten die gebruikt moeten worden voor de vier geheugenblokken. 5.3. DATA-VERWERKING 45

25 /****************************** 26 * Decide which tiles to read* 27 ******************************/ 28 // Coordinates for the tile which contains the upper left corner of 29 // the square kernel 30 unsigned int tile_x_left = (x - TILESIZE/2) / TILESIZE; 31 unsigned int tile_y_top = (y - TILESIZE/2) / TILESIZE; 32 33 unsigned int hm_part_x_0, hm_part_y_0; 34 unsigned int hm_part_x_1, hm_part_y_1; 35 36 // Thex-coordinate for the heatmap-part withx uneven is always: 37 hm_part_x_1 = (tile_x_left/2); 38 // Idem for they-coordinate 39 hm_part_y_1 = (tile_y_top/2); 40 41 // If thex-coordinate of the left tile is uneven, the tile from 42 // the heatmap-part withx even will be right of it 43 if (tile_x_left % 2 == 1) { 44 hm_part_x_0 = (tile_x_left/2)+1; 45 } else{// the left tile will be from the heatmap-part withx even 46 hm_part_x_0 = (tile_x_left/2); 47 } 48 // Idem for they-coordinate 49 if (tile_y_top % 2 == 1) { 50 hm_part_y_0 = (tile_y_top/2)+1; 51 } else{ 52 hm_part_y_0 = (tile_y_top/2); 53 } Met de berekende coördinaten worden de correcte tiles aangespreken uit de heatmap-delen. Deze waarden worden binnen het algoritme opgeslagen. 55 /************** 56 * Read tiles* 57 **************/ 58 ap_uint<6> tile_hm_part_0_0[TILESIZE][TILESIZE] = {}; 59 ap_uint<6> tile_hm_part_0_1[TILESIZE][TILESIZE] = {}; 60 ap_uint<6> tile_hm_part_1_0[TILESIZE][TILESIZE] = {}; 61 ap_uint<6> tile_hm_part_1_1[TILESIZE][TILESIZE] = {}; 62 63 readrows : for(unsigned int i=0; i < TILESIZE; i++) { 64 #pragmaHLSUNROLL 65 readcols : for(unsigned int j=0; j < TILESIZE; j++) { 66 #pragmaHLSUNROLL 67 tile_hm_part_0_0[i][j] = hm_part_0_0[hm_part_y_0][hm_part_x_0][TILESIZE-1-j][TILESIZE-1-i]; 68 tile_hm_part_0_1[i][j] = hm_part_0_1[hm_part_y_0][hm_part_x_1][TILESIZE-1-j][TILESIZE-1-i]; 69 tile_hm_part_1_0[i][j] = hm_part_1_0[hm_part_y_1][hm_part_x_0][TILESIZE-1-j][TILESIZE-1-i]; 70 tile_hm_part_1_1[i][j] = hm_part_1_1[hm_part_y_1][hm_part_x_1][TILESIZE-1-j][TILESIZE-1-i]; 71 } 72 }

Loop unrolling Het pragma HLS UNROLL geeft aan dat deze loop niet als loop maar als parallelle structuur moet geïmplementeerd worden. In een klassieke interpretatie zou deze loop moeten leiden tot 256 (8x8x4) kopieerbewerkingen. Door de loop te ontrollen wordt dit herleid tot 4 leesbewerkingen. De volledige derde en vierde dimensie worden namelijk overlopen en deze werden voordien hervormd tot één waarde. Vermits de vier leesbewerkingen onafhankelijk zijn zullen ze bij synthese ook parallel geïmplementeerd worden. Alle tiles zullen dus gelijktijdig uitgelezen worden.

Xilinx-specifieke aanpassingen Merk op dat heatmap-delen achterstevoren worden uitgelezen ([TILESIZE-1-j][TILESIZE-1-i]). Na synthese is bij simulatie gebleken dat Xilinx HLS de ARRAY RESHAPE uitvoert met Least Significant first. De uitvoer-logica verwacht echter Most Significant first. Door deze ingreep werd dit verholpen. 46 HOOFDSTUK 5. UITWERKING

Merk ook op dat de indexering van rijen en kolommen voor de opslaglocatie (bijvoorbeeld tile_hm_part_0_0[i][j]) bij de leeslocatie gebruikt wordt voor respectievelijk de kolommen en de rijen (bijvoorbeeld hm_part_0_0[hm_part_y_0][hm_part_x_0][TILESIZE-1-j][TILESIZE-1-i]). Dit is omdat Xilinx Vivado HLS 2015.4.1 de ARRAY RESHAPE systematisch eerst op de derde dimensie en dan pas op de vierde uitvoert. Hierdoor zijn beide dimensies omgewisseld. Geen informatie werd teruggevonden over dit gedrag, een mogelijkheid het te beïnvloeden of de voorspelbaarheid hiervan. De kans bestaat dat dit gedrag anders is in vorige of toekomstige versies van Xilinx Vivado HLS.

5.3.3 Dataverwerking De dataverwerkingsloop bestaat er uit dat alle indexwaarden overlopen worden. Voor elke index- combinatie van i en j wordt met de twee buitenste lagen van if-else structuren achterhaald welke tile nodig is. Met de twee binnenste lagen wordt achterhaald waar deze tile is opgeslagen. 74 /************** 75 * Add values* 76 **************/ 77 unsigned int x_start = (x-TILESIZE/2) % TILESIZE; 78 unsigned int y_start = (y-TILESIZE/2) % TILESIZE; 79 80 rows : for(unsigned int i = 0; i < TILESIZE; i++) { 81 #pragmaHLSUNROLL 82 cols : for(unsigned int j = 0; j < TILESIZE; j++) { 83 #pragmaHLSUNROLL 84 if (i < y_start) { 85 if (j < x_start) {// Right Bottom 86 if (hm_part_y_0 > hm_part_y_1) { 87 if (hm_part_x_0 > hm_part_x_1) { 88 tile_hm_part_0_0[i][j] += value; 89 } else{ 90 tile_hm_part_0_1[i][j] += value; 91 } 92 } else{ 93 if (hm_part_x_0 > hm_part_x_1) { 94 tile_hm_part_1_0[i][j] += value; 95 } else{ 96 tile_hm_part_1_1[i][j] += value; 97 } 98 } 99 } else{// Left Bottom 100 if (hm_part_y_0 > hm_part_y_1) { 101 if (hm_part_x_0 > hm_part_x_1) { 102 tile_hm_part_0_1[i][j] += value; 103 } else{ 104 tile_hm_part_0_0[i][j] += value; 105 } 106 } else{ 107 if (hm_part_x_0 > hm_part_x_1) { 108 tile_hm_part_1_1[i][j] += value; 109 } else{ 110 tile_hm_part_1_0[i][j] += value; 111 } 112 } 113 } 114 } else{ 115 if (j < x_start) {// Right Top 116 if (hm_part_y_0 > hm_part_y_1) { 117 if (hm_part_x_0 > hm_part_x_1) { 118 tile_hm_part_1_0[i][j] += value; 119 } else{ 120 tile_hm_part_1_1[i][j] += value; 121 } 122 } else{ 123 if (hm_part_x_0 > hm_part_x_1) { 124 tile_hm_part_0_0[i][j] += value; 5.4. DATA-UITVOER 47

125 } else{ 126 tile_hm_part_0_1[i][j] += value; 127 } 128 } 129 } else{// Left Top 130 if (hm_part_y_0 > hm_part_y_1) { 131 if (hm_part_x_0 > hm_part_x_1) { 132 tile_hm_part_1_1[i][j] += value; 133 } else{ 134 tile_hm_part_1_0[i][j] += value; 135 } 136 } else{ 137 if (hm_part_x_0 > hm_part_x_1) { 138 tile_hm_part_0_1[i][j] += value; 139 } else{ 140 tile_hm_part_0_0[i][j] += value; 141 } 142 } 143 } 144 } 145 } 146 }

Code-stijl Opdat de HLS-tool de code zou kunnen synthetiseren tot een efficiënt ontwerp moet het parallelle karakter van het algoritme expliciet duidelijk worden uit de code. Verschillende code-stijlen kunnen leiden tot grote implementatie-verschillen ondanks dat ze functioneel identiek zijn. Uit de dataverwerkingscode blijkt duidelijk dat elke index-combinatie maar één maal voorkomt. Bovendien wordt voor elke index-combinatie altijd precies één handeling uitgevoerd. Dit betekent dat er 64 volledige onafhankelijke processen zijn die parallel geïmplementeerd kunnen worden.

5.3.4 Tiles wegschrijven Het wegschrijven van de tiles is gewoon de omgekeerde bewerking van het uitlezen. Hier valt niets nieuws over te vertellen. 148 /*************** 149 * Write tiles* 150 ***************/ 151 writerows : for(unsigned int i=0; i < TILESIZE; i++) { 152 #pragmaHLSUNROLL 153 writecols : for(unsigned int j=0; j < TILESIZE; j++) { 154 #pragmaHLSUNROLL 155 hm_part_0_0[hm_part_y_0][hm_part_x_0][TILESIZE-1-j][TILESIZE-1-i] = tile_hm_part_0_0[i][j]; 156 hm_part_0_1[hm_part_y_0][hm_part_x_1][TILESIZE-1-j][TILESIZE-1-i] = tile_hm_part_0_1[i][j]; 157 hm_part_1_0[hm_part_y_1][hm_part_x_0][TILESIZE-1-j][TILESIZE-1-i] = tile_hm_part_1_0[i][j]; 158 hm_part_1_1[hm_part_y_1][hm_part_x_1][TILESIZE-1-j][TILESIZE-1-i] = tile_hm_part_1_1[i][j]; 159 } 160 }

5.4 Data-uitvoer

De data-uitvoer gebeurt aan de hand van een beeld van de heatmap dat naar een VGA-poort wordt gestuurd. De gebruikte resolutie is 640 bij 480 pixels. Voor de courante schermverversings- frequentie van 60 Hz te bekomen is een pixelclock vereist van 25,2 MHz. Voor de eenvoud werd deze frequentie voor de gehele schakeling gebruikt. Een IP-blok van Xilinx zorgt voor de generatie van de nodige timingssignalen die zorgen voor een stabiel beeld. Een IP-blok van Digilent zorgt voor de juiste uitvoer-signalen voor de VGA-DAC aanwezig op het gebruikte Genesys 2 bord. 48 HOOFDSTUK 5. UITWERKING

Een standaard bit-counters houdt bij op welke lijn de weergave zich bevindt. Een tweede bit- counter telt de pixels op één lijn. De resultaten van deze counters worden gebruikt om het juiste geheugenadres te genereren en te kiezen uit welk geheugenblok wordt uitgelezen. Deze twee taken worden uitgevoerd door een zelf-geschreven -blok. Hoofdstuk 6

Resultaten

Het data-verwerkingssysteem werkt volledig synchroon. De timingsresultaten zijn dus heel voor- spelbaar en enkel afhankelijk van de stabiliteit van de klok van de FPGA. Het verwerken van één datapunt duurt 3 klokcycli. Dit is getest en werkt betrouwbaar op een frequentie van 25,2 MHz (de pixelklok). Hieruit kan worden afgeleid dat de verwerking van één datapunt 119.05 ns duurt. Dit kan worden vergeleken met de resultaten van Ewout Devos. Een medestudent die gelijk met deze masterproef dezelfde functionaliteit heeft ontwikkeld door gebruik te maken van VHDL. De functionaliteit van beide oplossingen is identiek. Ook heeft Ewout Devos een algoritme met dezelfde functionaliteit getimed op verschillende computerconfiguraties. De oplossing voor PC kan 249 000 datapunten verwerken in 13,690 seconden. Dit komt overeen met 54 979,920 ns per datapunt. De VHDL-oplossing kan in 7,302 ms 249 datapunten verwerken. Dit is omgerekend 29 325,301 ns per datapunt, wat een versnelling van 1,726 oplevert. De HLS-oplossing die werd ontwikkeld levert met 119.05 ns per datapunt een versnelling van 462 op ten opzichte van de PC. In vergelijking met de VHDL-oplossing wordt een versnelling van 246 bekomen.

49 50 HOOFDSTUK 6. RESULTATEN Hoofdstuk 7

Nabespreking

7.1 VHDL versus HLS

De bereikte versnelling ten opzichte van de VHDL-oplossing is opmerkelijk. Met VHDL zit de programmeur een abstractie-niveau lager en dichter bij de hardware. Dit houdt in dat hij meer mogelijkheden en meer controle heeft over de implementatie van de accelerator. Langs de andere kant is het een bevestiging van de toegankelijkheid van HLS. Door gebruik te maken van HLS moesten minder implementatie-details worden onderzocht en kon meer tijd worden besteed aan het verwerven van inzicht in de parallellisatie-mogelijkheden van het algoritme. De parallelle geheugentoegang zal een grote rol gespeeld hebben in de bereikte versnelling. Dergelijk systeem in VHDL implementeren vereist veel meer onderzoek. Zowel Ewout Devos als ik hebben een opleiding gevolgd die ICT-gericht is. We benaderen dus allebei ingebedde systemen met een achtergrond van algoritmisch programmeren. De resul- taten van de HLS-tool zullen waarschijnlijk niet optimaal zijn, maar wel vele malen beter dan de resultaten van iemand met beperkte ervaring in programmeren op RTL-niveau.

7.2 Potentieel tot verdere versnelling

De bekomen resultaten zijn nog helemaal niet geoptimaliseerd. Het huidige algoritme zou zonder aanpassing sneller kunnen werken door de laagste doorlooptijd te zoeken. Dit kan door hogere werkfrequenties te eisen van de synthese-tool. Aandacht moet dan besteed worden aan het aantal klokcycli dat het algoritme nodig heeft. De ideale balans tussen een hoge werkfrequentie en een laag aantal klokcycli moet gezocht worden. Een meer geavanceerde methode is gebruik maken van pipelining. Voor het ogenblik wordt pas aan de verwerking van het volgende datapunt begonnen als het vorige is afgewerkt. Op deze manier treden er zeker geen conflicten op als de kernels rond datapunten overlappen. Als echter de dataverwerking onder de loep wordt genomen, wordt duidelijk dat het grootste deel van de verwerking bestaat uit de berekening van de juiste geheugenadressen. Pas in de laatste cycli wordt het geheugen uitgelezen, wordt een simpele optelling uitgevoerd en wordt de data teruggeschreven naar het geheugen. Een snelle exploratie heeft uitgewezen dat wanneer de kloksnelheid verhoogd wordt het aantal klokcycli wel stijgt maar de geheugentoegang blijft plaatsvinden in de laatste 3 cycli. Door pipe- lining kan er dus nog steeds om de 3 klokcycli een nieuw datapunt worden verwerkt, terwijl de kloksnelheid verder wordt verhoogd. Waarschijnlijk zijn er nog andere mogelijkheden tot verder doorgedreven parallellisatie. Men zal hier echter geconfronteerd worden met overlappingen in de data toegang. Deze methoden zullen dus beduidend meer inspanning vergen.

51 52 HOOFDSTUK 7. NABESPREKING

7.3 Potentieel tot functie-uitbreiding

Het huidige algoritme heeft een simpele naive estimator geïmplementeerd. Maar hetzelfde systeem kan eenvoudig uitgebreid worden naar meer geavanceerde kernels. Het potentieel tot pipelining zal hierbij niet in het gedrang komen. De nodige berekeningen zijn enkel afhankelijk van de coördinaten van het datapunt en slechts bij de finale optelling is geheugentoegang nodig. Daardoor blijft de geheugentoegang beperkt tot de laatste cycli en is er veel mogelijkheid tot overlap. Bibliografie

[1] vrt, “België zet puntjes op de i met sterke prestatie en zege tegen ierland,” "http://sporza. be/cm/sporza/matchcenter/mc_voetbal/EK_2016/MG_za_18_06/1.2670455", Jun 2016. [2] B. Clarke, E. Fokoué, and H. Zhang, “Learning in high dimensions,” in Principles and Theory for Data Mining and Machine Learning, ser. Springer Series in Statistics. Springer New York, 2009, pp. 493–568. [Online]. Available: http://dx.doi.org/10.1007/978-0-387-98135-2_9 [3] F. Battke, S. Symons, and K. Nieselt, “Mayday - integrative analytics for expression data,” BMC Bioinformatics, vol. 11, no. 1, p. 121, 2010. [Online]. Available: http://www.biomedcentral.com/1471-2105/11/121 [4] E. Shook, K. Leetaru, G. Cao, A. Padmanabhan, and S. Wang, “Happy or not: Generating topic-based emotional heatmaps for culturomics using cybergis,” in E-Science (e-Science), 2012 IEEE 8th International Conference on, Oct 2012, pp. 1–6. [5] A. Perrot, R. Bourqui, N. Hanusse, F. Lalanne, and D. Auber, “Large Interactive Visualization of Density Functions on Big Data Infrastructure,” in 2015 IEEE 5TH SYMPOSIUM ON LARGE DATA ANALYSIS AND VISUALIZATION (LDAV), Bennett, J and Childs, H and Hadwiger, M, Ed., SCI; nVIDIA; Argonne Natl Lab. 345 E 47TH ST, NEW YORK, NY 10017 USA: IEEE, 2015, Proceedings Paper, pp. 99–106, IEEE 5th Symposium on Large Data Analysis and Visualization (LDAV), Chicago, IL, OCT 25-26, 2015. [6] B. Silverman, Density Estimation for Statistics and Data Analysis, ser. Chapman & Hall/CRC Monographs on Statistics & Applied Probability. Taylor & Francis, 1986. [Online]. Available: https://www.crcpress.com/Density-Estimation-for-Statistics-and-Data-Analysis/ Silverman/9780412246203 [7] E. Fix and J. L. Hodges Jr, “Discriminatory analysis-nonparametric discrimination: consistency properties,” DTIC Document, Tech. Rep., 1951. [Online]. Available: http://www.dtic.mil/docs/citations/ADA800276 [8] J. L. H. Evelyn Fix, “Discriminatory analysis. nonparametric discrimination: Consistency properties,” International Statistical Review / Revue Internationale de Statistique, vol. 57, no. 3, pp. 238–247, 1989. [Online]. Available: http://www.jstor.org/stable/1403797 [9] A. BOWMAN, “MULTIVARIATE DENSITY-ESTIMATION - THEORY, PRACTICE AND VISUALIZATION - SCOTT,DW,” JOURNAL OF CLASSIFICATION, vol. 11, no. 2, pp. 261–262, 1994. [10] W. Kleitz, Digital Electronics with VHDL (Quartus II Version). Pearson Prentice Hall, 2006. [11] U. Paul, Programmable Logic Devices. Boston, MA: Springer US, 2003, pp. 421–447. [Online]. Available: http://dx.doi.org/10.1007/978-0-387-73543-6_18 [12] C. M. Maxfield, “Chapter 3 - the origin of {FPGAs},” in The Design Warrior’s Guide to {FPGAs}, C. M. Maxfield, Ed. Burlington: Newnes, 2004, pp. 25 – 56. [Online]. Available: http://www.sciencedirect.com/science/article/pii/B9780750676045500040

53 [13] A. R. Brodtkorb, C. Dyken, T. R. Hagen, J. M. Hjelmervik, and O. O. Storaasli, “State- of-the-art in heterogeneous computing,” SCIENTIFIC PROGRAMMING, vol. 18, no. 1, pp. 1–33, 2010. [14] W. Stallings, Computer Organization and Architecture: Designing for Performance, ser. The William Stallings books on computer and data communications technology. Pearson, 2009.