1. Maak van uw HPC applicatie een parallel succes
regardo.nl/maak-van-uw-hpc-applicatie-een-parallel-succes-2015-02-27/
Ben Kemp
Tegenwoordig is de high performance computing uitdaging niet hoe
krachtig het rekencluster kan zijn, maar kan de applicatie de volledige
rekencapaciteit benutten. Natuurlijk is de parallelle efficiëntie van het
algoritme belangrijk om programmacode iteraties te optimaliseren –
zo ook in hoeverre de gedistribueerde of parallelle HPC architectuur
deze parallelle efficiëntie kan waarmaken. In de ideale geval – met
een perfecte schaalbaarheid – is de HPC applicatie lineair schaalbaar.
Lineair schaalbaar betekent dat de rekentijd omgekeerd recht
evenredig is met het aantal rekennodes. Bijvoorbeeld als de rekentijd
20 minuten is op 1 rekennode, zal de rekentijd gereduceerd worden tot 5 minuten op 4 rekennodes. Dit
is puur theoretisch en in de praktijk niet haalbaar. Zelfs als de cores in dezelfde rekenodes ijn, zijn er
altijd factoren die de performantie benadelen zoals; bus bandbreedte, proces veranderingen, timed
events, hardware interrupts, enz. Al deze factoren verhinderen de HPC applicaties om lineair
schaalbaar te zijn.
Perfect schaalbaar zijn van HPC applicaties zijn bestaat niet
In de meeste gevallen moeten we accepteren dat ‘lineair schaalbaar’ eigenlijk ‘bijna lineair schaalbaar
betekent’. Een voorbeeld om dit toe te lichten. Stel dat de rekentijd voor een applicatie 18 minuten
duurt op een enkel rekennode en 9 minuten en 10 seconden op twee rekennodes, dan bereiken we
een goed resultaat met de HPC software architectuur. Om deze extra 10 seconden te verminderen is
een vraag van tijd en geld. Uit ervaring blijkt dat deze procentuele kleine vertraging een grote
inspanning kost qua tijd en geld (Pareto principe). Om voor de laatste 10 seconden te gaan zal ook een
meer zakelijke beslissing zijn dan een technische vraagstuk.
Er zijn een aantal methodes om High Performance Computing applicaties te parallelliseren over de
beschikbare rekennodes. Hieronder beschrijven we drie voorbeelden:
1. Data decompositie of ook wel data parallellisatie genoemd. Data decompositie is het verdelen
van de te verwerken data over de verschillende rekennodes. Elke rekennodes verwerkt een deel
van de data autonoom. Een Computation Fluid Dyamics (CFD) voorbeeld is om de beweging
binnen een vloeistof volume te berekenen – hydrodynamica. Het vloeistof volume is op te delen
in compartimenten. Een algoritme berekent binnen de bewegingen binnen het deelvolume
autonoom op een rekenode. Om vervolgens de raakvlakken met de andere deelvolumes in de
berekening mee te nemen. Het data decompositie proces kent hiermee een initialisatie fase
waarbinnen de verdeling van data plaatsvindt en een convergentie fase waarbinnen de delen tot
één geheel samenkomen. Beide data decompositie fases benadelen het lineaire schaalbaar
zijn, maar deze extra tijd zal doorgaans te verwaarlozen zijn ten opzichte van de totale
verwerkingstijd. De focus in data de compositie is het rekenen aan de deel data om een hoge
mogelijk parallelle efficiëntie factor te bereiken. Natuurlijk zal de rekentijd aan deel volumes ten
opzichte van de extra tijd om te kunnen paralleliseren een gezonde rationele verhouden moeten
hebben.
2. Een andere vorm van parallellisatie is toe te passen wanneer de beginwaarde van het algoritme
voor elke berekening ander is en de data hetzelfde blijft. Bijvoorbeeld een applicatie pas
verschillende beginwaarden toe op dezelfde data om tot een eindresultaat te komen. Een
praktijk voorbeeld zijn alle algoritmes die vallen in de categorieën parabolische partiële
2. differentiële vergelijkingen. Deze methode van parallellisatie is redelijk eenvoudig en is ook te
verdelen over de rekennodes. Ook hier is er sprake van een initialisatie fase en een
convergentie fase zoals bij data decompositie. En ook ligt de nadruk bij het verwerken van de
data met als uitgangspunt de beginwaarden.
3. Het parallelliseren van taken binnen een applicatie. Taak parallellisatie is het uitvoeren van de
applicatie in meerdere processen – meestal threads genoemd – die over meerdere rekennodes
verspreid worden. Taak parallellisatie heeft een hogere moeilijkheidsgraad in vergelijk tot data
decompositie aangezien er geen consequente orchestratie is tussen processen, de tijd van de
verwerking en de coördinatie van de toegang tot cache geheugen. Taak parallellisatie zal zowel
verantwoordelijkheid over de controle van de processen als wel de data op zich moeten nemen.
Een praktijk voorbeeld van taak parallellisatie kan het uitvoeren van een complexe database
query zijn. Tijdens uitvoeren van de deel queries (taken) worden tijdelijke tabellen aangemaakt.
Afhankelijk van de data organisatie, software architectuur zijn deze deel queries autonoom uit te
voeren of zullen deze op elkaar moeten wachten.
De bovengenoemde vormen van parallellisatie zijn de basis. Natuurlijk zijn er ook combinaties
mogelijk. Het was geenszins de bedoeling om een uitputtende lijst samen te stellen van alle vormen
van parallellisatie. Alhoewel wij wel zeer nieuwsgierig naar uw ervaringen en welke software patronen
uw gebruik binnen parallellisatie.
In een volgend artikel willen we algemene ontwerp regels aangeven voor het programmeren van
parallelle applicaties.