2017-11-04 00:04:20 +01:00
|
|
|
---
|
2017-11-05 22:48:23 +01:00
|
|
|
abstract: My master's thesis, including an overview of it in Danish.
|
2019-10-30 13:28:37 +01:00
|
|
|
lastupdated: 2017
|
2017-11-04 00:04:20 +01:00
|
|
|
---
|
|
|
|
|
2017-11-05 22:48:23 +01:00
|
|
|
# My Master's Thesis
|
2017-11-04 00:04:20 +01:00
|
|
|
|
2017-11-06 00:18:23 +01:00
|
|
|
I submitted my MSc thesis in computer science in October 2017.
|
|
|
|
|
|
|
|
It is titled "Memory Block Merging in Futhark".
|
2017-11-04 00:04:20 +01:00
|
|
|
|
2017-11-05 23:59:26 +01:00
|
|
|
[Download the thesis.](niels-thesis.pdf)
|
|
|
|
|
|
|
|
![Hedgehogs: Faster than you might think.](hedgehogs.jpg){width=820}
|
2017-11-04 00:04:20 +01:00
|
|
|
|
|
|
|
|
|
|
|
## Resumé
|
|
|
|
|
|
|
|
(This section is in Danish.)
|
|
|
|
|
2017-11-05 23:59:26 +01:00
|
|
|
Velkommen til det danske resumé af mit speciale. På dansk hedder mit
|
|
|
|
speciale "Hukommelsesblokfletning i Futhark". Undskyld hvis resuméet er
|
|
|
|
forvirrende og uklart. Det er svært at beskrive på kort plads, og en
|
2017-11-06 00:18:23 +01:00
|
|
|
del af det kræver nok en vis computerviden.
|
2017-11-05 23:59:26 +01:00
|
|
|
|
|
|
|
|
|
|
|
## Strukturbaggrund
|
|
|
|
|
|
|
|
I 2011 begyndte jeg på datalogistudiet på Københavns Universitet. I
|
|
|
|
starten af 2015 fik jeg en *bachelorgrad* derfra, og senere på året
|
|
|
|
begyndte jeg så på *kandidaten*, som er den anden del af uddannelsen.
|
|
|
|
Nu har jeg her i 2017 så brugt et halvt år på at skrive mit *speciale*,
|
|
|
|
som er den endelige opgave på kandidaten. Når jeg har forsvaret
|
|
|
|
(præsenteret) specialet, får jeg en *kandidatgrad*.
|
|
|
|
|
|
|
|
|
|
|
|
## Indholdsbaggrund
|
|
|
|
|
|
|
|
Der er to hoveddele i titlen:
|
|
|
|
|
|
|
|
+ Hukommelsesblokfletning
|
|
|
|
+ Futhark
|
|
|
|
|
2017-11-06 00:18:23 +01:00
|
|
|
*Hukommelsesblokfletning* er et delvist opfundet ord som jeg groft sagt
|
2017-11-05 23:59:26 +01:00
|
|
|
siger betyder "at tage flere områder hukommelse (fra RAM) i en computer
|
|
|
|
og ændre dem så de bruger det samme område, så vi sparer hukommelse".
|
|
|
|
Dette er den teoretiske del af mit speciale.
|
|
|
|
|
|
|
|
*Futhark* er et programmeringssprog rettet mod at køre programmer på
|
|
|
|
grafikkort -- ikke for at lave 3D, men for at lave generelle tunge
|
|
|
|
udregninger på smarte måder der passer til hardwarens fordele og
|
|
|
|
begrænsninger. Futhark er et eksisterende sprog og har en hjemmeside på
|
2017-11-06 00:02:01 +01:00
|
|
|
[futhark-lang.org](http://futhark-lang.org/) hvor man kan læse mere om
|
|
|
|
det.
|
2017-11-05 23:59:26 +01:00
|
|
|
|
2017-11-06 15:51:58 +01:00
|
|
|
Futhark-sproget har en tilhørende *oversætter* som tager
|
2017-11-05 23:59:26 +01:00
|
|
|
Futhark-programmer og oversætter dem til at kunne køre på grafikkort.
|
|
|
|
Jeg har i mit speciale udvidet denne oversætter til at lave
|
|
|
|
hukommelsesblokfletning, hvilket vi kalder en *optimering*. Dette er
|
|
|
|
den praktiske del af mit speciale.
|
|
|
|
|
|
|
|
|
2017-11-06 00:13:44 +01:00
|
|
|
## Eksempel
|
2017-11-05 23:59:26 +01:00
|
|
|
|
|
|
|
Her et et computerprogram på et meget abstrakt niveau:
|
|
|
|
|
|
|
|
1. Gør plads til et stort billede. Kald pladsen $M$.
|
|
|
|
2. Indlæs et stort billede. Kald det $I$ og læg det i pladsen $M$.
|
|
|
|
3. Udskriv det store billede $I$.
|
|
|
|
4. Gør plads til endnu et stort billede. Kald pladsen $M2$.
|
|
|
|
5. Indlæs et nyt stort billede. Kald det $I2$ og læg det i pladsen $M2$.
|
|
|
|
6. Udskriv det store billede $I2$.
|
|
|
|
|
|
|
|
Vi har to store billeder som skal udskrives på en printer. I trin 1
|
|
|
|
fortæller vi computeren at vi skal have plads til et stort billede. I
|
|
|
|
trin 2 indlæser vi et stort billede (fx fra en fil) og fortæller
|
|
|
|
computeren at det skal ligge der hvor vi har gjort plads til det. I
|
|
|
|
trin 3 fortæller vi så computeren at den skal udskrive billedet. I trin
|
|
|
|
4-6 gentages dette, bare med et nyt stort billede.
|
|
|
|
|
|
|
|
Det er fjollet både at gøre trin 1 og trin 4. Det første billede bliver
|
2017-11-06 15:51:58 +01:00
|
|
|
aldrig brugt mere efter det er udskrevet i trin 3, så dets plads $M$ kan
|
2017-11-05 23:59:26 +01:00
|
|
|
egentlig godt genbruges. Vi ændrer derfor programmet til at have 5
|
|
|
|
trin:
|
|
|
|
|
|
|
|
1. Gør plads til et stort billede. Kald pladsen $M$.
|
|
|
|
2. Indlæs et stort billede. Kald det $I$ og læg det i pladsen $M$.
|
|
|
|
3. Udskriv det store billede $I$.
|
|
|
|
4. Indlæs et nyt stort billede. Kald det $I2$ og læg det i pladsen $M$.
|
|
|
|
5. Udskriv det store billede $I2$.
|
|
|
|
|
|
|
|
Trin 4 genbruger nu den allerede brugte plads $M$ i stedet for at bruge
|
|
|
|
en ny plads. Vi har flettet hukommelsesblokkene $M$ og $M2$ og sparet
|
|
|
|
plads.
|
|
|
|
|
|
|
|
Det her er et meget simplificeret eksempel, men idéen er nogenlunde
|
|
|
|
derhenaf.
|
|
|
|
|
|
|
|
|
|
|
|
## Resultater
|
|
|
|
|
|
|
|
Målet med min optimering er at
|
|
|
|
|
2017-11-06 15:51:58 +01:00
|
|
|
+ få programmer i Futhark til at bruge mindre hukommelse, samt at
|
|
|
|
+ få programmer i Futhark til at køre lidt hurtigere.
|
2017-11-05 23:59:26 +01:00
|
|
|
|
|
|
|
Futhark har en masse eksisterende større programmer som jeg har oversat
|
|
|
|
og kørt både *uden* mine optimeringer og *med* mine optimeringer. Deres
|
|
|
|
resultater har jeg så sammenlignet.
|
|
|
|
|
2017-11-06 00:18:23 +01:00
|
|
|
Med mine optimeringer bruger programmerne mellem 0% (ingen ændring) og
|
|
|
|
70% mindre *hukommelse*, hvilket er godt. De bliver mellem -28%
|
|
|
|
(dvs. langsommere) og 16% *hurtigere*, hvilket er et lidt mere blandet
|
|
|
|
resultat. Dog har jeg en okay idé om hvorfor nogle af dem bliver
|
|
|
|
langsommere (læs mere om det i selve specialet).
|
2017-11-06 00:13:44 +01:00
|
|
|
|
|
|
|
|
|
|
|
## Resten
|
|
|
|
|
|
|
|
Der er mange flere eksempler i rapporten, og der er de beskrevet bedre
|
|
|
|
end her. Jeg har også forsøgt at *formalisere* mine optimeringer, men
|
|
|
|
det gik knapt så godt.
|
|
|
|
|
|
|
|
Koden ligger på
|
|
|
|
[github.com/diku-dk/futhark/](https://github.com/diku-dk/futhark/). Kig
|
|
|
|
i mappen `src/Futhark/Optimise/MemoryBlockMerging/`. Det er okay, men
|
|
|
|
ikke helt poleret.
|