audiofreak je napisao(la):
Koja je prednost veceg broja vidljivih registara ako postoji zavisnost izmedju podataka i ako se podaci moraju ucitavati u registre u svakom slucaju?
Kod dobro optimizovanog x86 koda, skoro da nema spilovanja vrednosti iz varijabli u memoriju.
Prednost je kod obrade petlji, vidi dole. Skoro? Na tvom kodu ili uopšte? Imaš neku nezavisnu studiju da potkrepiš tu tvrdnju?
Predlađem da tu ispravku pošalješ i autorima knjige u koji su između ostalog radili analizu P4. Profesori na priznatim američkim univerzitetima, iza sebe imaju dosta praktičnih projekata iz oblasti procesora.
Naravno da je moguce, cemu ti sluzi cache i prefetcher?
Bilo koja ALU operacija kojoj je jedan operand u memoriji koja nije keširana. Ili push/pop neke memorijske lokacije.
Nagradno pitanje za tebe, kako RISC ucitava vrednost iz memorije u registar? Meditacijom? Ili je i to instrukcija kojoj je source oprand memorija?!?
Nagradno pitanje za tebe: da li si u životu programirao jedan RISC? Rekao bih da nisi...
MIPS: lw a0,8(sp) <-- load word u a0, sa adrese sp+8
ili sa hardverskim imenima: lw $4, 8($29). Word je 32b
Alpha: LDL R4,8(R29)
PA-RISC: LDW GR4,8(GR29)
Postoje i parnjaci koji rade sa sa 64b podacima.
Jedino se učitava vrednost i ništa više. Uostalom, i ALU operacije koje potežu sa memorijom se interno izdele baš na ovakve operacije. To ni Intel ne krije.
I meni je u asembleru svejedno, uvek ima dovoljno registara ako se problem razbije na dovoljno male celine sto je i inace preporucljivo.
Sasvim razmuno i preporučljivo, ali ima slušajeva kad to nije tako, a ti slučajevi su od interesa u primenama.
To je mozda problem nekome, Intelovcima nije sigurno -- moraces ili da mi verujes na rec ili da disasembliras sam pa da vidis koliko je efikasan.
Ti si, naravno, kompajlirao kod kao da ima 16, 32, 64 registra i onda si na osnovu toga doneo zaljučke? Tako se meri uticaj broja registara na kompajler. Ovako, ti porediš izlaz Intelovog kompajlera sa samim sobom.
Ako su tako nepogodni, i neprijatelji visokog takta, a RISC ih nema -- kako to da onda RISC vec ne radi na 10+ GHz?
I RISC procesori koriste te tehnike. Zatim, takt zavisi i od tehnologije izrade gde Intel ima prednost zbog većeg tržišta.
I molim te, nemoj da porediš taktove i uz njih peak performanse. Deluješ smešno. Samo konkretni rezultati iz aplikacija i testova tipa SPEC, NASPB, PERFECT, LL i slični. Već sam napisao poređnje Alphe i R10000, vidi razliku između peak performansi i rezultata u radu.
Nije ni to tacno, vec zato sto apsolutno nema potrebe za vecom preciznoscu.
Jel ovo thread o procesoru opšte namene ili DSPu za obradu zvuka? Odlepi se od obrade audio signala, ima još dosta drugih primena. Ja ti mogu reći da je fixed nepotreban za SOR algoritam. Ili možda GMRES ili BiCGSTAB. Što ne probaš da ih realizuješ u fixed aritmetici? I procesorima opšte namene manjka dosta DSP stvari kao što je aritmetika sa zasićenjem i brz MAC.
Wiener filtriranje, dekonvolucije, itd.
Pošto mnogo voliš audio, jel si mislio na audio ili sliku?
Napisi mi to u C-u, mrzi me da se smaram sa desifrovanjem RISC instrukcija.
Jak programer u asembleru, plus što pokazuješ da nisi programirao na takvim procesorima a pričaš kako rade. Ovo stvarno postaje bespredmetno.
🙂
c=a+b;
e=c+d:
Slučaj prave zavisnosti (u terminologiji kompajlera) ili RAW hazard (u terminologiji procesora).
Vidim ako izvrsim CPUID instrukciju i procitam odgovarajuci MSR. I sta sad? :-devil-:
Aha. I onda iz neke tabelice izvadiš podatak koliko taj procesor ima stepeni pipelinea, u kojem je procesu radjen i slične podatke. A šta kad izađe nov procesor? :-devil-:
Prvo, zasto mislis da je razmotavanje kljucna optimizacija? Drugo, zasto mislis da 8 registara koci optimizujuce kompajlere? Iskreno, kad si poslednji put pogledao x86 asemblerski kod?
To povećava koristan posao u petlji, daje scheduleru više prilike da rasporedi instrukcije, da sakrije latenciju load i fp operacija. I povećava potrebu za registrima. Uostalom, primer iz prakse, probaj da ga oboriš: KAI front end za IBM RS/6000 je pomoću unroll-and-jam i scalar replacment ubrzavao SPEC Matrix300 test 4.58 puta. To je jedan od glavnih razloga zašto je taj test izbačen. Koja optimizacija sem blokiranja može da proizvede takva ubrzanja?Takođe, razmotavanje petlji je osnova za vektorizaciju.
x86 ozbiljnije gledao pre oko godinu dana, ovlaš često. U međuvremenu sam uglavnom gledao kod sa 32 int i 32 fp registra, svi 64b.
Kada si ti zadnji put kodirao na nekom RISC procesoru? Nikad?
Koliko vidim njihov kompajler se vise nego dobro snalazi sa tim sto ima, a sto bi neko preko hleba pogacu... :smoke:
Ili kompajler sličnog kvaliteta kao na drugim platformama?
Koliko su cesti takvi procesori? Na kom taktu takav cip maksimalno moze da radi? Kakav cache mora da ima? Data bus? Memoriju? Koliko to sve kosta? Da li je za desktop?
Radili su na nekih 500 MHz pre 10ak godina, izrađeni u ECL tehnologiji, ali bilo ih i u CMOS, bez keša, cela memorija SRAM. Brkaš pojmove. Registar može da ima 64 elementa od po 64 bita, ali ne znači da će u jednom ciklusu da sve obradi. Koju to memoriju traži? Prosto: koliko para toliko muzike. Ako hoćeš procesor koji brže računa i da je to na realnim workloadima moraš da imaš brzu memoriju. Brz i jeftin procesor relativno lako napraviti, brza memorija je malo krupniji zalogaj. Za to je delom kriv trend smanjivanja jer mesto da glavna memorija bude organizovana u (recimo) 4 banke sa 4 modula postoji samo 1, eventualno 2 modula. Zamisli P4 na 3GHz, sa EDO RAMom. Sumnjam da bi to bio spektakularan procesor čim podaci izađu iz L2 keša.
Cena je prava sitnica danas, pošto napraviti takav registarski fajl nije mudrost, niti zahteva mnogo prostora, u stvari manje nego za skalarni r.f. iste brzine. Cena se lako amortizuje na ogromnom broju proizvedenih primeraka. Međutim, nije valjda problem na 100M tranzistora dodati 100-200K kad su slične registre imali procesori koji su celi imali u oko 800K tranzistora, pride rađeni u procesu od 1 mikron.
Znam, ali postoji nacin da neke delove racunas sa FP a medjurezultate samo u double ukoliko procenis da je dovoljno precizno i da se dobija u brzini.
Naravno da ovo treba raditi uvek gde se može. Nažalost, to često nije moguće. Ti previše generalizuješ iskustva iz svoje oblasti na ostale primene.
C++ ima overload za float verzije.
Ima to i C, na IRIXu. Standardizacija na papiru i u realnosti?
Nece biti, naveo sam tacne latencije i repeat rate.
I u međuvremenu imaš senku koju treba pokriti nečim. Više registara, više šansi da se senka pokrije. Throughput je koliko instrukcija izađe u svakom ciklusu.
Postoji gomila ljudi koja se tripuje da veci broj registara nesto znaci. To su
snip
Eno lameri na Riceu i u NASAi. Tvoj komentar deluje razumno, ali ga praksa demantuje. Najjednostavnije petlje tipa DAXPY, SAXPY, DOTPROD kad se razmotaju traže dosta registara.
Preprouka: sem Intelove literature, pogledaj i neku drugu, ali ne Linux nego recimo kako to radi NASA, dizajn procesora, guidove za vektorizaciju i paralelizaciju na Crayovima. Crayu je ona bila sve, a Intelu fin dodatak.
Skoro svaka petlja u kojoj postoji konverzija tipova za koju ne postoji direktna instrukcija u setu se ne moze automatski vektorizovati. Probaj i sam pa ces videti.
Nagradno pitanje: a zašto set instrukcija nije malo bolje dizajniran?
Pre nisu mogle da se vektorizuju petlje sa ifom u sebi, ili petlje koje su radile sa sparse matricama. Danas se i jedno i drugo, naročito drugo, vektorizuje bez većih problema.
MSVC6 je uzasan. ICC7 je sada vec star, a ICC9 je mnogo agresivniji u optimizaciji. Takodje, pitanje je koje ste switcheve koristili za ICC.
Znači otprilike, kad Intelov procesor zastari, onda je kompajler za njega dobar. Drugo, tada sam upoređivao brzine kompajlera. Sad sve ide Intelovim, a baš me nije mnogo zanimalo da se igram opcijama i beležim podatke.
Sto se tice lokaliteta to se da srediti. Ne znam da li si upoznat sa cinjenicom da se nekad vise isplati prepakovati podatke da budu blizu pa pustiti obradu nego raditi obradu nad podacima koji imaju los lokalitet. No i to moze da se proba...
Ne znam da li si upoznat sa pojmovima: unit stride access, non-unit stride access, scather/gather?
Upoznaj se malo bolje sa pojmom legacy kod.
snip
I prvu i drugu sekvencu generise kompajler. Prvu generise MSVC6, a drugu svi moderniji. I jedno i drugo je smislio covek, a u prvom slucaju doticni nije imao pojma o hardveru i nacinu na koji funkcionise. O tome ja pricam.
Legacy kod različitim ljudima različito znači. Nekima je sav kod u Fortranu legacy :-devil-: i to uglavnom onima koji ga nikad nisu videli.
Borlandovi daju još gori kod, čak i bez optimizacija koje se vide iz aviona, provereno u praksi. Ostaje mi da se zapitam zašto se VC6 i dalje koristi i podržan je od solidnog broja firmi i zašto Intel nije ranije počeo da razvija kompajlere.
Tacno, ali izuzetaka ima i tada se mora raditi rucno. Ako treba neki primer samo reci, tu sam.
GMRES i BiCGSTAB. Fixed point ako može.
😀
Danas se FFT moze racunati i na GPU.
"Svi procesori teže da postanu opštenamenski."
Ipak, GPUovi nemaju podršku za double i veliku količinu memorije. Za obradu slike ili signala, ok, za rešavanje ozbiljnijih PDEova - truba.
Rade GPUovi danas i iterativna rešavanja za PDEove. Super za dinamiku fluida u igrama. Ali niko pri zdravoj pameti neće uzeti da na GPU računa simulaciju turbine.