Verfügbarkeit von CPU - Instruktionserweiterungen prüfen.

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Verfügbarkeit von CPU - Instruktionserweiterungen prüfen.

Beitrag von cxAlex »

Ich hab im Codearchiv Helles Code gefunden mit dem man vorhandene Befehlserweiterungen feststellten kann (MMX, SSE...). Damit kann man dann auf kompatiblen CPUs optimierten Code verwenden um die Leistung zu steigern. Ich hab das ganze mal in eine Form gebracht mit der man das ganze leicht verwenden kann:

@Helle:
Toller Code, wirklich klasse.
Weist du auch wie man auf die neueren Technologien prüfen kann? (VT-x, VT-i, AMD-V, SSE4.1, SSE4.2)

Code: Alles auswählen

Procedure Support_InstructionSetExtensionCheck()
  !pushfd
  !pop eax
  !mov edx,eax
  !xor edx,$200000
  !push edx
  !popfd
  !pushfd
  !pop edx
  !push eax
  !popfd
  !cmp eax,edx
  !jz l_iscpuid
  ProcedureReturn #True
  IsCPUID:
EndProcedure

Procedure Support_MMX()
  !mov eax,1h
  !cpuid
  !test edx, $800000
  !jz l_nommx
  ProcedureReturn #True
  NOMMX:
EndProcedure

Procedure Support_SSE()
  !mov eax,1h
  !cpuid
  !test edx, $2000000
  !jz l_nosse
  ProcedureReturn #True
  NOSSE:
EndProcedure

Procedure Support_SSE2()
  !mov eax,1h
  !cpuid
  !test edx, $4000000
  !jz l_nosse2
  ProcedureReturn #True
  NOSSE2:
EndProcedure

Procedure Support_SSE3()
  !mov eax,1h
  !cpuid
  !test ecx, $1
  !jz l_nosse3
  ProcedureReturn #True
  NOSSE3:
EndProcedure

Procedure Support_SSSE3()
  !mov eax,1h
  !cpuid
  !test ecx, $200
  !jz l_nossse3
  ProcedureReturn #True
  NOSSSE3:
EndProcedure

Procedure Support_CMOVcc()
  !mov eax,1h
  !cpuid
  !test edx,$8000
  !jz l_nocmov
  ProcedureReturn #True
  NOCMOV:
EndProcedure

Procedure Support_3DNow()
  !mov eax,80000000h
  !cpuid
  !cmp eax,80000000h
  !jbe l_noext
  !mov eax,80000001h
  !cpuid
  !or eax,eax
  !je l_noext
  !test edx,$80000000
  !jz l_noext
  ProcedureReturn #True
  NOEXT:
EndProcedure

Procedure Support_extended3DNow()
  !mov eax,80000000h
  !cpuid
  !cmp eax,80000000h
  !jbe l_noext2
  !mov eax,80000001h
  !cpuid
  !or eax,eax
  !je l_noext2
  !test edx, $80000000
  !jz l_noext2
  !test edx, $40000000
  !jz l_noext2
  ProcedureReturn #True
  NOEXT2:
EndProcedure

If Support_InstructionSetExtensionCheck() ; Check funktioniert
  Debug "MMX: "+Str(Support_MMX())
  Debug "SSE: "+Str(Support_SSE())
  Debug "SSE2: "+Str(Support_SSE2())
  Debug "SSE3: "+Str(Support_SSE3())
  Debug "SSSE3: "+Str(Support_SSSE3())
  Debug "CMOVcc: "+Str(Support_CMOVcc())
  Debug "3DNow: "+Str(Support_3DNow())
  Debug "extended3DNow: "+Str(Support_extended3DNow())
EndIf
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Hi,

Einfach super und leicht zu handhaben...

Gruß Michael
Working on :lol: - LibSGD - MP3D Engine - 8)
Antworten