Thread auf separatem CPU-Kern laufen lassen
Moderator: Moderatoren
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2127
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Thread auf separatem CPU-Kern laufen lassen
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.
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!>
Werner
<when the music is over, turn off the lights!>
- Martin Altmann
- Foren-Administrator
- Beiträge: 16554
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 115 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Thread auf separatem CPU-Kern laufen lassen
Nein.
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.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
unter Xbase++ laufen Thread, wie Martin kurz und bündig erklärte, immer auf der selben CPU wie MAIN.Werner_Bayern hat geschrieben:Ähnlich dem Beispiel smprun, aber nicht die ganze App, sondern eben nur entsprechende Threads.
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
Jimmy
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2127
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
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).
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!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
hast du es ausprobiert ?Werner_Bayern hat geschrieben:Bringt mir nichts.
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
Jimmy
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2127
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
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 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!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread auf separatem CPU-Kern laufen lassen
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.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?
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
Hubert
-
- 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
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
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
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread auf separatem CPU-Kern laufen lassen
Hallo Uli,
also ich habe dieses Aussage von Werner gelesen und daraus geschlossen, dass er mehrere Dateien gleichzeitig durchsucht:
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.
also ich habe dieses Aussage von Werner gelesen und daraus geschlossen, dass er mehrere Dateien gleichzeitig durchsucht:
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).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.
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
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2127
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
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!!!
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!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
ich rede ja nicht davon mehrere CPUs "gleichzeitig" laufen zu lassen sondern "um-zu-schalten".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 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.
das ist das Problem ... mehrere Instanzen sind einfacher aber wie bekommt man dann alles wieder "zusammen" ?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.
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
dann fängt die CPU an zu arbeiten und geht gegen 100% ... weil der Cache von "der" CPU "voll" ist.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.
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
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread auf separatem CPU-Kern laufen lassen
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:Auf das Laden habe ich keinen Einfluss, auch auf das Zerlegen nicht, das übernimmt eben dieser eine C-DLL-Aufruf.
wie wir darüber festgestellt haben ist das eine Vermutung die durch "unser Wissen" nicht gedeckt ist. Ohne Quellcode ...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,
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 hatWerner_Bayern hat geschrieben:aber dann wird im RAM die Struktur der Datei aufbereitet, was diese Last verursacht.
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 ) 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
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2127
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
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.
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!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Thread auf separatem CPU-Kern laufen lassen
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
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2127
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Thread auf separatem CPU-Kern laufen lassen
Mit cmd hab ich nichts am Hut, ist eine reine GUI-Anwendung.
Bish. Test läuft einwandfrei, einfach ein
im Hauptprog und im aufgerufenen Prog ein
und der entsprechende Core hat 100% Auslastung.
Gute Idee, danke!
Bish. Test läuft einwandfrei, einfach ein
Code: Alles auswählen
runShell("1","Auswert.exe", .t.)
Code: Alles auswählen
SmpSetCPU(nParameter)
Gute Idee, danke!
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>