AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rechenlast verteilen in Multikern-CPUs

Ein Thema von BloodySmartie · begonnen am 13. Mai 2008 · letzter Beitrag vom 14. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
BloodySmartie
(Gast)

n/a Beiträge
 
#1

Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 16:43
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!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 16:50
Nein, weil alle Threads eines Tasks im selben Adressraum laufen.
Markus Kinzler
  Mit Zitat antworten Zitat
BloodySmartie
(Gast)

n/a Beiträge
 
#3

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 16:52
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 16:56
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).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 17:07
Man kann Threads auf einen bestimmten Prozessorkern zuordnen (siehe hier), aber normalerweise verteilt das OS diese automatisch.
  Mit Zitat antworten Zitat
BloodySmartie
(Gast)

n/a Beiträge
 
#6

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 17:15
Ah, das hört sich vielversprechend an
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 17:20
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 18:33
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.
Max
"Das Ziel ist im Weg!"
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#9

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 18:44
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 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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Rechenlast verteilen in Multikern-CPUs

  Alt 13. Mai 2008, 19:58
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 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