Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rechenlast verteilen in Multikern-CPUs (https://www.delphipraxis.net/113717-rechenlast-verteilen-multikern-cpus.html)

BloodySmartie 13. Mai 2008 15:43


Rechenlast verteilen in Multikern-CPUs
 
Hallo liebe Leute!

Ich hab mal ne Frage: Ich habe per Suchfunktion viele Artikel gefunden, die sich damit beschäftigen, einen Prozess einem bestimmten Prozessorkern zuzuordnen. Kann ich denn meine Rechenlast auch pro Thread an nen bestimmten Kern delegieren? Oder übernimmt das vielleicht das Betriebssystem für mich?

Gibts generell Kniffe, wie ich mit meinen Delphi(Win32)-Anwendungen die Vorteile von Dual/Quad - Core CPUs für mich nutzen kann?

Vielen Dank!

mkinzler 13. Mai 2008 15:50

Re: Rechenlast verteilen in Multikern-CPUs
 
Nein, weil alle Threads eines Tasks im selben Adressraum laufen.

BloodySmartie 13. Mai 2008 15:52

Re: Rechenlast verteilen in Multikern-CPUs
 
Hmm...bedeutet das, dass ich eine rechenlastige Aufgabe nur dann auf beide Kerne verteilen kann, wenn ich quasi ein zweites Programm starte und dann Interprozesskommunikation betreibe?

Bernhard Geyer 13. Mai 2008 15:56

Re: Rechenlast verteilen in Multikern-CPUs
 
Zitat:

Zitat von BloodySmartie
Hmm...bedeutet das, dass ich eine rechenlastige Aufgabe nur dann auf beide Kerne verteilen kann, wenn ich quasi ein zweites Programm starte und dann Interprozesskommunikation betreibe?

Nein. Du mußt nur deine Programmlogik auf Threads (TThread) verteilen können und dabei die "üblichen" Probleme mit Threadgebundene Windows-GDI-Handle lösen. (VCL ist hier nicht Thread-Save).

Phantom1 13. Mai 2008 16:07

Re: Rechenlast verteilen in Multikern-CPUs
 
Man kann Threads auf einen bestimmten Prozessorkern zuordnen (siehe hier), aber normalerweise verteilt das OS diese automatisch.

BloodySmartie 13. Mai 2008 16:15

Re: Rechenlast verteilen in Multikern-CPUs
 
Ah, das hört sich vielversprechend an :dancer:

shmia 13. Mai 2008 16:20

Re: Rechenlast verteilen in Multikern-CPUs
 
Zitat:

Zitat von BloodySmartie
Gibts generell Kniffe, wie ich mit meinen Delphi(Win32)-Anwendungen die Vorteile von Dual/Quad - Core CPUs für mich nutzen kann?

Um die Maschine optimal auszulasten brauchst du pro Prozessorkern mindestens einen Thread.
Mit SetThreadIdealProcessor() sagst du dem OS, auf welchem Prozessorkern der Thread bevorzugt laufen soll.

Rechenlastige Aufgaben sollten nur einen Thread pro Prozessorkern starten.
Bei Aufgaben, bei denn auf Resourcen gewartet wird (z.B. Netzwerk IO), kann man auch mehrere Threads pro Prozessorkern vorsehen. Wenn man zu viele Threads verwendet, geht der Gesamtdurchsatz eher wieder zurück.

everdream 13. Mai 2008 17:33

Re: Rechenlast verteilen in Multikern-CPUs
 
Wenn du dazu noch dafür sorgen willst, dass dein Prozess andere Programme nicht ausbremst, kannst du noch die Prozess/Thread-Prioritätenklasse verändern. Hier ist zu Threads (inkl. mehrkernige Prozessoren) und Priotitäten schon ein wenig diskutiert worden.

Phoenix 13. Mai 2008 17:44

Re: Rechenlast verteilen in Multikern-CPUs
 
Die Antwort von mkinzler ist ein klein wenig daneben. Wahrscheinlich hat er spontan gedacht, Du meinstest Prozessoren und nicht Kerne. Du kannst bei einem echten Multiprozessor-System nicht mal eben einen Thread von einem Prozessor(kern) auf einen Kern eines anderen Prozessors legen, ohne da wirklich derbe zu tricksen. Innerhalb eines Prozessors die Kerne zu switchen ist da recht einfach.

Zitat:

Zitat von BloodySmartie
Gibts generell Kniffe, wie ich mit meinen Delphi(Win32)-Anwendungen die Vorteile von Dual/Quad - Core CPUs für mich nutzen kann?

Eher nein. - Bzw. eher 'Noch (lange) nicht.' Das Problem Multithreading für den Entwickler leichter handlebar zu machen ist kein Triviales.

RemObjects hat mit Oxygèn zwar schon ein bisschen Compilermagic gebaut, die es erlaubt bestimmte Dinge im Code deklarativ asynchron ablaufen zu lassen (das ganze Zeug wie Thread erzeugen und hinterher auf die Fertigstellung des Threads warten und die nötige Synchronisation dafür wird durch den Compiler automatisch generiert), aber das ist ein Einzelfall von Leuten mit coolen Einfällen (und einer wohl recht genialen Compilerarchitektur). Aber selbst das ist kein Allheilmittel für Multithreading.

Bis die Jungs bei Microsoft sowas in ihren C++ / C# Compiler einbauen oder gar Embarcadero (hätten die sich keinen leichter zu schreibenden Namen einfallen lassen können?!?) in eine neue Delphi-Version wird wohl noch ne ganze Stange Zeit ins Land verstreichen.

Der_Unwissende 13. Mai 2008 18:58

Re: Rechenlast verteilen in Multikern-CPUs
 
Zitat:

Zitat von BloodySmartie
Gibts generell Kniffe, wie ich mit meinen Delphi(Win32)-Anwendungen die Vorteile von Dual/Quad - Core CPUs für mich nutzen kann?

Hi,

ich muss sagen, dass mir ein wenig der wichtigste Hinweis fehlt (zumindestens ist der nicht deutlich genug). Der einfachste Kniff um von den Vorteilen von Dual/Quad-Cores und mehreren CPUs usw. zu profitieren besteht in einem OS, dass diese unterstützt. Es ist etwas sehr einfach gedacht, wenn Du jetzt davon ausgehst, dass Du n Prozessoren (bzw. Prozessorkerne) zur Verfügung hast und n rechenintensive Aufgaben, dass Du dann einfach pro Kern einen Thread startest und die Rechenzeit somit minimiert wird (kleiner Overhead ist halt immer nötig).
Schau einfach mal nach wie viele Threads jetzt gerade auf Deinem Rechner laufen und Du wirst schnell merken, dass es immer mehr sind als Du jetzt vereinfacht angenommen hast. Andere interessante Frage, was passiert wenn Du nun zwei Cores und 3 rechenintensive Aufgaben hast?

Das Problem ist eben, dass die manuelle Zuordnung immer nur Dein Programm berücksichtigen kann (und schon das manuell bedeutet dabei fehleranfällig!). Je nachdem was noch auf dem Rechner läuft ist es eben wichtig, dass auch mal ein anderer Thread zum Zuge kommt (z.B. muss ja auch das GUI mal gezeichnet werden, gerade bei rechenintensiven Aufgaben wäre es doch nett, wenn man eine Fortschrittsanzeige hat).

Die Vorteile kannst Du einfach nutzen, in dem Du gut parallelisierbaren Code schreibst. Das ist (wie bereits gesagt wurde) gar nicht so leicht. Gerade wenn Du hier Dinge wie (Sperr-)Synchronisation berücksichtigen musst, kann schnell aus dem Geschwindigkeitsgewinn der Parallelisierung eine klare Geschwindigkeitseinbusse werden (da Synchronisation einfach mal immens viel Zeit kostet). Hast Du also wirklich unabhängige Teilaufgaben, so profitierst Du ganz automatisch von allem was heutige CPUs so zu bieten haben. Hast Du hingegen gar keinen Code, der sich dafür eignet, so solltest Du auch nicht versuchen mit Threads irgendwas zu beschleunigen. Belegst Du mit nur einem Thread auch nur einen Kern, so bleiben die anderen eben auch für andere Applikationen. So kannst Du indirekt auch Zeit gewinnen, wenn z.B. ein Virenscanner für seine Arbeit einen anderen Kern verwendet und somit einfach mehr Rechenzeit für Dein Programm zur Verfügung steht.

Wie gesagt, ist nur ergänzend zu dem schon gesagten (und hier auch zum Teil nur weiter ausführend :-))

Gruß,
Der Unwissende


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz