AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Thema durchsuchen
Ansicht
Themen-Optionen

Anzahl der CPU (Nicht Kerne/Cores) bestimmen

Ein Thema von Bernhard Geyer · begonnen am 13. Jun 2013 · letzter Beitrag vom 14. Jun 2013
Antwort Antwort
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#1

Anzahl der CPU (Nicht Kerne/Cores) bestimmen

  Alt 13. Jun 2013, 17:35
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 13. Jun 2013, 17:56
Meinst du eventuell sowas hier ?

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

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

Grüße

Geändert von Ginko (13. Jun 2013 um 18:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 14. Jun 2013, 10:02
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

Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 14. Jun 2013, 10:26
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
Klaus
  Mit Zitat antworten Zitat
mentaltec

Registriert seit: 28. Sep 2012
60 Beiträge
 
#5

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

  Alt 14. Jun 2013, 10:40
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
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#6

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

  Alt 14. Jun 2013, 11:14
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...

Geändert von Ginko (14. Jun 2013 um 16:52 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

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

  Alt 14. Jun 2013, 13:06
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;
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#8

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

  Alt 14. Jun 2013, 14:51
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 14. Jun 2013, 15:02
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#10

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

  Alt 14. Jun 2013, 15:16
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.

Geändert von Ginko (14. Jun 2013 um 15:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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