Diskuze: počet operací za sekunud
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Operace za sekundu se měří u procesoru ne?...a ne u aplikací.
Aha, ale myslel jsem, že aplikace například hra vykonává nějaké úkony (operace), které se dají měřit. tak to nic, ale díky
To není tak snadné jak si myslíš. I ASM příkazy se nevykonávají na
jeden tik procesoru (podmínka se myslím vykoná třeba na tři tiky). Takže
na té nejprimitivnější úrovni můžeš počítat tiky procesoru za sekundu.
Ale vzhledem k tomu, že tě procesor může kdykoliv odpojit a nastoupí jiný
proces, nejde to hodnotit objektivně.
U Javy je to ještě trošku komplikovanější, protože nevíš, co na pozadí
dělá.
Pokud máš nějakou část kódu, a chceš zjistit kolikrát za sekundu
proběhně, jednoduše dej na konec kódu počitadlo a po sekundě se vždy
podívej, kolik jsi napočítal + vynuluj. U her se napříkald klasicky měří
FPS.
díky. já to v FPS měřím, ale jen mě zajímalo, jestli to nejde měřit
na procesy, protože dělám projekt o vývoji počítačů a chtěl jsem tam
pro zajímavost dát, kolik procesů se vykonává na tu hru, co jsem
naprogramoval, aby si to mohli lépe představit. vím, která část a
kolikrát za sekundu se opakuje, ale je mi jasný, že všechno není na jeden
proces, jak jsi psal, tak nemůžu spočítat řádky kódu. Stačilo by to jen
orientačně. Nevíš o nějakým způsobu ? Chtěl jsem to pro zajímavost
porovnávat se starýma počítačema, kolik procesů oni byly schopni za
sekundu vykonat a kolik je potřeba na nějakou primitivní hru.
Děkuji Marek
Myslím, že si pleteš pojmy. Proces je něco úplně jiného a nemá s tím
nic společného.
Čistě teoreticky neměl by být udávaný takt počet tiků za sekundu?
Tak teď tě moc nechápu. Moc se zrovna tady v tomto nevyznám. Všude u počítačů je udávaný, kolik provádějí operací za sekundu. Potřeboval bych to nějak úplně jednoduše, aby to pochopil každý k něčemu přirovnat. Jak to mám udělat ? Přirovnávat to k nějakým dnešním počítačům se mi moc nezdá, tak jsem myslel, že by to šlo přirovnat, kolik operací vykonává počítač na to, aby jsi mohl hrát nějakou hru, a proto jsem chtěl nechat nějak změřit ty operace.
Zjednodušeně řečeno, takové porovnání není možné.
Pokud rozdělím procesory na "staré" a "nové", dostanu jednoznačný řez - Intel CPU 486SX/DX/DX2 a Intel Pentium (I).
Až do doby 486 se rychlost CPU měřila v počtu cyklů za vteřinu, a i když dnešní procesory stále používají stejné značení (např. Intel Core i7 3.2GHz), je dneska tahle hodnota z hlediska výkonu naprosto nevýznamná. Takže pokud například přemýšlíš, které CPU dát do sestavy, tak bys měl číslo před GHz ignorovat.
"Stará" CPU měla pevně dané tabulky, které udávaly, kolik cyklů stojí každá instrukce. Jenže výkon šel neustále nahoru a začalo být jasné, že pokud bychom měli dosáhnout dnešního výkonu na tehdejší architektuře, CPU by se jednoduše roztavilo.
Řešením byla architektura RISC (Reduced instruction set computing), která dokázala řádově zvednout výkon při snížené taktovací frekvenci. Jenže Intel nemohl zahodit celou svoji instrukční sadu, to by z obchodního hlediska byla sebevražda, takže Pentium bylo první CPU, které mělo CISC architekturu (Complex instruction set computing) na RISC jádře.
První Pentia tak měla mnohem nižší taktovací frekvenci než 486, tuším, že to bylo 60MHz, ale stále byla daleko rychlejší. Proč? Trik spočívá v tom, co umí dnešní procesory.
Každá instrukce, kterou má CPU zpracovat, se musí nahrát, dekódovat a provést (zjednodušeně řečeno, reálně tam je mnohem více fází). A když se jedna instrukce provádí, část CPU se nudí, takže mezitím může zpracovávat další instrukce, tomu se říká pipeline. Ta umožňuje zpracování řady instrukcí naráz.
Dalším velice pomalým faktorem je paměť. CPU dnes neumí pracovat s jedním bytem. Místo toho si je schopno nahrávat větší bloky do paměti umístěné přímo v čipu, té se říká L2 a L3 cache, která je řádově rychlejší, než obyčejná RAM. Jenže, co když daný blok paměti není v cache? Pokud instrukce vyvolá výjimku při přístupu do paměti z důvodu cache-miss, bude taková instrukce trvat například 20 cyklů místo 1 cyklu při cache-hit.
Moderní procesory jsou navíc daleko chytřejší, než tušíš. Pokud je řada instrukcí na sobě nezávislá, dokáže je procesor provést současně v rámci jednoho cyklu. Ke všemu dokáže také identifikovat, jestli provedení instrukcí v opačném pořadí nebude rychlejší, a pokud ano, provede je tak, jak to bude nejrychlejší.
Pokud do toho zamícháme SSE a MMX instrukce, dostaneme se ještě dál, protože můžeš udělat řadu teoretických operací v jediném kroku. To samé platí pro vektorová CPU, která jsou schopna zpracovávat stovky nebo tisíce teoretických operací v jediném kroku.
Dodnes platí, že nejhorší instrukce je podmíněný skok. Pokud by podmíněný skok trval 3 cykly, jak píše Patrik (přesněji, Patrik píše "podmínka", ale CPU podmínku nemá, není to vězeň), byli bychom vysmátí. V praxi stojí podmíněný skok 1 cyklus, ale chybně predikovaný podmíněný skok je extrémně drahá záležitost. Predikce podmínek souvisí s CPU pipeline a je to technika, kdy se CPU snaží uhádnout, jestli se skok provede nebo ne. Chybný odhad je jedna z nejpomalejší věcí, která se na CPU může stát, a stojí mnohem více než 3 cykly.
Takže jak z toho ven? Jak už jsem řekl, taktovací frekvence není důležitá, dokonce je i matoucí. Pokud máš 4-jádro na 3GHz, znamená to obvykle, že hlavní jádro je taktované na 3GHz a zbylá 3 jádra mají např. 1.5GHz. Z toho důvodu se u procesorů uvádí teoretický výkon v jednotkách FLOPS (FLoating-point Operations Per Second), což je teoretická hranice výkonu procesoru. Teoretická proto, že v praxi záleží na typu algoritmu a reálný výkon se může drasticky lišit. Občas se dokonce povede teoretickou hranici prolomit.
Závěr? Není možné porovnávat stará a nová CPU.
tak čistě teoreticky by šlo spočítat počet operací, ze kterých je program složen. Těžko říct, jestli na to někdo něco napsal.. Mohlo by to být celkem komplikované.
Taková informace je ti stejně ale asi k ničemu, protože když budeš mít cyklus, který provádí 10 operací a projdeš jím 10x, provede se 100 a ty dopředu nevíš. Takže tohle by jsi mohl spočítat jen, kdybys měl pevně dané aributy a program by se provedl pokaždé stejně (což naprostá většina nesplňuje).
U hry počet operací určitě spočítat nemůžeš - hra poběží pokaždé jinak dlouho a jiným způsobem.
Pak můžeš měřit spotřebovaný procesorový čas - např. v Céčku je
na to fce clock() - http://www.cplusplus.com/…ctime/clock/
Ta ti řekne, kolik času aplikace spotřebovala. Pro porovnání to ale
můžeš použít jen na jednom konkrétním počítači s konkrétním
nastavením a OS.
K tomu počítaniu operácií - dá sa spočítať najvyšší možný počet operácií, kt. sa vykoná (asymptotická notace O). Ten sa dá efektívne využiť na porovnanie algoritmov. Podrobnejšie o tom píše David Čápka:
http://www.itnetwork.cz/…st-stabilita
Ale ako už bolo spomenuté, k porovnaniu CPU to nijak nepomôže.
V tom je právě ten trik - stejná instrukce v cyklu se může provádět různě dlouho během různých průchodů. To má dva důsledky:
Navíc už neplatí ani argument s asymptotickou složitostí. Konstantní faktor je tak rozdílný, že jednodušší algoritmus s kubickou složitostí bude v praxi vždy rychlejší než složitější algoritmus se skoro kvadratickou složitostí.
Jestli se chceš dozvědět něco o složitosti algoritmu, můžeš si přečíst Introduction to Algorithms, autor je hodný i na začátečníky http://www.amazon.com/…4/ref=sr_1_1?…
jj, já vím.. Proto lze teoreticky spočítat počet vykonaných instrukcí, ale nemá to skoro žádnou informační hodnotu..
Zobrazeno 15 zpráv z 15.