Fortran unter Windows: Wie Programm sagen, welcher Kern genutzt werden soll?

DerVonNebenan

Captain Special
Mitglied seit
20.08.2011
Beiträge
233
Renomée
1
Hallo,

wie sage ich einem Fortran Programm, welchen CPU - Kern verwendet werden soll? Gibt es hierbei eine bestimmte Eingabe, die es ermöglicht, zu Begin bei der Ausführung des Programmes zu sagen, welcher Kern für die Berechnungen genutzt werden soll? Speziell habe ich das Problem unter Windows, dass mein Hexa-Core CPU beim Start des Programms die Berechnung auf alle sechs vorhanden CPU´s auslagert.
Ich kann zwar im Taskmanager dann das Programm auf einen bestimmten Kern manuell auslagern. Auf die Dauer gesehen geht es aber schon an die Nerven.

LG

edit: Oder sucht sich das Programm automatisch einen Kern aus. Genutzt wird neuerdings PGI Fortran für Windows Systeme.
 
Zuletzt bearbeitet:
Speziell habe ich das Problem unter Windows, dass mein Hexa-Core CPU beim Start des Programms die Berechnung auf alle sechs vorhanden CPU´s auslagert.

[...]

edit: Oder sucht sich das Programm automatisch einen Kern aus.
Logisch. Es werden - sofern die Software kein Multithreading unterstützt - alle verfügbaren Kerne gleichmäßig (sprich: gleichmäßig schlecht) belastet. Hat die Software nur einen rechnenden Thread, so wird dieser zwischen allen Kernen hin- und hergeschoben, um die Auslastung auszubalancieren. Die Software sucht sich dabei gar nichts aus sondern der Windows-Kernel oder genauer gesagt der Scheduler verteilt die Aufgaben auf die verfügbaren Resourcen.

Normalerweise gibt es keinen Grund, die automatische Vergabe zu ändern. Manchmal ist es aber dennoch nützlich, weil eine Software ausgebremst wird oder um Turbo-Modi der CPUs ausnutzen zu können. Dafür gibt es entsprechende WinAPI-Funktionen GetProcessAffinityMask und SetProcessAffinityMask. Ich habe diese Funktionen in einem meiner Delphi-Programme benutzt, das genau dafür da ist:automatische Zuweisung von Affinitäten an bestimmte Prozesse. Ob und wie die in Fortran zu benutzen sind: *noahnung*.

MfG Dalai
 
Hallo,

erstmal vielen Dank. Habe mal ein bisschen im Netz gelesen. Dabei habe ich gelesen, dass wohl die neuen Absoft und PGI Fortran Compiler in der Lage sind -soweit wie ich verstanden habe-, die Quellcodes automatisch zu Parallisieren.
In wie weit ich das richtig verstanden habe, muss ich morgen nochmal genau nachforschen.

LG
 
Dabei habe ich gelesen, dass wohl die neuen Absoft und PGI Fortran Compiler in der Lage sind -soweit wie ich verstanden habe-, die Quellcodes automatisch zu Parallisieren.
Dafür müssen sie Threads erzeugen. Ich glaube nicht so recht dran, dass das automatisch geht, irgendeinen Anstoß braucht der Compiler sicher dafür. Aber das überlass ich dir ;D.

MfG Dalai
 
Diese Optimierungen erfordern aber bestimmte Voraussetzungen, die in manchem Programm vorkommen und in manchem nicht.

Wenn du ein Multi-threaded-Programm haben willst, dann solltest du auch eines schreiben, sprich Threads erzeugen und Gedanken über die parallele Abarbeitung machen.
Der Compiler wird mit Sicherheit nicht deine Programmlogik über den Haufen werfen und neu codieren. ;)
 
Wenn du ein Multi-threaded-Programm haben willst, dann solltest du auch eines schreiben, sprich Threads erzeugen und Gedanken über die parallele Abarbeitung machen.
Der Compiler wird mit Sicherheit nicht deine Programmlogik über den Haufen werfen und neu codieren. ;)
Wenn du per Hand parallelisierst, wird das der Compiler nicht umstoßen. Schreibst du sequentiellen Code, lässt sich das in bestimmten Ausmaßen durchaus automatisch parallelisieren. Gerade Fortran sollte da gute Voraussetzungen bieten. Mit OpenMP lässt sich das sogar recht bequem steuern.
 
Hat die Software nur einen rechnenden Thread, so wird dieser zwischen allen Kernen hin- und hergeschoben, um die Auslastung auszubalancieren. Die Software sucht sich dabei gar nichts aus sondern der Windows-Kernel oder genauer gesagt der Scheduler verteilt die Aufgaben auf die verfügbaren Resourcen.

Das ist im Prinzip richtig, kommt aber auf die Implementierung an. Ab Windows NT (also auch Vista und 7) wird nach dem Multilevel Feedback Queue geschedult (Ausnahme: Bulldozer CPU mit entsprechendem Patch, dort wurden soweit ich weiß zwei Scheduler implementiert und erst wenn der erste Scheduler voll ist wird der zweite genutzt (was das Umschalten der Module verhindern soll)
http://en.wikipedia.org/wiki/Multilevel_feedback_queue

Vielleicht kannst du aber über den Time Stamp Counter was beeinflussen:
http://en.wikipedia.org/wiki/Time_Stamp_Counter bzw. den QueryPerformanceCounter http://www.ccsl.carleton.ca/~jamuir/rdtscpm1.pdf


EDIT :
.

Und wenn du nicht parallelisieren kannst, dann lass einfach das Fortran Programm x-Mal parallel laufen und führe die Ergebnisse hinterher zusammen (sofern das geht).

Habe ich z.B. schon geamcht um eine sehr umfangreiche Simulation quick-and-dirty per Perl-Script auf X Cores von Y Rechnern zu verteilen.
 
Zuletzt bearbeitet:
Wenn du per Hand parallelisierst, wird das der Compiler nicht umstoßen. Schreibst du sequentiellen Code, lässt sich das in bestimmten Ausmaßen durchaus automatisch parallelisieren. Gerade Fortran sollte da gute Voraussetzungen bieten. Mit OpenMP lässt sich das sogar recht bequem steuern.
Was sind für dich "bestimmte Ausmaße"?
Gibts Messungen oder sowas dazu (aus Neugier, finde ich interessant, obwohl ich nach wie vor sehr skeptisch bin)?
 
Was sind für dich "bestimmte Ausmaße"?
Wenn zum Beispiel in einem Programm in zwei Schleifen zwei voneinander unabhängige Werte berechnet werden, lässt sich das automatisiert in zwei Threads verpacken. Wie gesagt, mit OpenMP gibts dafür auch eine Beschreibung, mit der man den (OpenMP-fähigen) Compiler darauf hinweisen kann. Das läuft in die ähnliche Richtung wie Autovektorisierung. Und die funktioniert auch vollkommen unabhängig.

Gibts Messungen oder sowas dazu (aus Neugier, finde ich interessant, obwohl ich nach wie vor sehr skeptisch bin)?
Da gibts richtig Metriken zu. Hab ich jetzt aber nicht zur Hand, weil schon viel zu lange nicht mehr mit beschäftigt. Da gibts aber richtig Forschungsfelder zu, wie für Multicore-Systeme möglichst automatisch paralleler Code erstellt werden kann. Intel nimmt da auch richtig viel Geld in die Hand, um die Entwickler zu unterstützen.
 
Zurück
Oben Unten