Seite 1 von 2
Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 19:20
von Mok
Hallo.
Es gibt ja die Möglichkeit, mit Assembler, !CPUID, ein bisschen hin- und herschieben und Register auslesen den Befehlssatz herauszufinden (MMX, 3DNow!, Ext3DNow!, SSE, SSE2, SSE3, SSSE3 (= SSE4), CMOVcc). Ist es auch möglich herauszufinden, ob die CPU SSE5-fähig ist?
Gruß, Mok.
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 19:52
von Thorium
Mok hat geschrieben:Hallo.
Es gibt ja die Möglichkeit, mit Assembler, !CPUID, ein bisschen hin- und herschieben und Register auslesen den Befehlssatz herauszufinden (MMX, 3DNow!, Ext3DNow!, SSE, SSE2, SSE3, SSSE3 (= SSE4), CMOVcc). Ist es auch möglich herauszufinden, ob die CPU SSE5-fähig ist?
Natürlich auch mit der CPUID Instruktion.
Gibts SSE5 eigentlich schon? Intel will SSE5 ja sowieso nicht unterstützen.
Intel bietet ein entsprechendes Dokument mit allen Informationen über CPUID an: CPU Identification and the CPUID Instruction
AMD hat sicher vergleichbares, schau dich einfach mal bei Intel und AMD um, die bieten sehr viele Informationen, Dokumente und Handbücher. Unter anderem auch Optimierungsrichtlinien und Referenzimplementationen verschiedener Algos für die jeweiligen CPU's.
SSSE3 ist übrigens nicht SSE4, das gibts nochmal extra und ist in SSE4.1 und SSE4.2 unterteilt.
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 20:01
von Mok
Thorium hat geschrieben:SSSE3 ist übrigens nicht SSE4, das gibts nochmal extra und ist in SSE4.1 und SSE4.2 unterteilt.
OK, weißt du zufällig, wie man herausfindet, ob die CPU das kann, oder soll ich im Intel-Handbuch nachlesen?

Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 20:03
von Thorium
Mok hat geschrieben:Thorium hat geschrieben:SSSE3 ist übrigens nicht SSE4, das gibts nochmal extra und ist in SSE4.1 und SSE4.2 unterteilt.
OK, weißt du zufällig, wie man herausfindet, ob die CPU das kann, oder soll ich im Intel-Handbuch nachlesen?

Natürlich sollst du im Intel Handbuch nachlesen. ^^
Aber weil ich so nett bin kann ich dir gerne den Link zum passenden Dokument geben:
http://www.intel.com/Assets/PDF/appnote/241618.pdf
SSE5 ist übrigens da noch garnicht drinnen, hab ich grad gesehen.
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 20:28
von Thorium
Nagut hier hast du ein paar Prozeduren um die unterstützten Intel SIMD-Instruktionssätze zu ermitteln.
Der Code ist x86 und x64 kompatibel und OS-unabhängig.
Code: Alles auswählen
Procedure.i IsCpuidSupported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!pushfd
!pop eax
!mov edx,eax
!xor eax,$00200000
!push eax
!popfd
!pushfd
!pop eax
!xor eax,edx
!jne IsCpuidSupported_Supported
!xor eax,eax
ProcedureReturn
!IsCpuidSupported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
ProcedureReturn #True
CompilerEndSelect
EndProcedure
Procedure.i IsMmxSupported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!mov eax,1
!push ebx
!cpuid
!pop ebx
!test edx,$00800000
!jne IsMmxSupported_Supported
!xor eax,eax
ProcedureReturn
!IsMmxSupported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
!mov rax,1
!push rbx
!cpuid
!pop rbx
!test edx,$00800000
!jne IsMmxSupported_Supported
!xor rax,rax
ProcedureReturn
!IsMmxSupported_Supported:
!mov rax,1
ProcedureReturn
CompilerEndSelect
EndProcedure
Procedure.i IsSseSupported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!mov eax,1
!push ebx
!cpuid
!pop ebx
!test edx,$02000000
!jne IsSseSupported_Supported
!xor eax,eax
ProcedureReturn
!IsSseSupported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
!mov rax,1
!push rbx
!cpuid
!pop rbx
!test edx,$02000000
!jne IsSseSupported_Supported
!xor rax,rax
ProcedureReturn
!IsSseSupported_Supported:
!mov rax,1
ProcedureReturn
CompilerEndSelect
EndProcedure
Procedure.i IsSse2Supported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!mov eax,1
!push ebx
!cpuid
!pop ebx
!test edx,$04000000
!jne IsSse2Supported_Supported
!xor eax,eax
ProcedureReturn
!IsSse2Supported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
!mov rax,1
!push rbx
!cpuid
!pop rbx
!test edx,$04000000
!jne IsSse2Supported_Supported
!xor rax,rax
ProcedureReturn
!IsSse2Supported_Supported:
!mov rax,1
ProcedureReturn
CompilerEndSelect
EndProcedure
Procedure.i IsSse3Supported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!mov eax,1
!push ebx
!cpuid
!pop ebx
!test ecx,$00000001
!jne IsSse3Supported_Supported
!xor eax,eax
ProcedureReturn
!IsSse3Supported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
!mov rax,1
!push rbx
!cpuid
!pop rbx
!test ecx,$00000001
!jne IsSse3Supported_Supported
!xor rax,rax
ProcedureReturn
!IsSse3Supported_Supported:
!mov rax,1
ProcedureReturn
CompilerEndSelect
EndProcedure
Procedure.i IsSsse3Supported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!mov eax,1
!push ebx
!cpuid
!pop ebx
!test ecx,$00000200
!jne IsSsse3Supported_Supported
!xor eax,eax
ProcedureReturn
!IsSsse3Supported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
!mov rax,1
!push rbx
!cpuid
!pop rbx
!test ecx,$00000200
!jne IsSsse3Supported_Supported
!xor rax,rax
ProcedureReturn
!IsSsse3Supported_Supported:
!mov rax,1
ProcedureReturn
CompilerEndSelect
EndProcedure
Procedure.i IsSse41Supported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!mov eax,1
!push ebx
!cpuid
!pop ebx
!test ecx,$00080000
!jne IsSse41Supported_Supported
!xor eax,eax
ProcedureReturn
!IsSse41Supported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
!mov rax,1
!push rbx
!cpuid
!pop rbx
!test ecx,$00080000
!jne IsSse41Supported_Supported
!xor rax,rax
ProcedureReturn
!IsSse41Supported_Supported:
!mov rax,1
ProcedureReturn
CompilerEndSelect
EndProcedure
Procedure.i IsSse42Supported()
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
!mov eax,1
!push ebx
!cpuid
!pop ebx
!test ecx,$00100000
!jne IsSse42Supported_Supported
!xor eax,eax
ProcedureReturn
!IsSse42Supported_Supported:
!mov eax,1
ProcedureReturn
CompilerCase #PB_Processor_x64
!mov rax,1
!push rbx
!cpuid
!pop rbx
!test ecx,$00100000
!jne IsSse42Supported_Supported
!xor rax,rax
ProcedureReturn
!IsSse42Supported_Supported:
!mov rax,1
ProcedureReturn
CompilerEndSelect
EndProcedure
If IsCpuidSupported() = #True
Debug "MMX: " + Str(IsMmxSupported())
Debug "SSE: " + Str(IsSseSupported())
Debug "SSE2: " + Str(IsSse2Supported())
Debug "SSE3: " + Str(IsSse3Supported())
Debug "SSSE3: " + Str(IsSsse3Supported())
Debug "SSE4.1: " + Str(IsSse41Supported())
Debug "SSE4.2: " + Str(IsSse42Supported())
EndIf
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 22:02
von Mok
Ich hab garnicht mitbekommen, dass du nochmal druntergepostet hast, und jetzt wo ich glaube, es zu haben, sehe ich, dass hier schon ein Mustercode steht
Ist der Ansatz so richtig? (Mein Code hat leichte Variationen im Gegensatz zu deinem, und jetzt wollt ich fragen...)
Code: Alles auswählen
Global SSE41.b = 0
Global SSE42.b = 0
!TEST ecx, $80000
!JZ l_nosse42 ;wenn die CPU kein 4.1 kann, kann sie 4.2 auch nicht
!MOV [v_SSE41], 1
;
!TEST ecx, $10000
!JZ l_nosse42
!MOV [v_SSE42], 1
NOSSE42:
Debug "SSE4.1-fähig? "+Str(SSE41)
Debug "SSE4.2-fähig? "+Str(SSE42)
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 22:22
von NicTheQuick
Lustig, dein Code sagt mir, dass ich SSE3 habe, aber "cat /proc/cpuinfo" sagt mir das nicht.
cat /proc/cpuinfo hat geschrieben:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm ida tpr_shadow vnmi flexpriority
Bedeutet das, dass SSE3 unter etwas anderem einzuordnen ist oder hab ich SSE3 wirklich nicht? Immerhin hab ich ja auch SSSE3.
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 23:16
von Thorium
NicTheQuick hat geschrieben:Lustig, dein Code sagt mir, dass ich SSE3 habe, aber "cat /proc/cpuinfo" sagt mir das nicht.
cat /proc/cpuinfo hat geschrieben:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm ida tpr_shadow vnmi flexpriority
Bedeutet das, dass SSE3 unter etwas anderem einzuordnen ist oder hab ich SSE3 wirklich nicht? Immerhin hab ich ja auch SSSE3.
Was für ne CPU hast du denn?
Wenn ich keinen Fehler gemacht habe, und ich konnte keinen finden, dann hast du SSE3. Wäre ziemlich ausergewöhnlich wenn deine CPU SSSE3 unterstützt aber kein SSE3, immerhin kam SSSE3 ja nach SSE3.
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 13.09.2010 23:19
von Thorium
Mok hat geschrieben:
Ist der Ansatz so richtig? (Mein Code hat leichte Variationen im Gegensatz zu deinem, und jetzt wollt ich fragen...)
Code: Alles auswählen
Global SSE41.b = 0
Global SSE42.b = 0
!TEST ecx, $80000
!JZ l_nosse42 ;wenn die CPU kein 4.1 kann, kann sie 4.2 auch nicht
!MOV [v_SSE41], 1
;
!TEST ecx, $10000
!JZ l_nosse42
!MOV [v_SSE42], 1
NOSSE42:
[/quote]
Bei SSE4.2 hast du ne 0 vergessen, es ist $100000.
Re: Wie herausfinden, ob die CPU SSE5 kann?
Verfasst: 14.09.2010 10:24
von NicTheQuick
Thorium hat geschrieben:Was für ne CPU hast du denn?
Wenn ich keinen Fehler gemacht habe, und ich konnte keinen finden, dann hast du SSE3. Wäre ziemlich ausergewöhnlich wenn deine CPU SSSE3 unterstützt aber kein SSE3, immerhin kam SSSE3 ja nach SSE3.
Hier die Infos:
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz
stepping : 10
cpu MHz : 800.000
cache size : 4096 KB
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm ida tpr_shadow vnmi flexpriority
bogomips : 3990.06
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
Also ich glaube schon, dass dein Code richtig ist und mir die Infos wohl nicht ganz richtig angezeigt werden.