Anzahl der Prozessoren ermitteln

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Anzahl der Prozessoren ermitteln

Beitrag von hschmidt »

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
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Hans,

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
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Gruß,

Andreas
VIP der XUG Osnabrück
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Andreas,
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
das Verzeichnis CPULOAD gibt es bei mir nicht, wahrscheinlich, weil ich nicht die Professional-Version habe.
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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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:

Code: Alles auswählen

#pragma library('ASMP10.LIB') // DLL anfordern
...
_MPNumProcessors() -> Anzahl der verfügbaren CPUs
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Tom,

zu dem Punkt, was Steffen in Berlin gesagt hat: Ich bekomme das jetzt spontan nicht komplett zusammen. Aber war es nicht so, daß man versuchen sollte, nicht CPU 0 zu nehmen, weil da standardmäßig fast alles drauf läuft was nicht intelligent genug ist?

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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).
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 ?

Genauso hatte ich Stefen und das Ergebnis des angeführten Threads verstanden. :?
Gruß
Hubert
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Tom,
Anzahl der CPUs ermitteln und zufällig eine verfügbare CPU wählen. Das ist in der Praxis der beste gangbare Weg.
Genau das habe ich auch vor.
Aber wie ermittelt man die Anzahl der CPU?

Hans
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

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
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Tom,

so funktioniert es!
Vielen Dank!

Hans
Antworten