Seite 1 von 4

Was unterstützt mein Prozessor?

Verfasst: 21.10.2006 23:41
von Helle
Hier ein kleines Programm zur Ermittlung der CPU-Eigenschaften:

Code: Alles auswählen

;- Ermittlung einiger Prozessor-Eigenschaften, "Helle" Klaus Helbing, 21.06.2007, PB4.02

Global mmx.c    = 151        ;erstmal auf "-" setzen für nicht vorhanden
Global dnow.c   = 151
Global ednow.c  = 151
Global cmov.c   = 151
Global sse.c    = 151
Global sse2.c   = 151
Global sse3.c   = 151
Global ssse3.c  = 151
Global sse41.c  = 151
Global sse42.c  = 151
Global popcnt.c = 151

Global Bit0.l   = $1          ;für SSE3
Global Bit9.l   = $200        ;für SSSE3
Global Bit15.l  = $8000       ;für CMOVcc
Global Bit19.l  = $80000      ;für SSE4.1
Global Bit20.l  = $100000     ;für SSE4.2
Global Bit21.l  = $200000     ;für EFlag
Global Bit23.l  = $800000     ;für MMX und POPCNT
Global Bit25.l  = $2000000    ;für SSE
Global Bit26.l  = $4000000    ;für SSE2
Global Bit30.l  = $40000000   ;für extended 3DNow!
Global Bit31.l  = $80000000   ;für 3DNow!

Global Name$    = "Der getestete Prozessor unterstützt :"
Global MMX$     = "MMX :            "
Global DNOW$    = "3DNow! :       "
Global EDNOW$   = "ext3DNow! :  "
Global CMOV$    = "CMOVcc :      "
Global SSE$     = "SSE :             "
Global SSE2$    = "SSE2 :           "
Global SSE3$    = "SSE3 :           "
Global SSSE3$   = "SSSE3 :         "
Global SSE41$   = "SSE4.1 :        "
Global SSE42$   = "SSE4.2 :        "
Global POPCNT$  = "POPCNT :      "

;-------- Test, ob der CPUID-Befehl überhaupt vom Prozessor verarbeitet werden kann
;-------- ist möglich, wenn Bit21 des EFlag-Registers verändert werden kann
    !pushfd                  ;das EFlag-Register (32-Bit) auf den Stack
    !pop eax                 ;rein in EAX
    !mov edx,eax             ;EAX unverändert lassen
    !xor edx,[v_Bit21]       ;Bit21 kippen 
    !push edx                          
    !popfd                   ;in EFlag schreiben
    !pushfd                  ;wieder auf Stack
    !pop edx
    !push eax                ;der Ordnung halber alten Wert wieder herstellen
    !popfd   
    !cmp eax,edx
    !jne l_iscpuid           ;sind nicht gleich -> CPUID ist möglich

 MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht und somit weder MMX oder SSE !")
End  

IsCPUID:
;------------------------------------------------------------------------------

;-------- Test auf MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 und POPCNT
;-------- vorhanden, wenn im Rückgaberegister EDX bzw. ECX die entsprechenden Bits gesetzt sind
    !mov eax,1h
    !cpuid
    !test edx,[v_Bit23]      ;MMX
    !jz l_nommx
    !mov [v_mmx],2bh         ;"+" für vorhanden 
NOMMX:
    !test edx,[v_Bit25]      ;SSE  
    !jz l_nosse
    !mov [v_sse],2bh
NOSSE:
    !test edx,[v_Bit26]      ;SSE2  
    !jz l_nosse2
    !mov [v_sse2],2bh
NOSSE2:
    !test ecx,[v_Bit0]       ;SSE3
    !jz l_nosse3
    !mov [v_sse3],2bh    
NOSSE3:
    !test ecx,[v_Bit9]       ;SSSE3
    !jz l_nossse3
    !mov [v_ssse3],2bh 
NOSSSE3:
    !test ecx,[v_Bit19]      ;SSE4.1
    !jz l_nosse41
    !mov [v_sse41],2bh
NOSSE41:
    !test ecx,[v_Bit20]      ;SSE4.2
    !jz l_nosse42
    !mov [v_sse42],2bh
NOSSE42:
    !test ecx,[v_Bit23]      ;POPCNT
    !jz l_nopopcnt
    !mov [v_popcnt],2bh
NOPOPCNT:
 ;-------- Test auf CMOVcc (bedingtes Kopieren)
    !test edx,[v_Bit15]    
    !jz l_nocmov
    !mov [v_cmov],2bh
NOCMOV:       
;------------------------------------------------------------------------------    

;-------- Anzahl der vorhandenen extended levels ermitteln als Vorstufe für 3DNow!-Test
;-------- Rückgabewert in EAX (-80000000h) gibt Anzahl der extended level an
    !mov eax,80000000h
    !cpuid
    !cmp eax,80000000h       ;hat nichts mit einem Bit zu tun!
    !jbe l_noext             ;keine extended levels, 3DNow! überspringen
;------------------------------------------------------------------------------
    
;-------- Test auf 3DNow! und extended 3DNow! (auch DSP=Digital Signal Processing genannt)
;-------- vorhanden, wenn im Rückgaberegister EDX das Bit31 bzw. Bit30 gesetzt ist
;-------- ext.3DNow! (DSP) sind 5 Befehle: PF2IW, PFNACC, PFPNACC, PI2FW und PSWAPD
;-------- 3DNow! steht nur auf AMD-Prozessoren ab dem K6-2 zur Verfügung 
    !mov eax,80000001h       ;80000001h ist praktisch das erste extended level, dieser wird von Intel-Prozessoren nicht unterstützt!
    !cpuid                   ;Intel-Prozessoren liefern hier EAX=0 zurück
    !or eax,eax
    !je l_noext              ;ist Intel-Prozessor
    !test edx,[v_Bit31]      ;3DNow! 
    !jz l_noext
    !mov [v_dnow],2bh
    !test edx,[v_Bit30]      ;extended 3DNow!  
    !jz l_noext
    !mov [v_ednow],2bh
NOEXT:    
;------------------------------------------------------------------------------
   
 MessageRequester(Name$,MMX$+Chr(mmx)+Chr(10)+DNOW$+Chr(dnow)+Chr(10)+EDNOW$+Chr(ednow)+Chr(10)+CMOV$+Chr(cmov)+Chr(10)+SSE$+Chr(sse)+Chr(10)+SSE2$+Chr(sse2) + Chr(10)+SSE3$+Chr(sse3)+Chr(10)+SSSE3$+Chr(ssse3)+Chr(10)+SSE41$+Chr(sse41)+Chr(10)+SSE42$+Chr(sse42)+Chr(10)+POPCNT$+Chr(popcnt))
End        
Gruss
Helle

Edit 22.10.2006: CMOVcc neu, damit für Intel auch richtige Anzeige
Edit 10.01.2007: SSE3 neu, "alte" Verfahrensweise ergibt auf aktuellen CPU´s falsche Ergebnisse
Edit 24.06.2007: SSE4 hinzugefügt

Verfasst: 22.10.2006 09:32
von RSBasic
Bei mir unterstützt fast alles außer SSSE3 :D

Verfasst: 22.10.2006 13:43
von Proton
Danke Helle ! Das ist bestimmt sehr gut zu gebrauchen. :allright:

Verfasst: 22.10.2006 14:52
von NicTheQuick
Von SSE hab ich gar nichts, aber die ersten vier. Ist das sehr schlecht?

Verfasst: 22.10.2006 15:13
von Deeem2031
SSE is Intel - 3Dnow! is AMD
Is also nich schlecht ;)

Btw. ich glaub so ein Code gabs schonmal - sogar bisl ausführlicher..

Verfasst: 22.10.2006 15:13
von Zaphod
Eher merkwürdig als schlecht. Hast du da ein sehr alten AMD? Eigentlich unterstützen doch schon die kleinen Athlons auch mindestens SSE und SSE2 oder?

Ist aber alles nicht so wichtig, so viel software gibt es eh nicht, die den ganzen spezialkram unterstützt, denn das ist meistens deutlich schwieriger zu programmieren.

Verfasst: 22.10.2006 16:26
von Helle
Habe den Code bezüglich CMOVcc für Intel korrigiert (böse Falle!).
SSE (1) kam mit dem Pentium 3 bzw. Athlon 4 (kompletter Befehlssatz).

Gruss
Helle

Verfasst: 22.10.2006 21:50
von PMV
also ich hab nen amd drinne und bei mir stand bei allem Plus, bis auf das letzte ... öhm SSSE3

MFG PMV

Verfasst: 23.10.2006 00:22
von RaVeN99
@Zaphod:
Nix merkwürdig - die Thunderbirds hatten nunmal noch keine SSE erweiterungen, hier kam das Enhanced 3DNow! auf. Die Simd Streaming Extensions wurden irgendwann zu den zeiten des Athlon XP eingeführt.
Sogar die DDR RAM unterstützung fehlt ihm bei seinem Modell, da die erst ab dem C - Athlon, sprich mit dem 1.4er Prozessor eingeführt wurde.

Dass es nicht so wichtig ist entspricht leider auch nimmer ganz der wahrheit, da spiele mittlerweilen oft auf diese erweiterungen optimiert werden, das kommt oft bei diversen entwickler interviews heraus. Heftiger machen sich die optimierungen allerdings bei Appz bemerkbar, hier sind auch die unterschiedlich guten implementierungen gut erkennbar, da SSE auf Intel prozessoren deutlich stärker ist als auf AMD Maschinen...
Ausserdem gibt es doch compiler die die codes direkt auf solche Erweiterungen hin optimieren, oder täusche ich mich hier? Vllt. mag diese unterstützung bzw. optimierung nicht ganz so gu sein wie eine von hand, aber immerhin besser als wenns garnicht vorhanden wäre ;)


@Helle:
Klasse Code - lässt sich sicher mal verwenden =)
Hach wär des schön wenn jemand ne userlib o.ä. zusammenstöpseln würde mit wenigstens MMX nutzenden befehlen *träum* ;)
Das wär grade bei grafischen spielereien (also auch für die demo freaks unter uns) echt genial ^^


Mfg
RaVeN

Re: Was unterstützt mein Prozessor?

Verfasst: 27.10.2009 14:17
von Thorium
Du könntest noch das kommende AVX hinzufügen. Es ist Bit 28 von ECX.