drfedja
CPU Guru
- Učlanjen(a)
- 01.04.2009.
- Poruka
- 3.084
- Rezultat reagovanja
- 14
Moja konfiguracija
PC / Laptop Name:
Dell n5010, Intel Core i3 370M 2.4 GHz, 4 GB DDR3 1333
CPU & cooler:
Intel Core i7 4790K @ 4.5 GHz
Motherboard:
Biostar Hi-Fi Z97WE
RAM:
16GB Kingston HyperX Beast 2400
VGA & cooler:
Sapphire AMD Radeon R9-280X
Display:
Viewsonic VA2342 23" LED, LG 25"Ultrawide, Samsung VA2342 23"
HDD:
Samsung SSD850 Evo 250GB, Kingston 120GB V300 SSD, 2x1GB WD Caviar black
Sound:
Altec Lansing 5100E
Case:
Cooler Master 690-III
PSU:
Cooler Master G650M modular
Optical drives:
N/A
Mice & keyboard:
Keyboard/Mouse Cooler Master Storm
Internet:
Cable
OS & Browser:
Windows 10 Pro 64-bit
Other:
iPhone 6S 64GB
Sigurno ste se pitali zašto Buldi ima loše rezultate u FP intenzivnim aplikacijama i zašto npr. Linpack daje očajne rezultate.
Malo sam se bahtao sa time kakve penale ima deljen FPU i kakve su mogućnosti rada sa ovim deljenim resursom, koja su uska grla i došao sam do zaključka da su stručnjaci iz AMD-a napravili mali broj read/write portova.
Naime o čemu se radi, FPU za učitavanje podataka iz jezgara, odnosno L1D cache-a koristi load buffer koji je u stanju da učita ili piše najviše 2 operacije i to najviše 128-bitne. Nebitno je koliko podataka iz registara u L1D keš treba da transferuje, moguće su jedino i samo dve operacije, bilo da je jedan thread u pitanju ili dva. Evo dokaza:
1 thread, 2x128-bit SSE2 load:
Jasno se vidi da je transfer preko 100GB/s iz L1 keša. Namerno je postavljena vrednost dataseta na 8KB da bi stao u 16K L1-D cachea BD jezgra.
Računica je jednostavna, 2x16B(2x128-bit)x4.1GHz = 131 GB/s, što je teoretski maksimum, ali u praksi je iskorišćenje L1D cache bandwidtha oko 80% u ovakvim situacijama. Dakle, BD, kao i Phenom poseduje 2x128-bit load.
2 thread, 2x128-bit SSE load:
Šta se ovde dešava? Pa iako BD ima separatni L1D keš u svakom integer jezgru, bandwith je prepolovljen. Usko grlo nije integer blok, nego load buffer u FPU jedinici i broj 128-bitnih SSE2 portova. Jasno je da nije moguće izvršiti više operacija istovremeno od dve na FPU jedinici iz prostog razloga jer je ograničen broj izvršnih jedinica i portova. Svaki thread dobija po 1x128-bit load, što se jasno vidi iz transfera. Transfer za oba threada je vrlo sličan kao i transfer za jedan thread.
2 thread-a, 1x128-bit load, 1x128-bit store:
Ovde imamo upis, koji je zapravo daleko manji od 128-bit storea i polovinu ukupnog load bandwitha. Imamo samo dve operacije za dva threada iako imamo 2 jezgra sa dva L1D cache-a koji navodno imaju 2x128-bit loada i 1x128-bit store, 4-wide dizajn, tu bi moralo da bude moguće obaviti barem 4 keš operacije po ciklusu. Naravno, usko grlo je fpu load buffer, a nizak transfer upisa u L1D keš je uzrokovan write back keš arhitekturom, kod koje brzina upisa u L1D zavisi od transfera u L2 jer se za svake novu liniju koja se upisuje u L1, linija sa tog mesta se izbacuje u L2.
Elem, poenta je da su i dalje moguće samo 2 operacije. FPU load buffer koristi 2 porta širine 128-bita za upis i čitanje, ekskluzivno. Dakle, ne može 2 load-a i 2 store-a, može ili 2 loada ili 2 store-a ili 1 load i 1 store.
2 thread-a, 1x128-bit SSE2 load, 1x64-bit MMX load
Flex FPU ima 2 128-bitne FMA jedinice, koje izvršavaju SSE2 instrukcije i ima još dva pipelinea koja izvršavaju pakovane integer operacije, t.j. MMX, integer SSE ili XOP itd....
U ovom primeru se vidi da iako ne manjka izvršnih jedinica, i dalje se izvršavaju samo 2 operacije iz 2 različita threada. Dakle, razlog tome je mali broj FPU portova.
Dakle, FlexFP unutar Buldožer modula može da izvrši i više od 2 operacije, ali možda u nekim situacijama gde imamo rad sa registrima.
Iskreno voleo bih da vidim uskoro kako ova mikroarhitektura tretira rad sa novim ultra fancy FMA4 instrukcijama, s obzirom da je količina podataka koju jedna FMA instrukcija nosi praktično 2x veća od SSE2.
Trebaju nam operandi A*B+C i ciljni registar, ne destruktabilni, svaki po 128-bita. U principu za izvršavanje FMA4 potrebno je učitati u registar tri 128-bitna operanda. Čisto me interesuje da li Flex FP ovu operaciju čitanja tretira kao jednu operaciju, što bi bilo logično da je tako inače ne bi bilo nikakve koristi od famoznih instrukcija.
Malo sam se bahtao sa time kakve penale ima deljen FPU i kakve su mogućnosti rada sa ovim deljenim resursom, koja su uska grla i došao sam do zaključka da su stručnjaci iz AMD-a napravili mali broj read/write portova.
Naime o čemu se radi, FPU za učitavanje podataka iz jezgara, odnosno L1D cache-a koristi load buffer koji je u stanju da učita ili piše najviše 2 operacije i to najviše 128-bitne. Nebitno je koliko podataka iz registara u L1D keš treba da transferuje, moguće su jedino i samo dve operacije, bilo da je jedan thread u pitanju ili dva. Evo dokaza:
1 thread, 2x128-bit SSE2 load:
Jasno se vidi da je transfer preko 100GB/s iz L1 keša. Namerno je postavljena vrednost dataseta na 8KB da bi stao u 16K L1-D cachea BD jezgra.
Računica je jednostavna, 2x16B(2x128-bit)x4.1GHz = 131 GB/s, što je teoretski maksimum, ali u praksi je iskorišćenje L1D cache bandwidtha oko 80% u ovakvim situacijama. Dakle, BD, kao i Phenom poseduje 2x128-bit load.
2 thread, 2x128-bit SSE load:
Šta se ovde dešava? Pa iako BD ima separatni L1D keš u svakom integer jezgru, bandwith je prepolovljen. Usko grlo nije integer blok, nego load buffer u FPU jedinici i broj 128-bitnih SSE2 portova. Jasno je da nije moguće izvršiti više operacija istovremeno od dve na FPU jedinici iz prostog razloga jer je ograničen broj izvršnih jedinica i portova. Svaki thread dobija po 1x128-bit load, što se jasno vidi iz transfera. Transfer za oba threada je vrlo sličan kao i transfer za jedan thread.
2 thread-a, 1x128-bit load, 1x128-bit store:
Ovde imamo upis, koji je zapravo daleko manji od 128-bit storea i polovinu ukupnog load bandwitha. Imamo samo dve operacije za dva threada iako imamo 2 jezgra sa dva L1D cache-a koji navodno imaju 2x128-bit loada i 1x128-bit store, 4-wide dizajn, tu bi moralo da bude moguće obaviti barem 4 keš operacije po ciklusu. Naravno, usko grlo je fpu load buffer, a nizak transfer upisa u L1D keš je uzrokovan write back keš arhitekturom, kod koje brzina upisa u L1D zavisi od transfera u L2 jer se za svake novu liniju koja se upisuje u L1, linija sa tog mesta se izbacuje u L2.
Elem, poenta je da su i dalje moguće samo 2 operacije. FPU load buffer koristi 2 porta širine 128-bita za upis i čitanje, ekskluzivno. Dakle, ne može 2 load-a i 2 store-a, može ili 2 loada ili 2 store-a ili 1 load i 1 store.
2 thread-a, 1x128-bit SSE2 load, 1x64-bit MMX load
Flex FPU ima 2 128-bitne FMA jedinice, koje izvršavaju SSE2 instrukcije i ima još dva pipelinea koja izvršavaju pakovane integer operacije, t.j. MMX, integer SSE ili XOP itd....
U ovom primeru se vidi da iako ne manjka izvršnih jedinica, i dalje se izvršavaju samo 2 operacije iz 2 različita threada. Dakle, razlog tome je mali broj FPU portova.
Dakle, FlexFP unutar Buldožer modula može da izvrši i više od 2 operacije, ali možda u nekim situacijama gde imamo rad sa registrima.
Iskreno voleo bih da vidim uskoro kako ova mikroarhitektura tretira rad sa novim ultra fancy FMA4 instrukcijama, s obzirom da je količina podataka koju jedna FMA instrukcija nosi praktično 2x veća od SSE2.
Trebaju nam operandi A*B+C i ciljni registar, ne destruktabilni, svaki po 128-bita. U principu za izvršavanje FMA4 potrebno je učitati u registar tri 128-bitna operanda. Čisto me interesuje da li Flex FP ovu operaciju čitanja tretira kao jednu operaciju, što bi bilo logično da je tako inače ne bi bilo nikakve koristi od famoznih instrukcija.