2009-07-09 10 views
1

Dies ist eine etwas allgemeine Frage. Angenommen, ich erstelle eine einfache Anwendung in Java oder VC++, die zwei Threads erstellt und die Anwendung in einem Multicore-System ausführt. Ohne eine bestimmte Direktive für welchen Kern zu laufen, wird die Anwendung selbst die Threads über verschiedene Kerne verteilen?Multithread-Anwendung in einem Multicore-Prozessor

Danke.

Antwort

8

Die Anwendung wird die Threads nicht verteilen, aber das Betriebssystem wird. Das ist seine Aufgabe. :)

Es ist interessant zu beachten, dass Threads ziemlich häufig im Verlauf eines einzelnen laufenden Prozesses zwischen Kernen austauschen können, aufgrund anderer Lasten und Interrupts, die einen CPU-Kern treffen können.

Wenn Sie entscheiden, dass Sie den Kern angeben müssen, auf dem ein bestimmter Thread ausgeführt werden kann, stellt das Betriebssystem im Allgemeinen einen Mechanismus bereit, der die "Affinität" des Threads zu einer bestimmten CPU festlegt. Dies kann in fortgeschrittenen Optimierungsszenarien wertvoll sein, um den Cache eines bestimmten Threads, z.B. Es wird jedoch im Allgemeinen nicht benötigt.

3

Das Betriebssystem weist Prozesse und Threads verschiedenen Cores zu. Das soll nicht heißen, dass Sie die Entscheidung nicht beeinflussen können, einige Betriebssysteme erlauben Ihnen eine gewisse Kontrolle darüber. Prozesse können sich auch zwischen Kernen bewegen, um eine gute Auslastung der Kerne zu gewährleisten.

1

Sie können dies mit SetThreadIdealProcessor und zugehörigen API-Aufrufen auf Windows tun:

http://msdn.microsoft.com/en-us/library/ms684251(VS.85).aspx

Wenn Ihre Themen sind jeweils eine Menge von Ressourcen fordern dann würden Sie das Betriebssystem erwarten, dass sie über die zur Verfügung stehenden Kerne zu verteilen.

Ich würde ein wenig vorsichtig sein, mit der Thread-Affinität zu verwirren, da Sie effektiv den Scheduler des Betriebssystems erraten. Beispielsweise können Sie Ihre Anwendung weniger reaktionsfähig machen, aber Threads so planen, dass sie mit dem primären UInthread Ihrer Anwendung konkurrieren.

Ich gehe normalerweise Dinge in der folgenden Reihenfolge mit Hilfe eines Profiler und einigen festen Anwendungsbenchmarks so dass ich verschiedene Ansätze

  1. Der Algorithmus
  2. Der Algorithmus vergleichen kann - ernsthaft! Bevor Sie an etwas anderes denken, machen Sie sich Gedanken über den Algorithmus.
  3. Compiler-Switches - Haben Sie alle Optimierungen für Ihren Release-Build aktiviert?
  4. Compiler-Hinweise - Stellen Sie sicher, dass Ihr Code dem Compiler so viele Informationen wie möglich gibt, damit er ihn optimieren kann. Zum Beispiel verwenden Sie Zeiger oder andere Mechanismen, die der Compiler nicht raten kann.
  5. Caching, Gewinde Affinität usw.

Ade