Runshell() und CPU ...

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Runshell() und CPU ...

Beitrag von AUGE_OHR »

ausgehend von c:\ALASKA\XPPW32\SOURCE\samples\solution\smp\smprun.prg

Code: Alles auswählen

Thread():new():start("stress")
DO WHILE .T.
    nCpu := SmpGetCPU()
hab ich den Thread disabled und dafür ein RunShell() eingebaut.

Code: Alles auswählen

    IF SmpSetCPU(nCpu) = 0
       ? "Kann CPU-Maske nicht setzen auf:" + var2char(nCpu)
    END
    RunShell(var2char(nCpu),'Stress.Exe',.t.,.t.)
ENDDO
nun "müsste" das Programm Stress.EXE auf der aktuellen CPU laufen, oder ?
Run8Core.jpg
Run8Core.jpg (363.67 KiB) 11144 mal betrachtet
ich habe es ja vorher mit dem Thread laufen lassen und mein Gadget (links unten) zeigte mir die jeweilige CPU an ... aber hier nur 1 x CPU :shock:
was ist an dem Code ( oder der idee ) falsch ?
RUNSHELL.ZIP
(2.1 KiB) 288-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von brandelh »

sind die aufgerufenen Programme Xbase++ EXE ?

Ich meine (kann es aber nicht beweisen), dass die aufgerufene EXE selbst entscheidet welche CPUs sie nutzen kann.
Bei asyncroner Ausführung bin ich mir sogar sicher, bei syncroner Ausführung ... na ja ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:sind die aufgerufenen Programme Xbase++ EXE ?
JA
brandelh hat geschrieben:Ich meine (kann es aber nicht beweisen), dass die aufgerufene EXE selbst entscheidet welche CPUs sie nutzen kann.
Bei asyncroner Ausführung bin ich mir sogar sicher, bei syncroner Ausführung ... na ja ;-)
das ist ja nun der Test mit RunShell() ...

mir ist klar das, wenn ich in "Stress.EXE" selbst was einbaue, das es dann auf "der" CPU läuft die ich möchte.

p.s. kennt jemand ein (kleines) "Stress" Programm womit man es noch testen könnte ?
Calc.EXE macht ja nicht mehr 12345 N! -> Überlauf [-X
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von brandelh »

AUGE_OHR hat geschrieben:mir ist klar das, wenn ich in "Stress.EXE" selbst was einbaue, das es dann auf "der" CPU läuft die ich möchte.
wenn du nichts machst, zwingt die Standardeinstellung die EXE auf CPU 1 !
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:wenn du nichts machst, zwingt die Standardeinstellung die EXE auf CPU 1 !
hm ... JA ... bei Xbase++ sowieso !
aber was könnte man dann nehmen was man aus RunShell() aufruft zum testen ?

Code: Alles auswählen

    Thread():new():start("stress")
    DO WHILE .T.
        nCpu := SmpGetCPU()
        ? "Anwendung läuft z.Z. auf CPU(s): " + var2char( nCpu )

        INPUT "Neue CPU-Maske: (0 => Ende)" TO nCpu
        IF nCpu = 0
           EXIT
        ENDIF
        IF SmpSetCPU(nCpu) = 0
           ? "Kann CPU-Maske nicht setzen auf:" + var2char( nCpu )
        END
        RunShell(var2char( nCpu ),'Stress.Exe',.t.,.t.)
    ENDDO
wie schon gesagt unter XP ging das mit Calc.EXE ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von brandelh »

ich hab dir hier mal 2 Versionen eines Streßprogrammes mit PowerBasic CC kompiliert.
Dieses fragt die Tastatur ab, es selbst wird in der Prozessübersicht nie mit 25 % angezeigt.

Code: Alles auswählen

#COMPILE EXE
#DIM ALL
FUNCTION PBMAIN () AS LONG
  DIM I AS DOUBLE
  ? "5 min voll Streß ... (ESC = Ende)"
  i = TIMER + (5 * 60)
  WHILE i > TIMER
     IF $ESC = INKEY$ THEN EXIT
  WEND
END FUNCTION
Dieses fragt die Tastatur nicht ab, wird mit 25 % angezeigt ...

Code: Alles auswählen

#COMPILE EXE
#DIM ALL
FUNCTION PBMAIN () AS LONG
  DIM I AS DOUBLE
  ? "5 min voll Streß ... "
  i = TIMER + (5 * 60)
  WHILE i > TIMER
  WEND
END FUNCTION
Aber wenn man die 4 Kerne im Diagramm ansieht und die EXEs einzeln startet merkt mann, dass eben NICHT ein Kern ausgelastet wird, sondern eine Verteilung stattfindet.
Die EXE habe ich in der Zip angehängt, vielleicht nützt dir das ja ;-)

Ich bin mir sicher, dass wenn ich ein Xbase++ Programm mit QuickPDF starte und große PDFs erzeuge, die anderen Kerne mitarbeiten (Delphi DLL) ...

Aber selbst mit 4 dieser Programme offen, reagiert mein i5 (4 Kerne) ganz normal mit Win 7
Dateianhänge
Stresstest.zip
(10.17 KiB) 263-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 278
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Hat sich bedankt: 1 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von Hans Zethofer »

Jimmy,

FRACTAL.CH fehlt! =D>
_____________
lg
Hans
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

Hans Zethofer hat geschrieben:FRACTAL.CH fehlt! =D>
Oh ... sorry

Code: Alles auswählen

#define NUM_FRACTAL 4
#define NUM_POINTS  5000
#define NUM_EDGE    3
wer eine "Power" Machine hat sollte die Werte erhöhen ;)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

also ich habe nun mal folgendes geprüft

Code: Alles auswählen

cmd.exe /C start /affinity 8 notepad.exe
und das erwartete Ergebnis
Core3_Notepad.JPG
Core3_Notepad.JPG (113.84 KiB) 11055 mal betrachtet
wenn ich nun eine "unbehandelte" Xbase++ Applikation verwenden

Code: Alles auswählen

cmd.exe /C start /affinity 8 Stress.exe
bekomme ich das
Stress0.jpg
Stress0.jpg (261.64 KiB) 11055 mal betrachtet
Fazit : eine "unbehandelte" Xbase++ Applikation verwendet immer die 1st. CPU 0 :!:

im Beispiel C:\ALASKA\XPPW32\SOURCE\samples\solution\smp\smprun.prg wird ja von mehreren CPUs "gleichzeitig" gesprochen ... z.b. 3 oder 15 ( DC_SetCPU() )
diese funktioniert nicht mehr (es hat mal funktioniert in den älteren Versionen *** ). Es muss CPU x**2 seit und darf nur eine CPU sein :angry5:

wenn man trotzdem "alle" CPUs aktiviert, z.b. mit einer Manifest Datei ( "ProcAffinity" = "255") , was so aussieht
Stress8.jpg
Stress8.jpg (267.82 KiB) 11055 mal betrachtet
dann hat man zwar tatsächlich "alle" aber anhand der CPU Auslastung kann man sehen : da geht nix ... [-X

die Erklärung dafür findet man in Alaska Newsforum von Steffen F. Pirsig
Re: Multicore cpu and smp
public.xbase++.generic
16. Dezember 2008
Steffen F. Pirsig

this is by design since 1.5 or so. In earlier Versions of Xbase++ with SMP architectures we allowed to have each thread running on a different processor.
es wurde also im Zuge der Evolution gestrichen ... #-o
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:ich hab dir hier mal 2 Versionen eines Streßprogrammes mit PowerBasic CC kompiliert.
Danke !
bei einem 32bit OS() habe ich eine einfache Lösung gefunden : DBU.EXE schafft 100% auf einer CPU ;)

allerdings muss man dazu bemerken das ja CMD.EXE "alle" CPUs benutzt ... und auch die Cl*pper Programme die in der CMD Box gestartet werden :!:
wenn man das bedenkt stellt sich doch die Frage warum eine 32bit Xbase++ Applikation nur mit einer CPU (ordentlich) läuft [-X

ich kenne die Argumente bei Multi-Threading aber ich rede ja nicht davon das auch die Thread() wieder, wie vor v1.5x, den CPUs zugewiesen werden können sondern allgemein die Einstellung

Code: Alles auswählen

VERSION
       "ProcAffinity" = "255"
in der Manifest Datei damit alle CPUs (ordentlich) genutzt werden können.

"ordentlich" : läuft im VIO Modus aber sobald /PM:PM AppEvent() ins Spiel kommt reagiert die Maus kaum noch ... :angry4:

p.s. zur Beurteilung welche CPU ein Programm benutzt nehme ich den Taskmanager -> Prozesse -> Programm rechter Maustaste -> Zugehörigkeit -> Checkbox()
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

falls jemand keinen Zugriff auf die Newgroup hat hier die Mail.
12. September 2006
public.xbase++.bugreport
Re: 1.9331 - hang after a while - CPU 98%

Just a few comments regards the "98% cpu" problem.

1.) If the CPU goes to 98% ...

2.) According to our current knowledge of the problem we assume ...

// hier geht es los

3.) Regards the Xbase++ multi processor issue popping up in this thread,
please allow me to refer about the past, current and future in the context
of Xbase++ and the underlying hardware.

a.) PAST: Xbase++ as a product supports multi threading (single or multiple
CPUs) since its first day. It was designed and it is still one of our core
competences and knowledge to provide a runtime which hides most if not all of the
related complexities. In other words, the entire runtime (memory mgmt, datatypes and
operations. database access, error handling, user-interface) is designed in a way to
perform synchronization automatically without any deadlock. Plus the language
provides a clear model regards thread isolation in terms of privates/locals/workareas.

Starting with Version 1.0 until Version 1.8 of Xbase++ the runtime has
automatically adapted the way internal locking algorithms are implemented to the
underlying hardware architecture to support Single CPU and Multiple CPU (SMP) platforms.
Because more and more customers then have complained about the performance loss an
average Xbase++ application receives if executed on a SMP maschine we changed the automated
adaption of the Xbase++ runtime to a single CPU only with Xbase++ 1.82. The positive
effect is that a Xbase++ application now can run on different CPUs on a SMP Box,
however a single Xbase++ process is always bound to a single CPU. To understand the
ration behind it should be noted that a SMP architecture has its benefits only if
multiple processes are executed on the same maschine or if a single process performs CPU bound
operations (such as calculations) in different threads. If however a process is memory
bound or I/O bound the problem with SMP architectures is that the system-bus has to be
locked for memory and I/O access which leads to a dramatic performance penality.

Because Xbase++ application are "never" CPU bound but always memory or I/O bound an average
Xbase++ application runs slower on a SMP machine if running on different processors
at the same point in time.

b.) CURRENT: Xbase++ 1.9 is by default bound to a single CPU (the first cpu
if you have multiple ones or if HT is enabled). However this is just the default
setting and ensures that the average Xbase++ application performs at its best. There are no
performance drawbacks due to CPU context switches and additional synchronization overhead
specifially if memory is accessed from different processors. This mode of operation is called
"Single-Bound". The other type of operation is "Un-Bound" and allows the operating system to
schedule any Xbase++ thread on any processor. There is also the possibility to have your
Xbase++ application "Multi-Bound",meaning that the operating system is allowed to
schedule your Xbase++ applications and its thread to a set of processors. In case of
Un-Bound or Multi-Bound execution, threads of a single process can be executed at the same point in
time by a different CPU.

To change the default behaviour of your Xbase++ application the following options
are:

I.) Single-Bound: Changing the CPU on which the Xbase++ process runs at your own will.
You can use _MPSetCPU() to change the CPU on which the Xbase++ process runs. This
feature can be used to implement your own load-balancing regards available processors.
_MPSetCPU() and other multi-processor support functions are available in the cpuload
package which is a part of the Professional Subscription.

II.) Allow your application to run on different CPUs at the same point in time. In other words
allow the operating system scheduler to automatically distribute your threads over all (Un-Bound)
or a specific set of processors (Multi-Bound). Changing this setting needs a resource file with
a version resource such as shown below: ***

Code: Alles auswählen

 // use this ARC file to define the version resource
 // compile with arc and link the .res-file to the .exe
     VERSION
         "CompanyName"      = "Stock Analysts Inc."
         "ProductName"      = "SA-Quick "
         "ProductVersion"   = " 5.0"
         "FileVersion"      = " 5.001.893"
         "FileDescription"  = "Analyze stock markets"
         "InternalName"     = "SAQ5"

         "LegalCopyright"   = "Copyright © Stock Analysts Inc. 2001"
         "OriginalFilename" = "SAQ.DLL"
         "ProcAffinity"     = "3"
// end of res file
See the "ProcAffinity" entry. In this case it is assigned to 3 which means
Bit 0 and Bit 1 are set. This allows the Xbase++ Process to run its threads freely on CPU 0
and CPU 1. If we are running a exe which has linked in that specific Version-Resource
"ProcAffinity" on a 2 Processor system the Xbase++ EXE runs Un-Bound, if we are running
that EXE on 4 Processor system it runs Multi-Bound - only two processors #0 and
#1 are allowed.

You can also mix the two strategies, for example you can enable the Xbase++ EXE
by default to run on all CPUs ProcAffinity = "65535" and the lateron use _MPSetCPU()
to restrict the process to a single or multiple CPUs.

For the technical freaks out there: If the Xbase++ process is allowed to run Un-Bound
or Multi-Bound the internal locking alogrithms are different bec. operations against
memory are no more atomic with a simple test-set-semaphore such as it is
the case with fast-semaphores. However all of these complexities are hidden by the
runtime and automatically managed by the Xbase++ core.

c.) FUTURE: Since 2002 and Xbase++ 1.82 the world has changed. Today the available
Hardware is quiet different than in the early days of multi-processors with its SMP architecture.
There is Hyperthreading, Single-Core and Multiple-Core processors, we have shared or
multiple cache lines and we even have Multi-Core with HT processors. All of these types
of processors behave totally different if it comes to multi processing. Some of them scale only
if the task if CPU bound, others scale if the tasks are CPU and memory bound. The challenge
for Alaska Software is currently to identify the patterns at which the Xbase++ runtime and/or
different application types get most out of the available CPU power. For this Alaska Software
has already invested in a set of identical boxes, only different by their CPU types, our current
research goals are to have a pre-defined set of Multi-Processing-Setups which can be easily
selected and which ensure that the Xbase++ application performs at its best.

SUMMARY: Changing CPUs, changing processor affinity and therefore changing the
behaviour of the Xbase++ runtime to have it bound to a single or multiple CPUs makes
currently only sense for those which have a deep understanding and control of the
Hardware on which their application is running. There are various parameters which
affect single application performance when it comes to the usage of more than one processor.

However if your are currently running Xbase++ applications via Citrix or Terminal-Server
it is definitive a good idea to have your application Un-Bound - this way the operating
system is free to schedule all threads of all Xbase++ instances running over all CPUs available.

With kind regards
Steffen F. Pirsig
Alaska Software
*** Anmerkung : man zwar "ProcAffinity" = "3" setzte und die Xbase++ EXE startet auch aber wenn man die Maus bewegt ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von brandelh »

AUGE_OHR hat geschrieben:falls jemand keinen Zugriff auf die Newgroup hat hier die Mail.
12. September 2006
public.xbase++.bugreport
Dass Xbase++ EXE immer nur den 1. Prozessor nutzen ist ein alter Hut.
Auch, dass die Performance beim CPU switchen (also der EXE mehr CPUs freizugeben) in den Keller geht, sollte jeder mal gehört haben.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Dass Xbase++ EXE immer nur den 1. Prozessor nutzen ist ein alter Hut.
hm ... ich würde eher formulieren : DEFAULT, ab v1.8x, benutzt eine Xbase++ EXE die 1st CPU ( es kann aber auch "eine" andere sein )
brandelh hat geschrieben:Auch, dass die Performance beim CPU switchen (also der EXE mehr CPUs freizugeben) in den Keller geht, sollte jeder mal gehört haben.
wieso "switch" wenn mehrere CPUs, wie bei CMD.EXE, freigegeben wurden ?!

das ist doch genau der Punkt wo mir die Ausführung von Steffen nicht korrekt scheint.
richtig ist zwar, das für echtes Multi-Processing, auch ein getrennter Speicherbereich usw "verwaltet" werden "müsste" aber davon ist Xbase++ meilenweit entfernt und davon spreche ich nicht.

ich frage nach einer "CMD" Lösung welches erlaubt alle CPU freizuschalten*** damit die gleichzeitig genutzt werden "könnten" wie ein Cl*pper Programm in der CMD Box.
ob ein Cl*pper Programm dabei nun wirklich alle CPUs nutzt lasse ich mal dahingestellt aber es "läuft" und macht das Programm nicht langsamer (aber auch nicht schneller ... )

die Versuche mit Xbase++ EXE und Manifest geben verschiedene Ergebnisse ... je nachdem ob VIO oder GUI :-k
bei GUI merkt man sofort wenn die Maus bewegt wurde -> Bildschirm stockt ... als wenn im Hintergrund was läuft ( GUI-Thread ? )
hm ... der Effekt ist ähnlich wie damals die ersten v1.9 ActiveX beta Versionen ... :-k

***mit

Code: Alles auswählen

"ProcAffinity" = "255"
erhält man das
All_CPU.jpg
All_CPU.jpg (24.06 KiB) 11010 mal betrachtet
mit einer Xbase++ EXE ... was aber nicht bedeutet da es "so" funktioniert.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von brandelh »

Such doch einfach in den alten Beiträgen ... ;-)
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von Tom »

Nö, die Performance geht nicht in den Keller, wenn man via API-Call die CPU wechselt. Ganz im Gegenteil ist es kaum spürbar. In Terminal Server-Umgebungen machen wir das ständig, über eine interne Nutzungsüberwachung (Mitzählen der Anmeldungen und der Verteilungen) oder optional zufällig.

Es kommt nichts dabei heraus, wenn man mit der ProcAffinity herumspielt, außer, dass die Anwendungen komplett in die Knie gehen. Ganz egal, mit welcher Xbase++-Version (ab 1.9).
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von brandelh »

Hallo TOM,

der Wechsel von einer CPU auf die nächste (einmalig für die ganze Anwendung) meinte ich nicht, hab mich wohl falsch ausgedrückt.
Auch, dass die Performance beim CPU switchen (also der EXE mehr CPUs freizugeben) in den Keller geht, sollte jeder mal gehört haben.
Ich meinte, dass die EXE ihre Threads auf mehrere CPUs verteilen kann ... und dann müssen diese gegenseitig syncronisiert werden, was die Anwendung extrem verlangsamt.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Ich meinte, dass die EXE ihre Threads auf mehrere CPUs verteilen kann ...
und dann müssen diese gegenseitig syncronisiert werden, was die Anwendung extrem verlangsamt.
von "echten" (getrennten) Threads träumen wir höchstens :roll:

"das" mehrere CPUs bereit gestellt werden setzt IMHO nicht voraus das die auch von der Applikation genutzt werden. ( Beispiel. CMD.EXE / Cl*pper )
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

Tom hat geschrieben:Es kommt nichts dabei heraus, wenn man mit der ProcAffinity herumspielt, außer, dass die Anwendungen komplett in die Knie gehen.
Ganz egal, mit welcher Xbase++-Version (ab 1.9).
mittels ProcAffinity kann ich schon "eine" CPU festlegen ( i-1**2 ) aber es geht nicht > 1 CPU :angry5:

auch sollte der Aufruf mit

Code: Alles auswählen

cmd.exe /C start /affinity 8 xxx.exe
funktionieren wie bei anderen Windows Programmen z.b. Notepad.EXE oder Calc.EXE
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von Jan »

Ich erinnere mich an mehrere Gelegenheiten, wo Steffen ausführte, das ein Multithreading über mehrere Kerne äußerst ineffektiv sei, den Grund hat Tom schon genannt. Das man aber sehr wohl sein Xbase++-Programm auf einen anderen Kern schieben kann. Die vorgeschlagene Vorgehensweise wäre: Messen, welcher Kern gerade am wenigsten zu tun hat, und das Programm dahin schieben.

Natürlich stellt sich da die Frage, warum andere Programme das sehr effektiv können. Aber darüber läßt Steffen sich dann leider nicht mehr aus.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von brandelh »

und nochmal, das ganze Thema ist mit den ersten bezahlbaren X2 Prozessoren aufgetaucht und bis zum Überdruß diskutiert worden.
Es hier nochmals durchzukauen ist ... :banghead:
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Runshell() und CPU ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Es hier nochmals durchzukauen ist ... :banghead:
ja ... ok ... so langsam hab ich wohl alle Möglichkeiten ausprobiert was mit "ProcAffinity" und-oder / AFFINITY und Runshell() möglich ist.

ein Runshell() lässt sich auf einer oder mehreren CPUs ausführen.

Code: Alles auswählen

RunShell( [/C start "Cl*pper DBU" /AFFINITY 8 "D:\DB2U\DBU.EXE" ],'CMD.EXE',.T.,.T.)
startet nun wie gewünscht auf der 4th CPU wie man am "Stress" im Taskmanager dann sehen kann.

per CMD.EXE gestarteten Programm benutzten "die" CPUs ... nicht Xbase++
der Aufruf mit / AFFINITY wirkt bei einer Xbase++ EXE nicht.

eine Xbase++ EXE wird immer von der 1st CPU gestartet (schon vor AppSys )... egal ob "aktive" oder nicht ( dann hängt er eben )
ein umschalten ist nur möglich wenn es von einer "aktive" CPU ausgeht jedoch nicht gegen "ProcAffinity" im Manifest ankommt ?!

zumindest bin ich nun Recht sicher, nachdem ich die Kombinationen ausprobiert habe, was geht / nicht geht.
ich war verunsichert durch einen Beitrag im Express++ Forum über DC_SetCPU() ...
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von Tom »

Ist schon eine Weile her, aber ich befasse mich gerade wieder einmal mit Prozessorfragen, wobei ich auf diesen PDR gestoßen bin, in dessen Workaround erklärt wird, wie man mit RunShell() eine App startet, die dann auf mehreren Prozessoren läuft, im Gegensatz zu Xbase++-Applikationen, die auch im Jahr 2021 noch auf einem Kern herumluschen. :angry4:

https://www.alaska-software.com/scripts ... PDRID=7079

In der Erläuterung zum Workaround steht Altbekanntes. Man kann eine Xbase++-Applikation zwar über die "ProcAffinity" dazu zwingen, sich zu verteilen (im PDR ist erklärt,wie das über gelinkte Ressourcen geht), aber dann geht sie in die Knie.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von Jan »

Hallo Tom,

ja, das ist schon lästig das in Zeiten, wo man kaum mehr CPU unter 4 oder 6 Kernen kaufen kann, man mit Xbase++ immer noch nur einen nutzen kann. Vor Allem, weil oft ja die CPU-Frequen niedriger gesetzt wird, da man dann mehr Kerne bei gleicher thermischer Belastung laufen lassen kann. Und wo man in Xbase++ so wunderbar einfach eigenständige und stabile Threads bauen kann, die man ja sehr schön auf andere Kerne schieben könnte.

Was ich vor einiger Zeit mal bei meinem Hauptkunden gemacht habe: Dort laufen nahzu immer mehrere Xbase++-Programme auf jedem Client, auf einigen Rechner 6 oder 7. Also leg ich beim Programmstart immer einen zufällig ausgewählten Kern für diese Instanz fest. Damit die hoffentlich wenigstens nicht alle den gleichen Kern beanspruchen. So kann ich letztendlich die Last doch ein wenig verteilen. Wenn auch nicht pro Programm.

Man könnte das natürlich noch geordneter machen, indem ich eine Tabelle führe, in der ich alle gerade belegten Kerne eines Clients eintrage, und so ganz sicher nie zwei Progamme auf dem gleichen Kern laufen lasse. Aber so groß ist der Leidensdruck dann bislang auch nicht gewesen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Runshell() und CPU ...

Beitrag von Tom »

Hallo, Jan.

Ich will eigentlich nichts mehr auf Kerne schieben. Wir sind mit Terminal Server-Situationen mit CPU-Clustern konfrontiert, auf denen Dutzende Benutzer in unseren Anwendungen arbeiten, aber wir verteilen immer noch einzelne logische CPU-Kerne. Und wenn wir's nicht tun, dann hängen alle auf CPU 1 von 256. Es geht heutzutage nicht mehr darum, die Logik der Anwendung so aufzuteilen, dass sie sinnvoll mehrere Kerne nutzen kann und das irgendwie selbst überwacht. Das ist Neunzigerjahrezeug. Ich erwarte eigentlich, dass eine Entwicklungsumgebung bzw. ihre Runtimes so designt sind, dass sie ein Mehrkernsystem sinnvoll nutzen können. Denn was vor zwanzig Jahren noch eine krasse Ausnahme war, ist heute der Standard. Und ein Xbase++-Programm fährt immer noch auf der Standspur, ganz egal, wie breit der Highway ist.
Herzlich,
Tom
Benutzeravatar
BJelinek
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 218
Registriert: Sa, 02. Jun 2012 20:57
Wohnort: 73257 Köngen
Hat sich bedankt: 9 Mal
Danksagung erhalten: 3 Mal

Re: Runshell() und CPU ...

Beitrag von BJelinek »

Hallo Tom,

Wie benutzt Ihr die CPU > 32 ?

Welche Funktion benutzt Ihr ?

Bekomme immer Fehlermeldung.

Danke
Grüße
Bernd

Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten