Vraag MPI versus openMP voor een gedeeld geheugen


Laten we zeggen dat er een computer is met 4 CPU's met elk 2 kernen, dus in totaal 8 kernen. Met mijn beperkte begrip denk ik dat alle processors in dit geval hetzelfde geheugen delen. Het is nu beter om directMP te gebruiken of MPI te gebruiken om het algemeen te maken, zodat de code zowel op gedistribueerde als op gedeelde instellingen kan werken. En als ik MPI zou gebruiken voor een gedeelde instelling, zou de prestatie afnemen in vergelijking met openMP?


24
2017-07-04 15:34


oorsprong


antwoorden:


Bij de meeste gedistribueerde geheugenplatforms die tegenwoordig bestaan ​​uit SMP- of NUMA-knooppunten, heeft het gewoon geen zin om OpenMP niet te gebruiken. OpenMP en MPI kan perfect samenwerken; OpenMP feeds de kernen op elk knooppunt en MPI communiceert tussen de knooppunten. Dit wordt hybride programmering genoemd. Het werd 10 jaar geleden als exotisch beschouwd, maar nu wordt het mainstream in High Performance Computing.

Wat betreft de vraag zelf, het juiste antwoord, gegeven de verstrekte informatie, is altijd hetzelfde geweest: HET HANGT ER VAN AF.


27
2017-07-04 16:19



Of u MPI of OpenMP (of beide) nodig heeft of wilt, is sterk afhankelijk van het type toepassing dat u gebruikt en of uw probleem meestal geheugengebonden of CPU-gebonden (of beide) is. Verder hangt het af van het type hardware waarop je draait. Een paar voorbeelden:

voorbeeld 1

U hebt parallellisatie nodig omdat het geheugen bijna leeg is, bijvoorbeeld je hebt een simulatie en de probleemomvang is zo groot dat je gegevens niet meer in het geheugen van een enkele node passen. De bewerkingen die u uitvoert op de gegevens zijn echter vrij snel, zodat u niet meer rekenkracht nodig hebt.

In dit geval wilt u waarschijnlijk MPI gebruiken en één MPI-proces starten op elk knooppunt, waardoor maximaal gebruik wordt gemaakt van het beschikbare geheugen terwijl de communicatie tot het absolute minimum wordt beperkt.

Voorbeeld 2

U hebt meestal kleine datasets en wilt alleen uw applicatie versnellen, die rekenkundig zwaar is. Ook wil je niet veel tijd besteden aan het denken aan parallellisatie, maar meer aan je algoritmen in het algemeen.

In dit geval is OpenMP uw eerste keuze. Je hoeft hier en daar een paar statements toe te voegen (bijvoorbeeld voor je for-lussen die je wilt versnellen), en als je programma niet te complex is, zal OpenMP de rest automatisch voor jou doen.

Voorbeeld 3

Jij wilt alles. U hebt meer geheugen nodig, d.w.z. meer computerknooppunten, maar u wilt ook uw berekeningen zoveel mogelijk versnellen, d.w.z. op meer dan één kern per knoop lopen.

Nu komt je hardware om de hoek kijken. Uit mijn persoonlijke ervaring, als je slechts een paar kernen per knoop (4-8) hebt, is de prestatievergoeding die wordt gecreëerd door de algemene overhead van het gebruik van OpenMP (dwz het opstarten van de OpenMP-threads enz.) Meer dan de overhead van de interne processor. MPI-communicatie (dwz het verzenden van MPI-berichten tussen processen die daadwerkelijk geheugen delen en waarvoor geen MPI nodig is om te communiceren).
Als u echter werkt aan een computer met meer kernen per knooppunt (16+), moet u een hybride benadering, d.w.z. parallel met MPI en OpenMP tegelijkertijd. In dit geval is hybride parallellisatie nodig om volledig gebruik te maken van uw computationele bronnen, maar het is ook het moeilijkst om te coderen en te onderhouden.

Overzicht
Als u een probleem hebt dat klein genoeg is om op slechts één knooppunt te worden uitgevoerd, gebruikt u OpenMP. Als u weet dat u meer dan één knooppunt nodig hebt (en dus absoluut MPI nodig hebt), maar u de voorkeur geeft aan leesbaarheid van de code / inspanning ten koste van de prestaties, gebruik dan alleen MPI. Als het gebruik van MPI je niet de gewenste snelheid oplevert, moet je alles doen en hybride worden.

Op uw tweede vraag (voor het geval dat niet duidelijk werd):
Als u zo bent ingesteld dat u helemaal geen MPI nodig hebt (omdat uw programma altijd op slechts één knooppunt zal draaien), gebruikt u OpenMP omdat dit sneller zal zijn. Maar als je weet dat je sowieso MPI nodig hebt, zou ik daarmee beginnen en pas later OpenMP toevoegen, als je weet dat je alle redelijke optimalisatie-opties voor MPI hebt opgebruikt.


48
2017-07-05 13:01



Voor gebruik op een dergelijke machine met een gedeeld geheugen, zou ik OpenMP aanraden. Het maakt sommige aspecten van het probleem eenvoudiger en macht sneller zijn.

Als u ooit van plan bent om naar een gedistribueerd geheugenapparaat te gaan, gebruik dan MPI. Het bespaart u hetzelfde probleem twee keer oplossen.

De reden waarom ik zeg dat OpenMP misschien sneller is, is omdat een goede implementatie van MPI slim genoeg zou kunnen zijn om te ontdekken dat het wordt gebruikt in een gedeelde geheugenomgeving en het gedrag dienovereenkomstig te optimaliseren.


4
2017-07-04 15:42



Alleen voor een groter geheel is hybride programmering populair geworden omdat OpenMP profiteert van cache-topologie, door dezelfde adresruimte te gebruiken. Omdat MPI mogelijk dezelfde gegevens repliceert over het geheugen (omdat het proces geen gegevens kan delen), kan het cacheafbreken.

Aan de andere kant, als u uw gegevens correct partitioneert en elke processor een persoonlijke cache heeft, kan het tot een punt komen dat uw probleem volledig in de cache past. In dit geval heb je super lineaire versnellingen.

Door te praten in de cache, zijn er zeer verschillende cache-topologie op recente processors en heeft altijd: HET HANGT ER VAN AF...


3
2017-07-04 21:30