Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Anzahl der CPU (Nicht Kerne/Cores) bestimmen (https://www.delphipraxis.net/175343-anzahl-der-cpu-nicht-kerne-cores-bestimmen.html)

Bernhard Geyer 13. Jun 2013 16:35

Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Wie kann ich die Anzahl der Physikalischen Kerne über die WinAPI bekommen?
Die einfachen Lösungen über TSystemInfo und Co. liefern leider immer nur die Anzahl der Kerne :-(

Ginko 13. Jun 2013 16:56

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Meinst du eventuell sowas hier ?

http://www.delphipraxis.net/625336-post8.html

oder hier das http://borland.newsgroups.archived.a...511133237.html

Grüße

Bernhard Geyer 14. Jun 2013 09:02

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Zitat:

Zitat von Ginko (Beitrag 1218548)

Und wo soll jetzt die Anzahl der Sockets stehen?

Beim zweiten Eintrag bekomme ich in der Funktion CountCPUs die Wert

CpuCount.Log = 24
CpuCount.LogPerCore = 32
CpuCount.CorePerPhys = 16

auf einem XEON 2-Sockel-System

bei der erstein Eintrag bekomme ich

GetCPUCount = 24
GetCPULogicalProcessorCount = 32


Auf meinem i7 sind die Werte:

8/16/1

bzw

8/16


Also nix mit

Mein i7-System: 1 CPU/Sockel.
Xeon-System mit 2 Sockeln: 2 CPU/Sockel

:-(

Klaus01 14. Jun 2013 09:26

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Hier steht wie es mit dem Powershell command "Get-WMIObject Win32_ComputerSystem | FL *" geht.

Vielleicht gibt es auch ein entsprechendes WMI command das in Delphi genutzt werden kann?

Grüße
Klaus

mentaltec 14. Jun 2013 09:40

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Hi,

bei einigen CPU-Typen kannst Du über CPUID die serial number der CPU auslesen - dann musst Du nur noch über alle Threads die SNs sammeln

aber eine allumfassende Lösung für alle CPUs wirds da nicht geben,
Du kannst auch über die Infos , die Du über CPUID gewinnst, in Deiner (selbst zu erstellenden) DB nachschauen, wie beim jeweiligen Typ das Verhältniss Core per Socket ist
btw. ich glaube mich zu erinnern, dass es mal CPUs gab, die 2 Dies pro Sockel hatten

evtl. hilft auch UEFI (geschrieben in voller Unkenntnis aller Tatsachen)


mfg

Ginko 14. Jun 2013 10:14

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Ich habe noch diesen Beitrag gefunden: http://www.delphipraxis.net/399001-post5.html
Dort wird die Klasee Win32_Processor genutzt, ich glaube mehr Informationen bekommst du sonst nicht.

Mit dem Class-Generator kann man sich auch eine sehr leicht eine angepasste Win32_Processor Klasse für Delphi oder andere Sprachen erstellen.
Zum direkten Testen ist der Codegenerator am besten:
http://theroadtodelphi.wordpress.com...-code-creator/
Und für Klassen zu erstellen gibt es:
http://theroadtodelphi.wordpress.com...ass-generator/

EineWin32_ComputerSystem Klasse kann man damit auch erstellen, welche Klaus01 in seinem Beitrag zeigt.

Hier noch was http://www.sql-server-pro.com/physical-cpu-count.html
Dort speziell dieser Abschnitt:
Zitat:

After a lot of research I discovered that there is a way using WMI. The Win32_Processor object has a property called SocketDesignation which is unique for the first core in each socket. The MSDN documentation describes it as "Type of chip socket used on the circuit.", but every one I've looked at seems to be more like a socket identifier. Assuming this is always the case, you can get the physical CPU count by counting the number of unique values.
Aber scheinbar funktioniert das auch nicht immer...

hathor 14. Jun 2013 12:06

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Delphi-Quellcode:
// uses  ActiveX, comobj,

Procedure CPU;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue       : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService  := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', '');
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Processor','WQL',wbemFlagForwardOnly);
  oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
   Form1.Memo1.lines.add(Format(' Processor Id :   %s',[String(FWbemObject.ProcessorId)]));
   Form1.Memo1.lines.add(Format(' Max Clock Speed : %d',[Integer(FWbemObject.MaxClockSpeed)]));
   Form1.Memo1.lines.add(Format(' NumberOfCores : %d', [Integer(FWbemObject.NumberOfCores)]));
   Form1.Memo1.lines.add(Format(' NumberOfLogicalProcessors : %d', [Integer(FWbemObject.NumberOfLogicalProcessors)]));
//...und so weiter...:wink:
    FWbemObject:=Unassigned;
  end;
end;

jus 14. Jun 2013 13:51

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Eine weitere Idee ist, ob man nicht vielleicht an die DMI Prozessor-Information über SMBios da rankommt. Da ich keinen Computer mit 2 Sockeln habe, kann es nicht ausprobieren. Aber vielleicht kann jemand das Programm Everest mal auf einem 2 CPU Sockel starten und mal unter "Computer->DMI->Prozessoren" reinschauen, ob da 2 getrennte CPU angezeigt werden. Falls ja ist die Wahrscheinlichkeit hoch, dass man es über SMBios Daten rauskriegt.

Lg,
jus

Bernhard Geyer 14. Jun 2013 14:02

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Zitat:

Zitat von hathor (Beitrag 1218596)
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Delphi-Quellcode:
// uses  ActiveX, comobj,

Procedure CPU;
....

Schaut gut auch. Ich denke ich nehme diese Version :thumb:

Ginko 14. Jun 2013 14:16

AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
 
Also bei mir liefert die Win32_ComputerSystem Klasse den richtigen Wert.

Delphi-Quellcode:
//uses ...ActiveX, ComObj, Variants, windows;      
procedure CPU2;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : Variant;// OLEVariant;
  oEnum : IEnumvariant;
  iValue : PULONG;//LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', '');
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_ComputerSystem','WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
   Form1.Memo1.lines.add(Format(' NumberOfLogicalProcessors : %d', [Integer(FWbemObject.NumberOfLogicalProcessors)]));
   Form1.Memo1.lines.add(Format(' NumberOfProcessors : %d', [Integer(FWbemObject.NumberOfProcessors)]));
   FWbemObject:=Unassigned;
  end;
end;
Win32_ComputerSystem:
Code:
 NumberOfLogicalProcessors : 2
 NumberOfProcessors : 1 <--
Win32_Processor:
Code:
 NumberOfCores : 2
 NumberOfLogicalProcessors : 2
Die Abfrage mit Win32_ComputerSystem kommt mir auch weniger verzögert vor.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz