C’t Magazine

AMD Ryzen vs Intel Core

AMD Ryzen, de concurrent­ie, CPU2006 en de nieuwste Windows-compiler

- Andreas Stiller

Komt dat even mooi uit: kort na de lancering van AMD’s Ryzen brachten zowel Microsoft als Intel nieuwe versies van hun Windows-compilers uit. Daarmee voelden we AMD's vlaggensch­ip R1800X, zijn voorganger Excavator en enkele concurrent­en stevig aan de tand. En natuurlijk met de klassieker SPEC CPU2006 en 'struikelbl­ok' Flops.

AMD's Ryzen is in eerste instantie bedoeld voor desktopgeb­ruik en daarom richten we ons vooral op de daarvoor gangbare Windows 10-omgeving. Onder Windows wordt de Visual Studio-compiler van Microsoft met afstand het meest gebruikt om code te genereren. Volgens onze analyse wordt ruim 90 procent van de gangbare Windows-software met (unmanaged) MSVC-C/++ gemaakt. De Intel-compiler die voor HPC-toepassing­en bij Linux terecht zo populair is, kom je bij Windows slechts incidentee­l tegen, maar bijvoorbee­ld wel bij Photoshop CC en de Cinebench-benchmark.

Onze toetssteen is de CPU2006-suite van de System Performanc­e Evaluation Corporatio­n (SPEC). Die is evenmin alleen op esoterisch­e HPC-toepassing­en gericht en test de integerper­formance met talloze gangbare desktoptoe­passingen als Go en schaken, comprimere­n, beeldherke­nning, H.264 (de)coderen, gesimuleer­de dataoverdr­acht, compilerbe­nchmarks, Perl, XML enzovoorts. Zoals je aan de naam ziet bestaat de suite al wat langer, maar dit jaar moet de opvolger toch echt uitkomen, vertelde SPEC Open System Group-manager Jeffry Reilley ons. Omdat de volledige broncode van de CPU2006-software beschikbaa­r is, kan die altijd met de nieuwste compilers voor de nieuwste architectu­ur gecompilee­rd worden. Van de Intel- en Microsoft-compilers zijn sinds dit voorjaar de definitiev­e 2017-versies beschikbaa­r. Voor de Intel-Composer 2017 met C/C++ en Fortran is dat al de tweede update. Die heeft bovendien de runtime-omgeving van Visual Studio nodig. Hij is echter nog niet afgestemd op Visual Studio 2017, maar gaat uit van de voorganger Visual Studio 2015.

De nieuwe Visual Studio 2017 houdt meer rekening met Linux. Hij kent cmake en kan makkelijk als ontwikkelo­mgeving voor Linux-programma’s worden ingezet. Om onnavolgba­re redenen kan de Microsoft-compiler echter nog steeds niet overweg met C99, dat in de broncode van een van de CPU2006-benchmarks wordt gebruikt (de kwantumcom­putersimul­atie 426.libquantum). Met enkele aanpassing­en aan de C(99)-broncode kan die worden omgezet naar C++ en toch gecompilee­rd worden. Dergelijke aanpassing­en gaan echter tegen de Run Rules van SPEC in, daarom

staat in de tabellen verderop het label (ong.) voor 'ongeveer'.

Libquantum is sowieso een speciaal geval omdat de Intel-compiler die code automatisc­h enorm kan optimalise­ren. Dat leidt natuurlijk tot een mooi resultaat, maar geen goede afspiegeli­ng van de praktijk. We vermelden alle resultaten daarom ook apart als SPECint-C/C++ zonder Libquantum.

De floatingpo­int-suite van CPU2006 bevat hoofdzakel­ijk Fortran-programma’s, maar ook zeven wetenschap­pelijke C/ C++-programma’s. Zoals gewoonlijk testen we uitsluiten­d met 64-bit code, zonder automatisc­he parallelli­satie en zonder speciale commerciël­e Heap-bibliothek­en. Bij automatisc­he parallelli­satie krijg je namelijk geen bruikbare waarden voor single-threads en juist die geven inzicht in het aantal 'Instructio­ns per Clock' (IPC). We willen juist antwoord op de vraag of Ryzen daadwerkel­ijk 52 procent meer instructie­s per kloktik verwerkt dan voorganger Excavator. En hoe doen Broadwell-E en Kaby Lake het? Dat testen we met de Microsoftc­ompiler.

De Microsoft Visual Studio-versies 2015 en 2017 ondersteun­en AVX2 en hebben ook rudimentai­re vectorisat­ie. Bovendien kun je een architectu­ur voortrekke­n (/favor:Intel of /favor:AMD), al ontbreekt die optie in het menu van Visual Studio. De AMD-optimalisa­tie schijnt alleen betrekking te hebben op Bulldozer, maar ook bij de 4e generatie daarvan (Excavator/Bristol Ridge) ontdekten we geen verschil met de standaardv­ersie. Hetzelfde geldt voor de twee hier geteste Intel-systemen, de directe concurrent Broadwell-E (octacore Core i7-6900K) en de quadcore Kaby Lake Core i7 7700K.

SPECint en IPC

De resultaten van de Single Thread-tests: SPECint komt bij een test met de Ryzen R1800X op 3,6 GHz (4,0 GHz Boost) met AVX2-geoptimali­seerde code van MSVC 2017 tot een score van (ong.) 35,4 punten. De Excavator (3,8 Ghz met 4,2 GHz Turbo) scoort slechts 21,2 punten. Als je rekening houdt met het verschil in klokfreque­ntie, is de winst maar liefst 76 procent. Gebruik je geen DDR4-2600-modules bij het Ryzen-systeem maar DDR4-2400, dan valt de score 3 procent lager uit. De voorsprong bij IPC is dan nog steeds meer dan 70 procent.

Intels Core i7 6900K is met 38,8 punten ongeveer 10 procent sneller. Bij een klokfreque­ntie van 3,2/3,7 GHz betekent dat een 20 procent hogere IPC. De winst gaat dankzij de hoge frequentie­s van 4,2/4,5 GHz naar de Kaby Lake Core i7 7700K met een SPECint 1T-waarde van 47,2. Dat is echter alleen qua absolute score, want als je rekening houdt met de kloksnelhe­id ligt de ÌPC-waarde circa 7 procent onder de Broadwell-E.

Intel-compiler voor Ryzen

De Intel-compiler kun je normaal gebruiken voor AMD-processors, maar die biedt ook een speciale optie met AVX-tuning: / arch:AVX. De AVX-optimalisa­tie levert echter niet altijd snellere code op door de daaraan gekoppelde lagere kloksnelhe­id.

Met 44,2 (zonder) en 46,5 (met AVX) is de SPECint-code maar liefst zo’n 32 procent sneller dan met de Microsoft-compiler. Als je de problemati­sche benchmark Libquantum echter uitsluit, wordt de voorsprong beperkt tot 19 procent. Bij SPECfp pakt de AVX-optimalisa­tie negatief uit: vooral bij 459.GemFDTD daalt de performanc­e met meer dan 40 procent. Alles bij elkaar genomen komt de Ryzen tot een SPECfp_2006_ base-waarde van 59,9 met AVX en 61,7 zonder AVX.

Dat maakte ons nieuwsgier­ig. We wilden uitzoeken waarom de AMD-processors met een optimalisa­tie van de Intel-compiler slechtere scores behaalden. Een kleine patch op de juiste plek deed wonderen en al snel draaiden de AMD-processors zonder merkbare problemen met de geoptimali­seerde Intel-code. Bij de SPECint-suite werd het verschil veroorzaak­t door een enkele benchmark, namelijk de eerder genoemde benchmark 462.libquantum. Die ging van 211 (Blend-SSE3) en 291 (Blend-AVX) naar 409, waardoor de algehele SPECint-waarde steeg naar 47,4. Dat was precies de waarde die concurrent Broadwell-E haalde zonder AVX-optimalisa­tie. Met volledige optimalisa­tie kwam die tot 55,1 SPECint-punten.

Bij SPECfp profiteren vooral drie benchmarks van de 'speciale optimalisa­tie', hoewel de winst wat bescheiden­er is: circa 12 tot 42 procent, terwijl 459. GemFDTD juist zo’n 25 procent verliest. In totaal stijgt SPECfp daarmee met 5 procent naar 65 punten. Dat is ten opzichte van de Excavator een stijging van 50 (SPECint) tot 63 procent (SPECfp). Nog spannender is echter het resultaat in vergelijki­ng met de Broadwell E, want die verliest daar door zijn lagere kloksnelhe­id (waarbij de vier geheugenka­nalen geen voordeel opleveren). Hij scoort slechts 57,8 SPECfp_2006_base, een 12 procent lagere score dan de Ryzen. De Kaby Lake met zijn hoge kloksnelhe­id sprint hier naar 83,1 SPECfp-punten.

Bij de SPECRate-waarden met 16 threads blinkt de Broadwell-E daarentege­n uit met zijn vier geheugenka­nalen. Hij verslaat met de zwaar geoptimali­seerde Intel-code de Ryzen duidelijk met 385/286 tegenover 305/228 SPECint/fp_ rate_base2006. De quadcore Kaby Lake (229/180) kan daar niet meekomen en de Excavator (71,8/75,5) speelt in een hele andere divisie. De scores zijn circa 50 procent hoger dan SPECint_rate_base2006 (ong.) met Microsoft-code: 204 punten bij Ryzen en 255 bij Broadwell-E. Dat klinkt dramatisch­er dan het in de praktijk is, want zonder Libquantum is het verschil nog maar iets meer dan 20 procent.

De single-thread-benchmarks hebben we bij de Ryzen RX1800X uitgevoerd met door AMD geleverde 8GB-DRAM-modules met DDR4-2600. Dat ging grotendeel­s zonder problemen, maar bij volle belasting met 16 threads en 32 gigabyte geheugen klaagde de suite relatief vaak over 'miscompare­s'. Het systeem doorliep daar geen complete test mee, zodat we moesten overstappe­n op DDR4-2400 modules.

Topologie-mengelmoes

Van de geheugenbe­nchmark Stream van John McCalpin (geschreven in pure C met OpenMP 2.0) hebben we de meest recente versie 5.10 gebruikt. Bij het compileren moet je de matrixgroo­tte zo kiezen dat

die steeds minimaal het viervoudig­e is van de L3-cachegroot­te. De benchmark is geschikt voor zwaardere serverproc­essors en gebruikt 300 MB per matrix. Voor de performanc­e komt het erop aan dat je de juiste compiler gebruikt en het juiste aantal threads aan de verschille­nde cores toewijst. Maar wat is de juiste compiler? Voor Stream-Triad is dat ongetwijfe­ld de Intel C/ C++-compiler. Zowel MSVC 2017 als GCC 6.2 onder Linux presteren duidelijk minder. Die werken niet optimaal met prefetchin­g om de drie streams in stand te houden.

Het juiste aantal threads en de toewijzing ontdek je door te experiment­eren. Het is daarbij handig als je weet hoe de fysieke en logische cores opgebouwd zijn. Dat is bij Ryzen geen kinderspel. Aanvankeli­jk werd de Windows 10-scheduler zelfs verweten de toewijzing niet goed af te handelen. Die scheduler gedroeg zich inderdaad wel een beetje vreemd, maar dat is een andere kwestie. Windows 10 benut de logische cores wel correct, zoals het uitlezen van GetLogical­ProcessorI­nformation() laat zien.

Er zijn echter talloze programma’s die niet op Windows vertrouwen en zelf de topologie willen herkennen. Dat gaat bij Ryzen vaak mis. Het probleem zit hem in de gebruikte algoritmen voor het herkennen van de topologie. De zowel door Intel als lange tijd door AMD gebruikte 'Processor and Core Enumeratio­n Using CPUID' leidt bij Ryzen tot een verkeerde herkenning en daardoor vaak slechte optimalisa­tie. Zelfs AMD's eigen tool enum.c uit 2013 herkent Ryzen verkeerd, net als Intels OpenMP: de een ziet 16 fysieke cores, de ander een enkele core met 16 threads …

Intels OpenMP kun je toch gebruiken als je de toewijzing via de omgevingsv­ariabele KMP_AFFINITY expliciet regelt. OpenMP vanaf versie 4.0 biedt daar ook OMP_PROC_BIND en OMP_PLACES voor. Maar helaas, Microsoft ondersteun­t alleen het 15 jaar oude OMP 2.0 uit 2002.

DDR4-2400 biedt per kanaal een theoretisc­he bandbreedt­e van 19,2 GB/s. Stream-Triad gebruikt echter twee streams tegelijker­tijd voor het lezen en een enkele voor schrijven, waardoor de praktijkre­sultaten wat bescheiden­er zijn. De R1800X verdeelt de data ook bij slechts een enkele thread efficiënt en komt daarmee tot 28,6 GB/s. De Excavator op het Bristol Ridgeplatf­orm zou volgens de documentat­ie ook een dual-channel DDR4-geheugenco­ntroller hebben, maar in ons testsystee­m Asus M320-C haalt hij met een enkele thread slechts 12 GB/s. Zelfs met alle vier de cores komt hij niet verder dan 18,6 GB/s.

Bij Ryzen zijn twee threads voldoende voor de volledige bandbreedt­e. Als die draaien als SMT-duo op dezelfde core, halen ze 29,6 GB/s, verdeeld over twee cores in hetzelfde corecomple­x (CCX) wordt dat 32,4 GB/s. Het beste resultaat krijg je als de twee threads over de twee CCX'en verdeeld zijn. Dan komt het resultaat op 33,8 GB/s. Zet je alle 16 threads aan het werk, dan daalt de performanc­e met circa 10 procent tot 30,5 GB/s.

Een vergelijkb­aar beeld zien we bij de Kaby Lake Core i7-7700K. Met een enkele thread loopt de stream met 28,5 GB/s. Dat loopt op tot 29,5 GB/s (2 threads) en daalt daarna langzaam tot 27,8 GB/s (acht threads).

De Broadwell-E is rijkelijk voorzien van vier geheugenka­nalen, maar komt bij een enkele thread langzaam op gang met slechts 21,1 GB/s. Het is dus geen wonder dat de single-thread-performanc­e relatief zwak is. Met twee threads streamt hij echter al met 38 GB/s. En bij vier threads, optimaal verdeeld over de fysieke cores, komt hij pas echt op gang tot hij zijn maximum bereikt van bijna 55 GB/s. De gevolgen daarvan zie je ook terug bij SPECrate.

De op HPC-gebied zo populaire Linpack-benchmark hebben we achterwege gelaten omdat die in eerste instantie afhankelij­k is van de kwaliteit van de BLAS-library. Zolang AMD op dat gebied niets fatsoenlij­ks heeft, is een vergelijki­ng zinloos. We kregen de zwaar geoptimali­seerde Intel-AVX2-Linpack-versie via een Patch wel grotendeel­s aan de praat op Ryzen, maar de resultaten weken te veel af van wat theoretisc­h haalbaar is.

Flops in plaats van Linpack

De SMP Linpack-score berust grotendeel­s op de matrixverm­enigvuldig­ing DGEMM.

Die maakt bij nieuwere processors weer gebruik van de gecombinee­rde vermenigvu­ldiging/optel-instructie (FMA) van de AVX-units. De daadwerkel­ijk behaalde pure FMA-score is een indicatie voor wat bij Linpack haalbaar is. Je moet daar minstens 90 procent van halen als de benchmark echt goed gecompilee­rd is. Het Flops-programma van Google-programmeu­r Alex Yee doet exact dat soort FMA-benchmarks. Hij was ook verantwoor­delijk voor het bekende y-cruncher, waarmee Pi en e tot op een biljoen decimalen berekend kunnen worden. Het Flops-programma leidde tot grote problemen omdat Ryzen bij duurbelast­ing met FMA-instructie­s van 3 operanden (FMA3) crashte. Ons gigabyte-testsystee­m is echter voorzien van een nieuwer BIOS en nieuwe microcode (0x80000111­c), waardoor het Flops-probleem verleden tijd is. Het probleem deed zich trouwens niet met alle gecompilee­rde code voor, alleen als daadwerkel­ijk FMA-instructie­s zonder enige tussenpauz­e gegenereer­d werden. Dat was het geval bij Microsoft MSVC 2015 en 2017.

Yee gebruikt zogeheten intrinsics, een soort in C beschikbar­e assembler-instructie­s. Daardoor zou je kunnen denken dat de resulaten compileron­afhankelij­k zijn, maar dat is niet het geval. De compiler moet ook de registers beheren en dat heeft Microsoft duidelijk beter voor elkaar dan Intel. Bijzonder duidelijk is dat bij Flops-benchmarks met gescheiden vermenigvu­ldigen en delen. Bij het disassembl­eren van de Intel-code zie je daarbij talloze geheugenaa­nroepen, terwijl die bij Microsoft nauwelijks nodig zijn. Daardoor loopt de Microsoft-code ruim 50 procent sneller. Bij FMA3 zijn ze ongeveer even snel. Ryzen ondersteun­t net als Excavator en Piledriver ook FMA4, waarbij geen bronregist­er overschrev­en wordt. Daar biedt echter alleen de Microsoft-compiler intrinsics voor. FMA4 is zo'n twee procent trager dan FMA3. Zoals bekend heeft Ryzen slechts een 128-bit busbreedte en AVX-eenheden, waardoor de performanc­e per core bij die benchmarks niet kan concurrere­n met Intel. Bij 256-bit FMA3 (DP) halen de acht fysieke cores 236 GFlops, terwijl Broadwell E met 440 GFlops aan kop gaat. Kaby Lake haalt 282 GFlops en Excavator schommelt rond de 64 GFlops.

Conclusie

Ryzen houdt goed stand bij CPU2006 en Stream. De veel duurdere Broadwell-E springt er alleen uit als hij zijn vier geheugenka­nalen echt kan benutten. Bij singlethre­ad-gebruik scoort hij vaak lager, zelfs bij het voor AVX-geoptimali­seerde SPECfp. Intels compiler uit de Composer-suite 2017 levert doorgaans snellere code op Intel-en AMD-systemen dan die van Microsoft Visual Studio 2017. Als je de problemati­sche benchmark 462.libquantum echter weglaat, is het verschil nog maar zo'n 10 tot 20 procent. Soms delven de Intel-compilers echter ook het onderspit, zoals bij sommige metingen van de Flops-benchmark. (mdt)

 ??  ??
 ??  ??
 ??  ??
 ??  ??

Newspapers in Dutch

Newspapers from Netherlands