<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE html PUBLIC '-//W3C/DTD XHTML+Voice 1.2 /EN' 'http://www.voicexml.org/specs/multimodal/x+v/12/dtd/xhtml+voice12.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ev='http://www.w3.org/2001/xml-events'>
<head>
<link rel='stylesheet' href='http://pabi3.com/modules/items/voice.css' type='text/css' media='all' />
<form xmlns='http://www.w3.org/2001/vxml' id='title'>
<block>
The article Detekcia CPU a jeho schopnosti is written by Richard Biely
</block>
</form>
<form xmlns='http://www.w3.org/2001/vxml' id='body'>
<block>


Detekcia procesora a jeho schopnosti je dolezita v pripade, ze potrebujete napisat programovy kod vykonny na sirokej skale procesorov. V pripade dnesnych procesorov je detekcia podporovanych instrukcnych sad viac menej zbytocna, pretoze s najvacsou pravdepodobnostou podporuju vsetky, stale vsak existuje obrovske mnozstvo majitelov pocitacov osadenych procesormi, u ktorych to tak nie je (napr. prve revizie AMD Athlonov 64 a ich derivaty).



A na co je to vlastne dobre? Ak sa assembleru (len pre jednoduchost, spravne som mal napisat jazyk symbolickych adries) venujete trosku viac, urcite poznate vyhody instrukcnych sad ako MMX a SSE. Pre tych, ktori nechapu, o com sa tu bude pisat, bude asi treba situaciu objasnit&hellip;
</block>
</form>
<form xmlns='http://www.w3.org/2001/vxml' id='full'>
<block>

Vdaka instrukcnym sadam MMX a SSE moze programator pracovat sucastne s viac ako jednou celociselnou hodnotou (MMX, SEE) alebo s viacerymi hodnotami s pohyblivou desatinnou ciarkou (SSE). Registre MMX su dlhe 64 bitov, registre SSE maju dlzku 128 bitov.



Instrukcna sada MMX sa po prvy krat objavila v Pentiu MMX. Programy optimalizovane pre MMX vykazovali velmi slusny narast vykonu oproti dovtedy pouzivanym (kludne aj o &gt;50%). Vyssi vykon bol dany uz spominanou vacsou sirkou MMX registrov. Do 64 bitov sa totiz zmestia dve 32-bitove, ci styri 16-bitove hodnoty a procesor ich moze spracovat naraz. Napriek tomu, co skratka MMX symbolizuje, bola urcena len na pracu s celociselnymi udajmi a v pripade grafickych operacii stacala vyznam. To u Intelu vyriesili az o dve procesorove generacie neskor, v procesoroch Pentium III. SSE boli urcene aj na pracu s desatinnymi cislami a to ich spolu s faktom, ze dlzka premennych realneho typu je v 32-bitovom prostredi, kvoli rychlosti, 32 bitov, priam predurcuje na graficke vypocty, v ktorych potom CPU dokaze uplne nahradit stare dobre FPU.



Program na zistenie podporovanych instrukcnych sad je velmi jednoduchy, napisany v C++ a nezavisli od operacneho systemu. Najprv som navrhol jednoduchu strukturu obsahujucu hodnoty, ktore budeme nastavovat. Nasleduje  funkcia, v ktorej prebieha detekcia procesora. Viac bude uvedene v komentaroch zdrojoveho kodu.


typedef struct sCPU {
    bool MMX;
    bool SSE;
    bool SSE2;
    bool SSE3;

    sCPU() {
       MMX  = false;
       SSE  = false;
       SSE2 = false;
       SSE3 = false;
    }
} tCPU;

tCPU getCPUinfo() {
    tCPU cpuinfo;

    _asm {
        mov	eax, 1 // ak register EAX nastavime na 1 a zavolame
	cpuid          // instrukciu CPUID, do registru EDX sa ulozi 
                       // informacia o podporovanych instrukcnych sadach

        test	edx, 06000000h // podpora SSE3 sa nachadza na 27. bite
	jz	__SSE2
	mov	[cpuinfo.SSE3], 1

        __SSE2:
	test	edx, 04000000h // podpora SSE2 sa nachadza na 26. bite
	jz	__SSE
	mov	[cpuinfo.SSE2], 1

	__SSE:
        test	edx, 02000000h // podpora SSE sa nachadza na 25. bite
	jz      __MMX
	mov	[cpuinfo.SSE], 1

	__MMX:
        test	edx, 00800000h // podpora MMX sa nachadza na 23. bite
	jz	__END
	mov     [cpuinfo.MMX], 1

	__END:
    }

    return cpuinfo;
}


Do registru EAX priradime 1, zavolame CPUID a ta do registru EDX ulozi informaciu o podporovanych instrukciach. Tu nam uz len staci precitat.



Mohlo by sa stat, ze niekto z vas spusti program obsahujuci tuto detekciu na pocitaci s procesorom starsim ako 80486DX4. Asi by sa zrutil, pretoze starsie procesory instrukciu CPUID nepoznaju. Osetrenie tohto problemu je jednoduche, detekciu staci uzavriet do bloku try - except.


__try {
    _asm {
        // detekcia
        ...
    }
}
__except(EXCEPTION_EXECUTE_HANDLER) {
    if ( _exception_code()==STATUS_ILLEGAL_INSTRUCTION )
        // instrukcia CPUID nie je podporovana
        return cpuinfo;
    else
        // nastal nejaky iny problem
	return cpuinfo;
}</block>
</form>
<base href='http://pabi3.com/' />
<title>Detekcia CPU a jeho schopností</title>
</head>
<body ev:event='load' ev:handler='#title'>
<a href='http://pabi3.com/blog/detekcia-cpu-a-jeho-schopnosti/' title='Návrat'>Návrat</a>
<h1 style='padding:0.5em;'>Detekcia CPU a jeho schopností</h1>
<ul>
<li ev:event='click' ev:handler='#body'>Speak introduction</li>
<li ev:event='click' ev:handler='#full'>Speak full</li>
</ul>
</body>
</html>
