Wie stelle ich die Prozessoraffinität unter OS X ein?

17

Festlegen der Prozessoraffinität in Snow Leopard auf einem MacBook Pro Ich weiß, dass Sie unter Windows die Prozessoraffinität einfach im Task-Manager ändern können.

Troggy
quelle
2
<snarky-comment> Führen Sie OS X in einer virtuellen Maschine aus und legen Sie die Affinität der virtuellen Maschine fest. </ snarky-comment>
zildjohn01
Warum würdest du das tun wollen? Es ist im Allgemeinen eine schlechte Idee, es sei denn, Sie versuchen, alte Programme zum Laufen zu bringen, die so schlecht codiert sind, dass sie auf Multicore-Systemen nicht mehr funktionieren.
6.
2
@jalf: Prozessoraffinität kann die Leistung verbessern, da sie in einigen Fällen die Cache-Ungültigkeit und den Papierkorb verringert.
1
Das ist enttäuschend. Es sieht so aus, als würde der Mac niemals eine ideale Plattform für die Echtzeit-Softwareentwicklung sein.
Evan Plaice
1
@jweyrich Ausnahmen bei CPUs mit QPI (Intels NUMA) wie denen auf dem Mac Pro, bei denen durch Festlegen der CPU-Affinität die Speicheraffinität deaktiviert und die Leistung verringert wird. Dies gilt jedoch nicht für mobile Prozessoren.
Jano

Antworten:

14

OS X unterstützt seit Version 10.5 eine Thread-Affinitäts-API . Hier ist relevantes Material von der Webseite, auf die ich verlinkt habe.

Affinitäts-Set

Ein Affinitätssatz ist eine Sammlung von Threads, die gemeinsam Speicherressourcen nutzen und einen L2-Cache gemeinsam nutzen möchten. Unterschiedliche Affinitätssätze stellen separate Affinitäten dar. Das heißt, Threads, die zu einem anderen Satz gehören, sollten einen separaten L2-Cache verwenden und daher auf einem anderen logischen Prozessor ausgeführt werden.

Ein Affinitätssatz ist durch ein "Tag" gekennzeichnet. Threads werden einem bestimmten Affinitätssatz zugewiesen, indem dieser das Tag zugewiesen wird, das diesen Satz identifiziert. Ein Thread kann höchstens einem Affinitätssatz angehören. Das heißt, es hat ein Affinitäts-Tag.

Effekt des Setzens von Distinct Affinity Tags

Beispielsweise würde eine Anwendung, die 2 Threads in separaten L2-Caches ausführen möchte, die Threads mit unterschiedlichen Affinitäts-Tags festlegen. Auf einem Dual-Core-Computer wird diese Affinität effektiv ignoriert. Auf einem 4-Core-MacPro versucht der Scheduler jedoch, Threads auf separaten Paketen auszuführen. In ähnlicher Weise versucht der Scheduler auf einem 8-Core-MacPro, diese Threads auf separaten Dies auszuführen (die sich möglicherweise in demselben physischen CPU-Paket befinden oder nicht).

Beispielanwendung

Eine Anwendung, die einen Thread auf jedem verfügbaren Prozessor platzieren möchte, würde Folgendes tun:

  • Ermitteln Sie die Anzahl der Prozessoren im System mit sysctl (3).
  • Erstellen Sie diese Anzahl von Threads.
  • Stellen Sie jeden Thread mit einem eigenen Affinitäts-Tag ein.
  • Starten Sie alle Threads.

Threads mit Standard-Affinitätsrichtlinie werden auf jedem Prozessor freier geplant. Diese Threads werden bevorzugt migriert, um auf einem inaktiven Prozessor ausgeführt zu werden. Threads mit Affinitäts-Tags bleiben in der Regel an Ort und Stelle.

In der Quelle finden Sie Codeauflistungen sowie Informationen zum Teilen von Affinitätstags zwischen übergeordneten und untergeordneten Prozessen, zum Abrufen der CPU-Cache-Konfiguration und vieles mehr.

Leerzeiger
quelle
Gibt es zusätzlich zu dieser API ein Befehlszeilendienstprogramm?
Victor Eijkhout
11

http://developer.apple.com/mac/library/releasenotes/Performance/RN-AffinityAPI/

Mac OS X exportiert keine Schnittstellen, die Prozessoren identifizieren oder die Platzierung von Threads steuern. Eine explizite Bindung von Threads an Prozessoren wird nicht unterstützt . Stattdessen verwaltet der Kernel die gesamte Thread-Platzierung. Anwendungen erwarten, dass der Scheduler unter den meisten Umständen seine Threads mit einer guten Prozessorplatzierung in Bezug auf die Cache-Affinität ausführt.

ta.speot.is
quelle
2
OS X unterstützt seit Version 10.5 eine Thread-Affinitäts-API. Siehe meine Antwort für Details.
Storno-Zeiger
4

Bisher implementiert der XNU-Scheduler (1504.3.12) keine Prozessoraffinität für Prozesse oder Threads.

Daher bietet MacOSX keine Möglichkeit, dies zu tun.

jweyrich
quelle
2

Von http://images.apple.com/macosx/docs/OSX_for_UNIX_Users_TB_July2011.pdf

• Effiziente Kernel-Threads. Jeder POSIX-Thread wird auf einer bestimmten CPU in die Warteschlange gestellt, wodurch die Prozessoraffinität und Skalierbarkeit verbessert und gleichzeitig Sperrenkonflikte verringert werden. Die Threads entsprechen POSIX (1c), einschließlich der Unterstützung für die Löschung und gemeinsame Mutexe.

Für mich sieht es so aus, als würde meine iMac-Version von Lion dies die meiste Zeit respektieren, aber es wird kein Prozess auf den Punkt gebracht.

Ich konnte ohnehin keine API zur Steuerung der Prozessaffinität für Darwin finden.

Alan Baldo
quelle