Matematika merenja performansi — Od 8051 do SSE ekstenzija i MSR registra

Uvod i teorija

U prethodnim epizodama smo videli kako se na nivou čistog silicijuma bije bitka za svaki mašinski ciklus i kako tajmer i banke registara omogućavaju paralelni rad niti. Kada ovladate mikrokontrolerom kao što je Intel 8051, prirodno je da dobijete inženjersku intuiciju da performanse softvera posmatrate kroz taktove procesora i oscilacije kvarcnog oscilatora.
Međutim, kada pokušate da taj isti šablon razmišljanja primenite na modernom PC-ju – na primer, kada napišete C++ kod ubrzan pomoću SSE (Single Instruction Multiple Data) ekstenzija – udarićete u nevidljivi hardverski zid. Odjednom, stara matematika prebrojavanja instrukcija "peške" prestaje da važi, a merenje performansi softvera od čiste matematike postaje napredna fizika i statistika.
Svet apsolutnog determinizma: Kako smo merili vreme na 8051
Na bazičnom 8-bitnom mikrokontroleru 8051 matematika performansi je savršeno egzaktna i linearna. Ako vaš program ne radi dovoljno brzo, matematika je surova i jasna:
Broj instrukcija×Broj mašinskih ciklusa po instrukciji=Tačan broj taktova
Znamo da instrukcija INC A troši tačno 1 mašinski ciklus (odnosno 12 oscilacija eksternog kvarca). Nema faktora iznenađenja. Nema operativnog sistema koji će usred petlje oduzeti procesorsko vreme, nema keš memorije koja može da omane i nema termalne kontrole. Sve je 100% predvidivo (deterministički). Broj taktova sa fiksnim periodom oscilacije daje vam tačno vreme u nanosekundu.
Veliki krah determinizma: Gde nestaje matematika na modernom PC-ju?
Kada pređemo na modernu x86/x64 arhitekturu (Intel/AMD) i pokušamo da uporedimo standardni C++ kod sa ručno optimizovanim SSE/AVX instrukcijama, matematika peške umire. Čak i ako napišete najjednostavniju petlju za sabiranje nizova, rezultati merenja standardnom "štopericom" (std::chrono) variraju iz izvršavanja u izvršavanje.
Zašto je to tako? Tri hardverska krivca unutar modernog silicijuma potpuno ruše predvidivost instrukcija:
  • Out-of-Order Execution (Izvršavanje preko reda): Moderni procesor nije slepi izvršilac asemblerskih linija. Hardverski dekoder razbija vaš C++ i SSE kod na mikrooperacije (
    μmu
    ops) koje izvršne jedinice gutaju preko reda, kad god je neki resurs slobodan.
  • Termodinamička ezoterija (Dynamic Scaling): Za razliku od stabilnog kvarca na 8051, moderni CPU konstantno menja svoju frekvenciju (Turbo Boost, termalni throttling) u zavisnosti od temperature čipa i opterećenja susednih jezgara. Takt iz sekunde u sekundu fizički nije isti.
  • Paradoks Latencije i Propusnog opsega (Throughput): Na PC-ju, složena SSE instrukcija može imati latenciju od 3 takta, ali propusni opseg od 0.5 taktova. To znači da procesor može da započne dve masivne SSE operacije u jednom jedinom taktu! Kako je to matematički moguće?

Hardverski trik: Kako procesor vara vreme?
Da bismo razumeli kako instrukcija koja traje 3 takta može imati propusni opseg od 0.5 taktova, moramo napustiti linearni model razmišljanja i zamisliti fabričku traku (Pajplajn) i superskalarnu arhitekturu modernih procesora.
  1. Analogija sa fabričkom trakom (Pajplajn): Zamislite fabriku automobila u kojoj sklapanje jednog auta traje tačno 3 sata (to je Latencija). Ako fabrika ima pokretnu traku i radnici na svakih pola sata (0.5 sati) ubace novu školjku na početak trake, šta se dešava na kraju? Kada se traka jednom napuni, fabrika će izbacivati po jedan gotov automobil na svakih pola sata! To je Propusni opseg (Throughput). Dok prva SSE instrukcija u procesoru završava svoju treću fazu (npr. zaokruživanje rezultata), druga je na drugoj fazi, a treća tek ulazi u prvu fazu izvršenja.
  2. Duplirane mašine unutar jezgra (Superskalarni CPU): Moderno procesorsko jezgro ima više paralelnih izvršnih jedinica (tzv. Execution Ports). Ako u vašem SSE kodu dve instrukcije ne zavise jedna od druge (npr. sabirate potpuno različite registre), hardverski dekoder će u istom taktu poslati prvu instrukciju na Port 0, a drugu na Port 1. Obe instrukcije kreću istovremeno.
Međutim, ako vaša sledeća C++ linija koda zavisi od rezultata prethodne (npr. y = x + c gde se čeka da se izračuna x), procesor mora da zakoči. Fabrička traka se zaustavlja i vi plaćate punu cenu latencije od 3 takta. Zato štoperica daje različite rezultate za naizgled isti broj instrukcija!
Most ka enterprise sistemima (Primer: SQL Server)
Razmišljajući o tome kako su optimizovani džinovski softverski sistemi poput Microsoft® SQL Servera®, dolazimo do iste spoznaje: oni su pisani tako da maksimalno eksploatišu ove hardverske ekstenzije. Kada SQL Server u memoriji skenira milijarde redova, on u pozadini ne koristi "kašiku" (standardne skalarne instrukcije), već "lopatu za sneg" – SSE i AVX vektorske instrukcije koje jednim udarcem procesiraju više podataka odjednom (SIMD).
Ali, da bi softverski inženjeri uopšte znali da li mašinerija radi efikasno, klasična štoperica im ne pomaže. Ako procesor stoji (Stall) jer podatak nije stigao iz RAM-a u keš liniju (Cache Miss), procesor troši prazne taktove bez obzira na moćni SSE kod.
Rešenje zagonetke: Kako zap vaporno merimo softver na PC-ju?
Pošto peške ne možemo računati, moderni inženjeri koriste isti pristup koji se koristi u deep-level profilisanju SQL Servera: MSR registre (Model-Specific Registers).
Unutar samog silicijuma Intel i AMD procesora ugrađeni su hardverski brojači performansi (Performance Monitoring Counters - PMC). Alati poput Intel® Performance Counter Monitor (PCM) direktno čitaju ove registre u realnom vremenu.
Umesto pukog merenja sekundi, moderni rendgenski snimak koda zahteva da pratimo:
  1. IPC (Instructions Per Cycle): Koliko je instrukcija procesor zaista uspeo da završi po jednom taktu (teoretski maksimum je preko 4-5, ali ako je kod loš usled zavisnosti podataka, pada ispod 0.5).
  2. L3 Cache Misses: Koliko puta je tvoj SSE kod morao da čeka spori RAM jer podaci nisu bili poravnati i spremni u kešu procesora.
Direktno poređenje: Dva sveta arhitekture
Metrika merenjaIntel 8051 ArhitekturaModerni PC (x86/x64 + SSE)
Izvor taktaFiksni eksterni kvarcni oscilatorDinamička frekvencija (zavisna od termodinamike)
Proračun kodaEgzaktna matematika (Brojanje instrukcija peške)Nemoguće peške (Out-of-Order i Pipelining haos)
Alat za merenjeLogički analizator / Papir i olovkaHardverski MSR registri (Intel PCM alat)
Glavni problemOgraničen broj registara i RAM prostoraPromašaj keš memorije (Cache Miss) i čekanje na RAM
Inženjerski zaključak: Znanje sa 8051 nam daje savršenu mentalnu mapu da razumemo šta su to registri i zašto su oni najbrža zona na čipu. Ali na modernom PC-ju, optimizacija softvera nije samo borba sa asemblerskom sintaksom, već borba za to da procesor nikada ne ostane gladan podataka i da hardverski brojači (MSR) pokažu maksimalan IPC!

📦 Open Source & Podela znanja:
Kompletan članak, prateći materijali i izvorni kod su licencirani pod Creative Commons (CC BY 4.0) i MIT licencama uz navođenje izvora zilsel-invent.com.

Autor: Vladimir Savić / AI Gemini




Comments

Popular posts from this blog

Fake VC830L digital multimeter

Electrolytic capacitors and design rules

How to design LM324 Astable Multivibrator