Vor- und Nachteile der CPU-Affinität - Linux, Multithreading, Multicore, Affinität

Angenommen, ich habe eine Anwendung mit mehreren Threads (sagen wir~ 40 Threads), die auf einem Multiprozessorsystem (zB 8 Kerne) mit Linux als Betriebssystem ausgeführt werden, wobei verschiedene Threads im Wesentlichen LWP (Light Weight Processes) sind, die vom Kernel geplant werden.

Was wären die Vorteile / Nachteile der CPU-Affinität? Ob die CPU-Affinität hilft, die Threads für eine Teilmenge von Kernen zu lokalisieren, wodurch Cache-Sharing / Fehlschläge minimiert werden?

Antworten:

3 für die Antwort № 1

Wenn Sie strenge Affinität verwenden, dann eine bestimmteThread muss auf diesem Prozessor (oder Prozessorgruppe) ausgeführt werden. Wenn Sie viele Threads haben, die völlig unabhängig voneinander arbeiten, und sie arbeiten an größeren Speicherbereichen als ein paar Kilobytes, dann ist es unwahrscheinlich, dass Sie viel von der Ausführung auf einem bestimmten Kern profitieren werden - da es durchaus möglich ist, dass die anderen Threads ausgeführt werden auf dieser speziellen CPU würde jeden L1-Cache, und möglicherweise auch L2-Caches hinausgeschmissen haben.Was ist wichtiger für die Performance - Cahce-Inhalt oder "früher laufen"? Sind einige CPUs immer im Leerlauf, oder ist die CPU 100 geladen % auf jedem Kern?

Allerdings wissen nur Sie (bis Sie uns sagen) wasIhre Threads tun. Wie groß ist das "Working Set" (wie viel Speicher - Code und Daten) berühren sie jedes Mal, wenn sie laufen? Wie lange läuft jeder Thread, wenn er ausgeführt wird? Wie ist die Interaktion mit anderen Threads? Verwenden andere Threads gemeinsame Daten mit "diesem" Thread? Wie viel und wie ist das Muster des Teilens?

Die ultimative Antwort lautet schließlich: "Was macht es?renne schneller? "- eine Antwort, die du nur finden kannst, wenn du gute (realistische) Benchmarks hast und die verschiedenen möglichen Optionen ausprobierst. Selbst wenn du uns jede einzelne Zeile Code, Laufzeitmessungen für jeden Thread, etc, usw. gibst, könnten wir nur mache mehr oder weniger ausgeklügelte Vermutungen - bis diese getestet wurden (mit VARYING Nutzungsmustern), ist es fast unmöglich zu wissen.

Im Allgemeinen würde ich vorschlagen, dass viele Threads habenEntweder suggerieren sie, dass jeder Thread nicht sehr beschäftigt ist (CPU-weise), oder du machst das "falsch" ... Mehr Threads sind nicht besser, wenn sie alle flach laufen - besser, um in diesem Fall weniger Threads zu haben. weil sie sich nur bekämpfen werden.


1 für die Antwort № 2

Der Scheduler versucht bereits, Threads auf den gleichen Kernen zu halten und Migrationen zu vermeiden. Dies deutet darauf hin, dass es bei der manuellen Verwaltung der Thread-Affinität wahrscheinlich nicht viel Aufwand gibt, es sei denn,

  • Sie können zeigen, dass der Kernel aus irgendeinem Grund eine schlechte Arbeit für Ihre spezielle Anwendung leistet; oder
  • Es gibt einige spezifische Kenntnisse über Ihre Anwendung, die Sie gut ausnutzen können.

0 für die Antwort № 3

Lokalisieren der Threads zu einer Teilmenge von Kernen, wodurch der Cache minimiert wird teilen / vermisst

Nicht unbedingt, man muss den Cache berücksichtigenWenn zwei oder mehr Threads auf einen gemeinsam genutzten Speicher-Puffer zugreifen und jeder an einen anderen CPU-Kern gebunden ist, müssen ihre Caches synchronisiert werden, wenn ein Thread in eine gemeinsam genutzte Cache-Zeile schreibt, wird ein erheblicher Overhead entstehen, um andere Caches ungültig zu machen.


Am beliebtesten