Thread auf separatem CPU-Kern laufen lassen

Alles was nicht wirklich Programmierung ist, aber auch nicht Plaudereien im Raucherraum

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Thread auf separatem CPU-Kern laufen lassen

Beitrag von Werner_Bayern »

Servus,

gibt es inzwischen eine Möglichkeit, gezielt einen Thread auf einen Kern zu legen? Egal ob virtuell oder physisch. Ähnlich dem Beispiel smprun, aber nicht die ganze App, sondern eben nur entsprechende Threads.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von Martin Altmann »

Nein.
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:Ähnlich dem Beispiel smprun, aber nicht die ganze App, sondern eben nur entsprechende Threads.
unter Xbase++ laufen Thread, wie Martin kurz und bündig erklärte, immer auf der selben CPU wie MAIN.
du kannst aber, per smprun, die laufende Xbase++ Application "umschalten" ... 10 x pro Sekunde per Thread ... und es läuft stabil ;)
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von Werner_Bayern »

Bringt mir nichts. Hab eine C-DLL, wenn ich da eine bestimmte Funktion rufe, ist die Applikation für ca. 20 - 30 Sekunden (eine 10-15 MB große Datei wird geöffnet und eingelesen) auf 100% und nichts geht mehr, obwohl ich das in einem eigenen Thread laufen lasse.

Schade. Da könnte ich die das Öffnen der Dateien auf alle verfügbaren Kerne / Cores auslagern und die Main-Schleife würde trotzdem noch reagieren. Die Dateien haben je nur ca. 10 MB, das einlesen dauert aber lange, weil da sehr viel währenddessen abläuft (worauf ich aber keine Einfluss habe).
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:Bringt mir nichts.
hast du es ausprobiert ?
auf meinem alten P4 3Ghz brauchte der WMPlayer beim laden des Codec "ewig" und stand dabei bei 100% ... auf 1 x CPU ... und man konnte praktisch nichts mehr unter Windows machen.

wenn ich aber per SMPRUN "umschalte" alle 1/10 dann hab ich ca. 30% pro CPU und Windows reagiert "normal". es ist also das selbe was das OS die ganze Zeit macht denn auch wenn Xbase++ Threads auf einer anderen CPU laufen lassen könnte wird es ja NICHT schneller ... die "Zeitscheibe" bestimmt das Timeing.

p.s. man sollte in solche Threads SLEEP(1) einbauen damit die MAIN ein Chance bekommt auf Events zu reagieren ( z.b. Abbruch )
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von Werner_Bayern »

dann hab ich was nicht verstanden.
Es müsste doch deutliche Performance-Vorteile bringen, wenn ich das Laden und Auswerten von z. B. 200 Dateien (das ist aktuell die Anforderung) auf z. B. 4 Kerne = 4 Dateien "gleichzeitig" verteile, als immer nur eine Datei nach der anderen auf einem Kern?
Ein sleep würde nichts bringen, weil der Lade- und Analysevorgang von eine C-DLL erledigt wird, das ist ein Aufruf einer Funktion, dann steht das Ganze auf 100% für 10-20 Sekunden.

Für mich der Klassiker für Multi-Core / Threads.

Wenn ich jetzt Datei für Datei sequentiell öffne und analysiere und währenddessen ständig umschalte, erzeugt das doch nur mehr CPU-Zyklen? Außerdem müsste ich erst intensiv testen, ob das die C-Funktion auch vertragen würden, wenn ständig hin- und hergeswitched würde.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von brandelh »

Werner_Bayern hat geschrieben:dann hab ich was nicht verstanden.
Es müsste doch deutliche Performance-Vorteile bringen, wenn ich das Laden und Auswerten von z. B. 200 Dateien (das ist aktuell die Anforderung) auf z. B. 4 Kerne = 4 Dateien "gleichzeitig" verteile, als immer nur eine Datei nach der anderen auf einem Kern?
wenn du die Datei auf einmal in den RAM bekommst und jeder Thread im RAM arbeitet könntest du Vorteile haben, aber solange du die Daten von der Festplatte holst, wird diese dich immer abbremsen.

MERKE: EIN EXCLUSIVER Zugriff auf die Festplatte ist immer schneller als mehrere gesharte, Festplatten sind lahm und man kann sie nicht "virtuell" verdoppeln.

Eine RAM-DISK oder zwei besonders schnelle Platten SSD könnten auch nützlich sein.

PS: Auch wenn du einen Compiler nimmst, der auf alle verfügbaren CPUs zugreifen kann, kannst du NIE einzelne Threads auf einen Prozessor steuern.
Alles was geht ist die Beschränkung auf einzelne oder die Freigabe aller CPUs, der Rest wird von Windows erledigt.

Mit der QuickPDF DLL habe ich schon gesehen, dass die EXE von mir auf einem Kern Volllast erzeugt hat (die musste ziemlich rödeln um die Daten aufzubereiten) und bei der Übergabe an QuickPDF wurde plötzlich der zweite Kern aktiv.
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von UliTs »

Hubert,
Da hast Du Werner falsch verstanden!
Die Tabellen sind nur 10-15 MByte groß. Das Einlesen ist nicht das Problem, sondern die zeitaufwendigen Berechnungen :-) .
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von brandelh »

Hallo Uli,

also ich habe dieses Aussage von Werner gelesen und daraus geschlossen, dass er mehrere Dateien gleichzeitig durchsucht:
Werner hat geschrieben:Wenn ich jetzt Datei für Datei sequentiell öffne und analysiere und währenddessen ständig umschalte, erzeugt das doch nur mehr CPU-Zyklen? Außerdem müsste ich erst intensiv testen, ob das die C-Funktion auch vertragen würden, wenn ständig hin- und hergeswitched würde.
Zur Beschleunigung würde ich empfehlen die Datei mit memoread() oder anderem auf einmal in eine Variable / Array einzulesen und dann die Berechnungen in einem seperaten Thread laufen zu lassen (was auch immer so komplex zu berechnen ist).
Auf mehrere CPU Kerne aufteilen KANN Xbase++ nicht mehr, weil nach der Freigabe mehrerer CPU Kerne die Geschwindigkeit ins bodenlose gefallen ist !

Was noch möglich wäre ist das mehrfache öffnen der EXE mit Parametern z.B. über Batchdateien und in jeder EXE den CPU Kern per Zufall zu wählen, das haben wir schon öfters besprochen. Aber auch das wird nur etwas bringen, wenn die Datei auf einen Schlag eingelesen und danach nur noch im RAM gerechnet wird.

Hinzu kommt die Frage, ob die C-DLL überhaupt für mehrere Threads geeignet ist, mehrere EXE hingegen sind grundsätzlich möglich.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von Werner_Bayern »

Servus Hubert,

ja, Du hast mich falsch verstanden, oder ich hab mich missverständlich ausgedrückt. Auf das Laden habe ich keinen Einfluss, auch auf das Zerlegen nicht, das übernimmt eben dieser eine C-DLL-Aufruf. Es sind ca. 200 Dateien mit 15-20 MB einzulesen, das eigentliche Einlesen in den RAM dürfte also ziemlich schnell gehen, aber dann wird im RAM die Struktur der Datei aufbereitet, was diese Last verursacht. Darauf habe ich keinen Einfluss.

Du hast Recht, ich möchte gerne - aber nur wenn möglich in versch. Threads auf versch. Cores - mehrere Dateien mit diesem jeweiligen einem C-Aufruf öffnen und analysieren lassen, weil das m. M. n. schneller gehen sollte als der sequentielle Aufruf mit nur einem Core. Threads alleine würden da wohl nichts bringen, da der eine Core, auf dem Xbase++ läuft, ja eh schon auf 100% steht.

Dein Vorschlag mit den mehreren Exe ist interessant!

Danke und ein gesundes, zufriedenes und glückliches 2013 an alle!!!
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Auf mehrere CPU Kerne aufteilen KANN Xbase++ nicht mehr, weil nach der Freigabe mehrerer CPU Kerne die Geschwindigkeit ins bodenlose gefallen ist !
ich rede ja nicht davon mehrere CPUs "gleichzeitig" laufen zu lassen sondern "um-zu-schalten".

ich rede hier auch von "echten" CPUs und nicht von HT was nur eine "Verdopplung" der Register darstellt. Die "CPU Zeit-Scheibe" des OS() kann dabei jedes "echte" CPU einzeln ansteuern gegenüber HT was ja die selbe CPU ist. klar gibt es noch die "Master Zeit-Scheibe" ... aber bei 4GHz und mehr ...

wenn du nun eine Applikation hast die 100% CPU nimmt dann eben nur auf 1 x CPU. mehr als 100% geht nicht also muss die CPU "warten" ...
wenn man aber auf eine andere CPU "umschaltet" bevor der 100% erreicht hat dann fängt die andere CPU ja bei 0 an. dabei kann man bis 1/100 Sec ... mehr geht mit Xbase++ nicht.

auf Intel CPU, mit HT, bringt 1,3,5,7 den gewünschten Effekt. bei AMD 3/4 Core sollte alle gehen.
bei den neuen FX-8xxx bin ich mir noch nicht sicher ... auch weil sich die Taktfrequenz dynamisch ändert.
brandelh hat geschrieben:Hinzu kommt die Frage, ob die C-DLL überhaupt für mehrere Threads geeignet ist, mehrere EXE hingegen sind grundsätzlich möglich.
das ist das Problem ... mehrere Instanzen sind einfacher aber wie bekommt man dann alles wieder "zusammen" ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:Es sind ca. 200 Dateien mit 15-20 MB einzulesen, das eigentliche Einlesen in den RAM dürfte also ziemlich schnell gehen, aber dann wird im RAM die Struktur der Datei aufbereitet, was diese Last verursacht. Darauf habe ich keinen Einfluss.
dann fängt die CPU an zu arbeiten und geht gegen 100% ... weil der Cache von "der" CPU "voll" ist.

p.s. wenn ich eine CPU, die gerade arbeitet, "umschalte" heisst es ja nicht das die schlagartig "stehen bleibt" ... was sich im Cache befindet wird dann immer noch abgearbeitet.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von brandelh »

Werner_Bayern hat geschrieben:Auf das Laden habe ich keinen Einfluss, auch auf das Zerlegen nicht, das übernimmt eben dieser eine C-DLL-Aufruf.
also weißt du gerade nicht, ob die C-DLL die Daten schnell (auf einen Rutsch) ins RAM lädt, oder sequentiell einige Byte ... immerhin ist jede Date exclusiv geöffnet.
Werner_Bayern hat geschrieben:Es sind ca. 200 Dateien mit 15-20 MB einzulesen, das eigentliche Einlesen in den RAM dürfte also ziemlich schnell gehen,
wie wir darüber festgestellt haben ist das eine Vermutung die durch "unser Wissen" nicht gedeckt ist. Ohne Quellcode ...
Werner_Bayern hat geschrieben:aber dann wird im RAM die Struktur der Datei aufbereitet, was diese Last verursacht.
Auch ich habe keine Ahnung was die Funktion intern erledigt, allerdings erscheint es mir irgendwie nicht glaubwürdig, dass ein PC, der mit einem Kern Videos rendern kann mit der "Aufbereitung" von Daten völlig überlastet ist - wenn man es richtig gemacht hat ;-)
Um auf deine Frage zurück zukommen. Es ist technisch NICHT MÖGLICH einen Thread auf einer speziellen CPU laufen zu lassen.
Das Umschalten der CPU bzw. das Warten von einer CPU (besser dem Thread darauf) auf eine andere (besser dem Thread der dort läuft und nicht unabhängig ist) dauert länger als alles auf einer CPU laufen zu lassen, daher ja die Einschränkung auf eine CPU bei Xbase++ Programmen.

Ich weiß nicht was dein Xbase++ Programm überhaupt selbst macht, vermute aber (immer diese Vermutungen :wink: ) es übergibt beim Aufruf den Dateinamen an die DLL und wartet bis diese fertig ist. Xbase++ selbst hat dann aber gar nichts zu tun ;-)
Wenn du nun für jeden CPU Kern eine Xbase++ Steueranwendung startest und jede sich "ihre CPU" auswählt (wie das geht haben wir auch schon öffters besprochen), dann müsste die von diesem Prozess aufgerufende DLL Funktion im Umfeld der EXE und damit auf diesem CPU Kern ausgeführt werden ... ich kann dies aber auch nur vermuten ;-)

PS: natürlich müsstest du die laufenden Instanzen z.B. über eine Steuer-DBF (welche CPU ist schon belegt, welche Datei wird schon verarbeitet etc.) syncronisieren.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von Werner_Bayern »

Servus Hubert,

danke, dem ist nichts hinzuzufügen, so ist es nämlich. :)
Wie bereits geschrieben, Dein Vorschlag mit mehreren EXE ist sehr interessant, werde ich wohl umsetzen. Es gibt dann ein Hauptprogramm, das ermittelt die Anzahl der Cores und dann wird schön der Reihe nach für jeden Core, der noch nicht durch eine Exe des Hauptprogrammes belegt ist, eine Exe mit entsprechendem Parameter für den Core gestartet.
Die Anwendung läuft aktuell auf einem 2008er Server, werde wohl einen Core unangetastet lassen, damit während der 10 - 15 Minuten nicht alles "einfriert".

Eine dbf brauche ich dazu nicht, ich kann ja feststellen, ob ein von mir gestartetes Programm noch läuft, oder sich bereits beendet hat, weil fertig.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von brandelh »

Ich vermute, dass du die EXEs asyncron oder besser aus einer CMD heraus starten musst, damit diese nicht an den Hauptprozess gebunden sind.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Thread auf separatem CPU-Kern laufen lassen

Beitrag von Werner_Bayern »

Mit cmd hab ich nichts am Hut, ist eine reine GUI-Anwendung.
Bish. Test läuft einwandfrei, einfach ein

Code: Alles auswählen

runShell("1","Auswert.exe", .t.)
im Hauptprog und im aufgerufenen Prog ein

Code: Alles auswählen

SmpSetCPU(nParameter)
und der entsprechende Core hat 100% Auslastung.
Gute Idee, danke!
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten