Anzahl der Prozessoren ermitteln
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 164
- Registriert: Mo, 09. Jan 2006 17:06
- Wohnort: Paderborn
- Hat sich bedankt: 2 Mal
- Kontaktdaten:
Anzahl der Prozessoren ermitteln
Hallo,
da Xbase++ - Programme bei Mehrprozessorsystemen standardmäßig immer nur den 1. Prozessor benutzen, möchte ich eine Routine schreiben, mit der ich nach einem "Kreislaufverfahren" meiner Applikation einen bestimmten Prozessor zuweisen kann.
Wie so etwas funktionieren könnte, weiß ich auch schon (_sysSetCPU).
Zuerst einmal möchte ich aber feststellen, ob ich es überhaupt mit einer Mehrprozessormaschine zu tun habe und wenn ja, wieviele Prozessoren sie hat.
Geht das?
Vielen Dank und freundliche Grüße
Hans
da Xbase++ - Programme bei Mehrprozessorsystemen standardmäßig immer nur den 1. Prozessor benutzen, möchte ich eine Routine schreiben, mit der ich nach einem "Kreislaufverfahren" meiner Applikation einen bestimmten Prozessor zuweisen kann.
Wie so etwas funktionieren könnte, weiß ich auch schon (_sysSetCPU).
Zuerst einmal möchte ich aber feststellen, ob ich es überhaupt mit einer Mehrprozessormaschine zu tun habe und wenn ja, wieviele Prozessoren sie hat.
Geht das?
Vielen Dank und freundliche Grüße
Hans
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
-
- Rekursionen-Architekt
- Beiträge: 164
- Registriert: Mo, 09. Jan 2006 17:06
- Wohnort: Paderborn
- Hat sich bedankt: 2 Mal
- Kontaktdaten:
Hallo Andreas,
Mit dem Beispiel aus ...\smp habe ich mich befasst und kann die CPU auch zuordnen, was aus dem Beispiel aber nicht hervorgeht ist, wieviele Prozessoren überhaupt vorhanden sind.
Und genau das will ich feststellen!
Hans
das Verzeichnis CPULOAD gibt es bei mir nicht, wahrscheinlich, weil ich nicht die Professional-Version habe.siehe dir die Beispiele von Alaska. Ich glaube, dass es da was darüber gibt.
C:\ALASKA\XPPW32\Source\samples\solution\CPULOAD
bzw.
C:\ALASKA\XPPW32\Source\samples\solution\smp
Mit dem Beispiel aus ...\smp habe ich mich befasst und kann die CPU auch zuordnen, was aus dem Beispiel aber nicht hervorgeht ist, wieviele Prozessoren überhaupt vorhanden sind.
Und genau das will ich feststellen!
Hans
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hi,
also im CPULOAD Beispiel ist bei mir nur eine Textdatei.
In dem bereits genannten Thread hier im Forum wurde viel dazu geschrieben.
Was man braucht ist die ASMP10.DLL / .LIB:
also im CPULOAD Beispiel ist bei mir nur eine Textdatei.
In dem bereits genannten Thread hier im Forum wurde viel dazu geschrieben.
Was man braucht ist die ASMP10.DLL / .LIB:
Code: Alles auswählen
#pragma library('ASMP10.LIB') // DLL anfordern
...
_MPNumProcessors() -> Anzahl der verfügbaren CPUs
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Hubert.
Diese Variante greift auf die PDH.DLL zu, die es ab NT gibt. Diese Systematik funktioniert nicht einwandfrei, wir haben bei vielen Kunden "frozen Apps" gehabt (vor allem mit Multicore-Prozessoren) und sind deshalb wieder auf die alte Systematik umgestiegen (_sysGetCPU, _sysSetCPU). Dabei verfolgen wir inzwischen die Strategie, die Steffen beim XUG-Treffen in Berlin skizziert hat: Anzahl der CPUs ermitteln und zufällig eine verfügbare CPU wählen. Das ist in der Praxis der beste gangbare Weg.
Diese Variante greift auf die PDH.DLL zu, die es ab NT gibt. Diese Systematik funktioniert nicht einwandfrei, wir haben bei vielen Kunden "frozen Apps" gehabt (vor allem mit Multicore-Prozessoren) und sind deshalb wieder auf die alte Systematik umgestiegen (_sysGetCPU, _sysSetCPU). Dabei verfolgen wir inzwischen die Strategie, die Steffen beim XUG-Treffen in Berlin skizziert hat: Anzahl der CPUs ermitteln und zufällig eine verfügbare CPU wählen. Das ist in der Praxis der beste gangbare Weg.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
jetzt bin ich aber irritiert, ist nicht _MPNumProcessors() genau der Befehl der feststellt, wieviele CPUs vorhanden sind, um dann mit _sysSetCPU() nicht einen ungültigen Wert zuzuweisen ?Tom hat geschrieben:Diese Variante greift auf die PDH.DLL zu, die es ab NT gibt. Diese Systematik funktioniert nicht einwandfrei, wir haben bei vielen Kunden "frozen Apps" gehabt (vor allem mit Multicore-Prozessoren) und sind deshalb wieder auf die alte Systematik umgestiegen (_sysGetCPU, _sysSetCPU).
Genauso hatte ich Stefen und das Ergebnis des angeführten Threads verstanden.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Code: Alles auswählen
FUNCTION _sysGetCPU()
LOCAL rc
rc := DllCall("Xpprt1.dll",DLL_CDECL, "_sysGetCPU")
RETURN rc
FUNCTION _sysSetCPU(nCpuMask)
LOCAL rc
nCpuMask := 2 ** (nCpuMask-1)
rc := DllCall("Xpprt1.dll",DLL_CDECL, "_sysSetCPU", nCpuMask)
RETURN rc
nProcessor := 2
nProcessorCount := 1
lMultiProcessor := .F.
do while _sysSetCPU(nProcessor) # 0
lMultiProcessor := .T.
nProcessorCount ++
nProcessor ++
enddo
Herzlich,
Tom
Tom