Ursprunget verkar vara denna patch till GCC som AMD själva laddat upp
Det han sedan baserat bilden på är dessa delar
;; Decoders unit has 4 decoders and all of them can decode fast path
;; and vector type instructions.
(define_cpu_unit "znver1-decode0" "znver1")
(define_cpu_unit "znver1-decode1" "znver1")
(define_cpu_unit "znver1-decode2" "znver1")
(define_cpu_unit "znver1-decode3" "znver1")
...
;; Integer unit 4 ALU pipes.
(define_cpu_unit "znver1-ieu0" "znver1_ieu")
(define_cpu_unit "znver1-ieu1" "znver1_ieu")
(define_cpu_unit "znver1-ieu2" "znver1_ieu")
(define_cpu_unit "znver1-ieu3" "znver1_ieu")
(define_reservation "znver1-ieu" "znver1-ieu0|znver1-ieu1|znver1-ieu2|znver1-ieu3")
;; 2 AGU pipes.
(define_cpu_unit "znver1-agu0" "znver1_agu")
(define_cpu_unit "znver1-agu1" "znver1_agu")
(define_reservation "znver1-agu-reserve" "znver1-agu0|znver1-agu1")
(define_reservation "znver1-load" "znver1-agu-reserve")
(define_reservation "znver1-store" "znver1-agu-reserve")
...
;; Floating point unit 4 FP pipes.
(define_cpu_unit "znver1-fp0" "znver1_fp")
(define_cpu_unit "znver1-fp1" "znver1_fp")
(define_cpu_unit "znver1-fp2" "znver1_fp")
(define_cpu_unit "znver1-fp3" "znver1_fp")
(define_reservation "znver1-fpu" "znver1-fp0|znver1-fp1|znver1-fp2|znver1-fp3")
I en annan del av patchen står cache-storlekarna:
32, /* size of l1 cache. */
512, /* size of l2 cache. */
så borde vara ganska säkert att Zen har 32kB L1d$ och 512kB L2$.
Lär med 99% sannolikhet har 4 cyklers latens och vara en 8-set associativ L1d$ (det gör varje set 4kB stort -> samma storlek som minsta "page" storlek -> TLB$ och L1d$ kan utföras parallellt -> snabbare -> win
Frågan är vilken bandbredd och framförallt latens man får i sin L2$, Intel har ju stannat kvar vid sin relativt lilla L2$ just för att man då kan hålla latensen på 11-12 cykler. De flesta andra designer som kan nå >2GHz har ~20 cyklers latens mot L2.
Vad det gäller designen så ser ALU-enheterna ut att var väldigt symmetriska, d.v.s en tillbakagång till hur Athlon/Phenom såg ut fast de hade tre pipes medan Zen har fyra. De fyra flyttalspipe:sen ser däremot ut att vara väldigt asymmetriska (dock verkar alla kunna flytta data vilket nog är en fördel då flyttalsdelen är separat precis som på Bulldozer), så svårt att säga hur dessa står sig mot de tre som finns i Bulldozer-familjen där det enligt GCC-modellen är två väldigt symmetriska flyttals-pipes och en som gör lite mer udda saker, d.v.s. tre totalt.
NOTE: inte säkert att Zen rent fysiskt ser ut exakt så här, .md filer i GCC är en förenklad modell av en CPU som används för att GCC ska kunna lägga ut en bra mix av instruktioner.
Edit: Rätt säker att det är en bug i .md filen också
(define_insn_reservation "znver1_sseavx_fma" 5
(and (eq_attr "cpu" "znver1")
(and (eq_attr "mode" "SF,DF,V4SF,V2DF")
(and (eq_attr "type" "ssemuladd")
(eq_attr "memory" "none"))))
"znver1-direct,(znver1-fp0+znver1-fp3)|(znver1-fp1+znver1-fp3)")
enligt detta så måste fused-multiply-add alltid gå igenom FP3, det skulle betyda att man inte kan köra 2 FMA per cykel och bilden som gjordes är i så fall fel. Ska nog vara (znver1-fp0+znver1-fp2)|(znver1-fp1+znver1-fp3)