Wie herausfinden, ob die CPU SSE5 kann?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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? :wink:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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? :wink:
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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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)
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Wie herausfinden, ob die CPU SSE5 kann?

Beitrag 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.
Antworten