Kleine inefficiënties — grote vertragingen
In high-performance computing (HPC) kunnen zelfs kleine inefficiënties grote vertragingen veroorzaken. Onlangs kwam ik zo’n uitdaging tegen bij het ondersteunen van een klant in de halfgeleiderindustrie die AMD EPYC-gebaseerde systemen had geïntegreerd in hun wereldwijde compute clusters. Deze systemen, bekend om hun hoge core-aantallen en energie-efficiëntie, zouden simulatieworkloads juist moeten versnellen. Toch doken er onverwachte performanceproblemen op, met name bij multithreaded jobs.
Het knelpunt
De klant merkte dat bepaalde simulatiejobs, met name die gebruikmaakten van 4 tot 8 cores, inconsistente runtimes hadden. Sommige taken werden snel afgerond, terwijl andere duidelijk achterbleven, wat leidde tot vertragingen in de totale workflow. Deze inconsistentie was opvallend, vooral omdat alle clusters dezelfde hardware- en softwareconfiguratie hadden.
Na onderzoek ontdekte ik dat de oorzaak lag in de interactie tussen de job scheduler en de Non-Uniform Memory Access (NUMA)-architectuur van de AMD EPYC-processors. Concreet wees de scheduler threads toe zonder rekening te houden met de L3-cachegrenzen die inherent zijn aan het EPYC-ontwerp. Hierdoor werden threads die data met elkaar deelden geplaatst op cores met afzonderlijke L3-caches, wat leidde tot verhoogde latency door communicatie tussen caches.
Begrijpen van de architectuur
AMD EPYC-processors maken gebruik van een chiplet-gebaseerde architectuur, waarbij elke chiplet — ook wel Core Complex Die (CCD) genoemd — meerdere cores bevat die een L3-cache delen. Dit ontwerp biedt voordelen op het gebied van schaalbaarheid en performance, maar introduceert ook complexiteit in geheugenaccesspatronen. Wanneer threads die intensief met elkaar communiceren worden toegewezen aan cores op verschillende CCD’s, moeten zij data benaderen via afzonderlijke L3-caches. Dit leidt tot verhoogde latency en verminderde performance.
Een oplossing implementeren
Om dit aan te pakken heb ik een strategie ontwikkeld om de scheduler NUMA-aware te maken met betrekking tot de L3-cachegrenzen. Door de topologie-informatie die het systeem aan de scheduler presenteert aan te passen, heb ik ervoor gezorgd dat threads die data met elkaar delen, worden toegewezen aan cores binnen hetzelfde L3-cache-domein. Deze aanpak bestond uit de volgende stappen:
- Aanpassing van de topologie: het aanpassen van de hardwaretopologie-informatie van het systeem zodat de L3-cachegrenzen correct worden weergegeven. Hierdoor werd de scheduler gestuurd om threads binnen hetzelfde cache-domein te groeperen.
- Schedulerconfiguratie: het bijwerken van de configuratie van de scheduler om prioriteit te geven aan het toewijzen van threads aan cores binnen dezelfde L3-cachegroep, waardoor communicatie tussen caches wordt geminimaliseerd.
- Validatie en testen: het uitvoeren van benchmarktests om de performance vóór en na de aanpassingen te vergelijken. De resultaten lieten een duidelijke afname zien in variatie van jobruntimes en een verbeterde algehele efficiëntie.
Resultaten en impact
- Consistente jobruntimes: de variatie in afrondingstijden van jobs nam aanzienlijk af, wat resulteerde in beter voorspelbare workflows.
- Verbeterde resourcebenutting: door communicatie tussen caches te verminderen, werd het gebruik van CPU en geheugen efficiënter.
- Verhoogde throughput: de totale throughput van de compute clusters nam toe, waardoor meer simulaties in minder tijd konden worden verwerkt.
Deze ervaring onderstreept het belang van het afstemmen van job scheduling-strategieën op de onderliggende hardwarearchitectuur in HPC-omgevingen. Door de scheduler bewust te maken van de NUMA-topologie, en met name de L3-cache-domeinen, kunnen we performance optimaliseren en het volledige potentieel benutten van moderne processors zoals AMD EPYC.
Conclusie
In high-performance computing is het cruciaal om de complexiteit van processorarchitecturen te begrijpen en je daarop aan te passen. Deze case laat zien hoe doordachte aanpassingen in job scheduling, gebaseerd op hardwaretopologie, kunnen leiden tot aanzienlijke performanceverbeteringen. Naarmate HPC-systemen zich blijven ontwikkelen, zullen dit soort optimalisaties essentieel zijn om efficiënte en betrouwbare computationele workflows te realiseren.