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! |
Re: Rechenlast verteilen in Multikern-CPUs
Nein, weil alle Threads eines Tasks im selben Adressraum laufen.
|
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?
|
Re: Rechenlast verteilen in Multikern-CPUs
Zitat:
|
Re: Rechenlast verteilen in Multikern-CPUs
Man kann Threads auf einen bestimmten Prozessorkern zuordnen (siehe hier), aber normalerweise verteilt das OS diese automatisch.
|
Re: Rechenlast verteilen in Multikern-CPUs
Ah, das hört sich vielversprechend an :dancer:
|
Re: Rechenlast verteilen in Multikern-CPUs
Zitat:
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. |
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.
|
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:
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. |
Re: Rechenlast verteilen in Multikern-CPUs
Zitat:
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. |
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