Skrivet av MikaelSwahn:
Jag förstår inte riktigt varför folk fokuserar på IPC? Förrut fokuserade folk på hög GHz - var det vettigt? Kan man säga att en 3GHz cpu är snabbare än en 2GHz? Nej. Varför tror folk detsamma om IPC? Folk länkar till information om parallel programmering och i samma andetag pratar de om hög IPC - då har de inte förstått länken. Jag tycker att alla som programmerar professionellt borde läsa komplexitetsteori, speciellt parallell komplexitetsteori. Då hade de förstått varför man inte ska haka upp sig på IPC.
För den som inte har läst så mycket datavetenskap, kan sägas att vissa problem inte går att parallelliseras bra - precis som det står i den postade länken. Men om man förstått det så bör man ha fattat att IPC inte är så viktigt. Annars har man läst länken utan att förstå den.
Poängen är att vissa typer av problem har en viss max IPC och då spelar det ingen roll om cpun har 10x högre IPC eftersom det inte går snabbare än vad problemet har för inneboende IPC. T.ex. serverlaster har en IPC på runt 0.8, typ databaser, SAP, etc. Om man då tror att en hög IPC cpu hjälper för serverlaster så är man ute och cyklar. Om en viss typ av arbete inte går att parallelliseras, så har arbetet låg IPC, och då är det korkat att tro att en hög IPC cpu kommer prestera bra.
https://www.anandtech.com/show/10435/assessing-ibms-power8-pa...
"...Server workloads are much worse: IPC of 0.8 and less are not an exception...It is clear that simply widening a design will not bring good results..."
Så det finns folk som programmerar utan att ha djupare förståelse i datavetenskap, och sen uttalar sig med bestämdhet om saker de inte har någon aning om. T.ex. när man pratar serverlaster så jämför somliga Intel x86 som har hög IPC, mot RISC cpuer som har låg IPC och därför hävdar att x86 är snabbare. Trots att RISC cpun är 2-11x snabbare i 30-talet stora/vanliga benchmarks så fortsätter de envist hävda att x86 är snabbare. Varför? Jo, bl.a. därför att x86 har högre IPC. Man tar sig för pannan, de ignorerar fakta. Om folk var lite kunnigare så skulle man slippa felaktig ryktesspridning som t.ex. fokusering på hög GHz, eller på hög IPC. Man bör undvika att dra slutsatser när man är okunnig, och undvika att uttala sig med bestämdhet om sina egna slutsatser. Det blir lätt fel när man inte kan ämnet, och man framstår som korkad när man fortsätter envisas trots motsatt fakta. Teori är alltid bra att kunna. Annars blir man som Donald Trump "Fake News".
???
Vad som alla i denna tråd refererar till är faktiskt antal instruktioner utförd per sekund. Ingen har refererat till teoretisk IPC och om vi gjorde det skulle x86 ligga rätt risigt till.
per cykel och kärna gäller att
POWER8 kan "issue" upp till 8 instruktioner och kan "execute" upp till 16(!) instruktioner
Apples Monsoon (big-core i A11) kan "issue" upp till 6 instruktioner och "execute" upp till 9 instruktioner
Zen kan "issue" upp till 4 instruktioner (är inte hundra på om Zen har macro-op fusion, tror det och i så fall är det 5 vid lyckad sådan) och "execute" upp till 12 "micro-ops"
Skylake kan "issue" upp till 4 (blir effektivt 5 vid macro-op fusion) instruktioner och "execute" upp till 8 "micro-ops"
Ändå har Skylake (i form av Coffee Lake som är samma mikroarkitektur) klart högst enkeltrådprestanda av alla dessa. Apples ARMar har högst IPC i rätt många lägen, är minnesoperationer och SIMD där de fortfarande trillar efter Skylake.
Gissar att du gjort samma misstag som många andra kring IPC: för att IPC ska på något sätt vara vettigt att prata om använder man det som ett mått på hur många instruktioner som effektivt körs per CPU-tråd (d.v.s. inte ens CPU-kärna).
På Intel och AMD finns verktyg att mäta faktiskt IPC i ett program. Har använt det långt mer på Intel, där man kan se allt från hur många instruktioner front-end stoppar i sig, hur många som faktiskt når "retire" (vissa kastas ju bort p.g.a. felspekulering). Den IPC som vi "ser" är alltså de som når "retire" och där är Skylake och Monssoon i en klass förs sig.
POWER8 kan utföra mest per kärna, men det händer först nära man kör >2 trådar per kärna så den matchar aldrig Skylake (och än mindre Monsoon) i IPC.
Hög IPC är väldigt önskvärt i interaktiva applikationer, d.v.s. när svarstid är viktigare än total mängd utförd arbete. SMT är bra för att öka mängd utförd arbetsmängd, men det kan påverka svarstiderna negativt då mängden jobb utfört per tråd sjunker.
Enkeltrådprestanda är oftare än man tror viktigare i parallellprogrammering, d.v.s. fall där många CPU-trådar samarbetar för att lösa ett och samma problem, detta då maximal potentiell parallellism är begränsad av en dyraste seriella operation man utför.
Det i kontrast till trivialt parallelliserbar fall som man oftast har på servers, d.v.s. där man har många enkeltrådade uppgifter som körs parallellt, där är fler kärnor alltid bra så länge man har fler oberoende uppgifter att jobba på än vad det finns CPU-trådar. Länken beskriver denna distinktion väldigt bra faktiskt.
Edit:
Tror de flesta på SweC bryr sig rätt lite om hur bra systemet är att köra SPEC Benchmarks och liknande. Du har däremot helt rätt att många serverlaster har så stora "working-set" att de kommer aldrig få speciellt hög prestanda per CPU-trådar, d.v.s. de kommer ha väldigt låg IPC. Därför ser vi att t.ex. IBM POWER har upp till 8 trådar per kärna, varje tråd har låg IPC men tillsammans kan de hyfsat väl utnyttja en riktigt "bred" design.
Då serverlaster typiskt består av väldigt många, sinsemellan oberoende, uppgifter är det bättre att stoppa in fler kärnor än att pressa upp frekvensen (i normalfallet, undantag finns som vanligt alltid).
Interaktiva applikationer, framförallt spel, har tillräckligt små "working-set" för att ligga på >90 % cache-hit rate. Ovanpå det jobbar de normalt med problem som inte alls kan skalas till flera kärnor alt. skalas till relativt få kärnor. Högre IPC och hög frekvens är i det läget kritiskt då det är enda sättet att få högre prestanda.
Tyvärr är det rätt svårt att nå IPC över 2-2,5 i genomsnitt. Är helt enkelt för mycket beroende mellan instruktionerna. Men för att ens nå detta i genomsnitt måste man ha en väldigt hög maxkapacitet för att kompensera för passager där IPC faller ner mot 1 (och ännu lägre i lägen med cache-missar). "Normalt" desktop-kod jag mätt har typisk IPC på runt 1,5 till strax över 2,0 på Skylake.
Lite parallellism börjar ändå krypa in här i form av att utnyttja SIMD till att accelerera helt seriella programflöden. SIMD kan användas då kostnaden för fork-join av data är i princip noll, den är långt ifrån noll när man sprider ett jobb över flera CPU-kärnor!
Microsoft, Intel och LLVM-projektet (både för x86 och ARM) gör alla rejäla framsteg här (GCC får nog rycka upp sig, de har hamnat på efterkälken i detta race).
Intel har (till slut) insett att det inte är vettigt att köra med en CPU-design över hela linjen. Sättet man optimerar för servers är inte alls samma som man optimerar för desktop. Vi ser ju att Skylake SP (i form av SKL-X) får stryk av S-serien (t.ex. i7-8700K) i typiska desktop-laster, medan Skylake SP är klart bättre i typiska serverlaster än föregångaren (Broadwell Xeon är egentligen en S-serie med väldigt många kärnor + lite extra fluff som fler minneskanaler och DDIO).