För ett halvår sedan publicerade @Yoshman ett program som mäter latenser mellan kärnor och hårdvarutrådar. I fortsättningen kallar jag det här Threadpinger; han kallade det för th_ping. Jag testade det på min gamla Intel Core Q6600; det blev en liten tråd i tråden som slutar här:
Skrivet av Yoshman:
OK, kan ju kvitta om make fungerar eller ej. Men rätt skumt... Inte så att du har något annat än GNU-make installerat? För det jag skrev bygger på att man kör just GNU-make som har en rad implicita regler som ofta faktiskt gör att man kan klara sig utan eller med extremt enkla makefiler.
Intressant numrering på Q6600, verkar som 0 och 3 respektive 1 och 2 delar L2$.
Sedan är det så att delad L2$ inte alltid är det enda sättet att få lägsta latens. Kolla in resultatet för Z3770 (Silvermont Atom, två kärnor delar L2$, ingen L3$ och är totalt fyra kärnor).
This system got 4 CPU-threads
0 <-> 1 : 121 ns
0 <-> 2 : 84 ns
0 <-> 3 : 83 ns
1 <-> 2 : 84 ns
1 <-> 3 : 84 ns
2 <-> 3 : 118 ns
Här är alltså latensen HÖGRE mellan de två kärnor som delar L2$ (0 och 1 samt 2 och 3) än mellan de som bara delar RAM. I detta läge finns antagligen någon logik för att skicka information mellan kärnor i kretsen + Silvermont har ett extremt simpelt sätt att hantera x86 strikta minneskonsistensmodell: är typ skriv A B C. Om skrivningen på A av någon anledning "stallar", t.ex. cache-miss, så slänger man bara in A B C i en ring-buffer. Varje varv kollar man om A nu kan skrivas, när svaret är "ja" testar man B etc.
RPi3 (ARM Cortex A53) demolerar verkligen Silvermont på denna punkt, halva latensen (nu kör jag i.o.f.s relaxed memory ordering, det gynnar ARM mer än x86, lägger på ~7 ns för ARM om man går till "sequentially consistent" memory ordering).
Allt detta gör inte Ryzen till en dålig CPU, precis som allt annat har konstruktörerna gjort avvägningar. Dessa avvägningar gör den mindre lämpad för vissa uppgifter och mer lämpad för andra.
Ryzen är ruggigt bra på skalära flyttal, CCX-designen ger skalbarhet och den är ingen nackdel för saker där det är lite kommunikation mellan kärnor (något som är relativt vanligt i just flyttalsintensiva program).
Core är brutal på sådant som kan vektoriseras och lysande på skalära heltal. Man ser också att core-to-core latensen är lägre i S-modellerna än i E- och E5. Enkelt att förstå på en teknisk nivå och vettigt när man tänker på målmarknader för respektive krets.
Här testar jag programmet på AMD Ryzen Threadripper 1950X, som har en NUMA-liknande arkitektur.
Först kompilerar jag (på Linux, Debian) med:
make CXXFLAGS=\"-std=c++11 -O2 -pthread\" th_ping
Därefter kör jag programmet, som sätter igång kärnornas hårdvarutrådar och testar dem en efter en, mot vararandra. Det blir (32*32-32)/2=496 körningar. Här visar jag det med det skript jag gjorde med conky:
Man ser här hur cpu01 sprutar ut trafik mot hårdvarutrådarna, en efter en. På bilden håller cpu17 på att avsluta sin trafik.
Jag har även gjort ett skript för R:
th <- as.matrix(read.table("th_ping.txt", row.names=NULL, skip=1))
th <- t(apply(th[, c(1,3,5)], 1, as.numeric))
th <- cbind(t(t(th[,c(1,2)]+1)),t(t(th[,3])))
write.csv(th, file = "th_ping.csv")
th
Dold text
som tar utfilen från Threadpinger och gör om den till en matris. Den här matrisen använder jag sedan i ett annat paket i R och försökte få ett snyggt diagram för att visa hur trafiken fördelas.
library(“qgraph”)
qgraph(th, layout='spring', vsize=3)
Dold text
Det blev lite otydligt... Jag hade lite bråda dagar så det fick bli en skärmdump från ett kalkylark:
Ouch. Nja, det här är från en oklockad cpu och oklockade minnen. Men, det är höga latenser, även om det inte återspeglas i alla benchmarks alls. Kanske är det de låga värdena på 18-22 ns mellan som hjälper till. 1950X är ju bra även på många speltitlar.
Nästa steg lär kanske att bli att testa vad överklockning av cpu eller minnen kan ge för latenser.
Det vore spännande att se vad andra får för värden med Threadpinger på sina cpuer. Testa att kompilera den själva, den fungerar ju på Windows också.
EDIT 2017-12-25. Jag har uppdaterat BIOS till 2.0, vilket jag även beskrivit i en annan tråd. Här beskriver jag vilken effekt det hade på latenstiderna (i nanosekunder, ns) på Threadpinger:
BIOS 1.3 | BIOS 2.0 |
20 | 20 |
244 | 244 |
334 | 331 |
387 | 379 |
Det blev en förbättring på upp till 2 %. Om det är en "äkta" förändring har jag ingen uppfattning om, då det kanske är inom normal variation.
EDIT 2: Jag beskrev i en annan tråd hur jag överklockat från 3.4 GHz + 2133 MHz till 4.1 GHz + 3200 MHz; på BIOS 2.0 i båda fallen.
3.4 GHz + 2133 MHz | 4.1 GHz + 3200 MHz | Change |
19.69 | 24.57 | 19.87% |
244.00 | 169.94 | -43.58% |
330.82 | 230.00 | -43.83% |
378.89 | 260.13 | -45.66% |
En försämring från 20 till 25 ns bryr jag mig inte om. En förbättring i latenserna i övrigt är runt 45 %! Jag är mycket nöjd!
EDIT 3: Hmmm. Den glädje som varar. Körde Blender och barbershop, och, då frös datorn. Provade att öka fläkten från "Silent Mode" till "Performance" och med öppet fönster, men det hjälpte inte. Har nu sänkt minnena till 2933MHz, då jag räknar med att det är de som inte riktigt hänger med. Det påverkar Threadpinger:
4.1 GHz + 3200 MHz | 4.1 GHz + 2933 MHz | Change |
24.57 | 25.62 | 4.08% |
169.94 | 185.00 | 8.14% |
230 | 252.14 | 8.78% |
260.13 | 289.41 | 10.12% |
Ja, det är fortfarande hyfsat bra. Geekbench påverkas också, främst då single-core verkar det som.
https://browser.geekbench.com/v4/cpu/5771072
Jag skall försöka hitta en stabil nivå under de närmaste dagarna. Hinner inte mycket mer nu.
EDIT 4. Jag hann en till Threadpinger:
4.1 GHz + 2933 MHz | 4.1 GHz + 2666 MHz | Change |
25.62 | 27.13 | 5.55% |
185 | 205.00 | 9.76% |
252.14 | 278.49 | 9.46% |
289.41 | 317.34 | 8.80% |
Skall köra en Geekbench också.
EDIT 5, en Geekbench som naturligtvis fryser vid 4.1GHz och 2666MHz på minnena. Mistänker nu att det är överklockningen av cpu:n som spökar.
EDIT 6: 2017-12-26. Jo, nu gick Geekbench på 2666 MHz. https://browser.geekbench.com/v4/cpu/5782611. Men, nu blir det uppehåll på någon dag eller så.
EDIT 7: Testade att ändra volten. Defaultvärdet är 1.12500 V. Jag ändrade det enligt videon till 1.36250 V. Allt ovan är med detta högre värde. Det kanske är lite högt så jag sänkte det rejält, först till 1.24375 V och 1.27500 V, men ingen av dessa bootar rent. Nu ligger jag på 1.31875 V, vilket bootar i alla fall. Nu blir det uppehåll, med bilkörning.