Comment définir l'affinité du processeur sur OS X?

17

Comment définir l'affinité du processeur dans Snow Leopard sur un MacBook Pro? Je sais que dans Windows, vous pouvez simplement le basculer dans le Gestionnaire des tâches.

Troggy
la source
2
<snarky-comment> Exécutez OS X sur une machine virtuelle et définissez l'affinité de la machine virtuelle </snarky-comment>
zildjohn01
Pourquoi voudriez-vous faire ça? C'est généralement une mauvaise idée, sauf si vous essayez de faire fonctionner d'anciens programmes qui sont si mal codés qu'ils se brisent sur les systèmes multicœurs.
2010
2
@jalf: l'affinité du processeur peut améliorer les performances car elle réduit l'invalidation du cache et la corbeille dans certains cas.
1
C'est décevant. Il semble que Mac ne sera jamais une plate-forme idéale pour le développement de logiciels en temps réel.
Evan Plaice
1
@jweyrich Exceptions dans les processeurs avec QPI (NUMA d'Intel) comme ceux du Mac Pro, où le réglage de l'affinité du processeur désactive l'affinité de la mémoire et diminue les performances. Cela ne s'applique cependant pas aux processeurs mobiles.
Jano

Réponses:

14

OS X prend en charge une API d'affinité de thread depuis la version 10.5. Voici quelques éléments pertinents de la page Web à laquelle j'ai lié.

Ensemble d'affinité

Un ensemble d'affinités est une collection de threads qui partagent des ressources mémoire et souhaitent partager un cache L2. Des ensembles d'affinités distincts représentent des affinités distinctes, c'est-à-dire que les threads appartenant à un ensemble différent doivent utiliser un cache L2 distinct et donc être exécutés sur des processeurs logiques différents.

Un ensemble d'affinité est identifié par une "étiquette". Les threads sont affectés à un ensemble d'affinités particulier en lui attribuant la balise identifiant cet ensemble. Un thread peut appartenir à au plus un ensemble d'affinités; c'est-à-dire qu'il a une balise d'affinité.

Effet de la définition de balises d'affinité distinctes

Par exemple, une application souhaitant exécuter 2 threads sur des caches L2 distincts définirait les threads avec des balises d'affinité différentes. Sur une machine à double cœur, cette affinité sera effectivement ignorée. Cependant, sur un MacPro 4 cœurs, le planificateur tentera d'exécuter des threads sur des packages distincts. De même, sur un MacPro à 8 cœurs, le planificateur tentera d'exécuter ces threads sur des matrices distinctes (qui peuvent ou non être dans le même package CPU physique).

Exemple d'utilisation

Une application qui souhaite placer un thread sur chaque processeur disponible ferait ce qui suit:

  • Obtenez le nombre de processeurs sur le système à l'aide de sysctl (3).
  • Créez ce nombre de threads.
  • Définissez chaque thread avec une balise d'affinité distincte.
  • Démarrez tous les threads.

Les threads avec une politique d'affinité par défaut seront planifiés plus librement sur n'importe quel processeur. Ces threads seront préférentiellement migrés pour s'exécuter sur un processeur inactif. Les discussions avec des balises d'affinité auront tendance à rester en place.

Consultez la source pour les listes de codes et des informations sur le partage de balises d'affinité entre les processus parent et enfant, l'obtention de la configuration du cache du processeur, etc.

pointeur vide
la source
Existe-t-il un utilitaire de ligne de commande, en plus de cette API?
Victor Eijkhout
11

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

Mac OS X n'exporte pas les interfaces qui identifient les processeurs ou contrôlent le placement des threads - la liaison explicite du thread au processeur n'est pas prise en charge . Au lieu de cela, le noyau gère tout le placement des threads. Les applications s'attendent à ce que le planificateur exécute, dans la plupart des cas, ses threads en utilisant un bon placement de processeur en ce qui concerne l'affinité du cache.

ta.speot.is
la source
2
OS X prend en charge une API d'affinité de thread depuis la version 10.5. Voir ma réponse pour plus de détails.
void-pointer
4

Jusqu'à présent, le planificateur XNU (1504.3.12) n'implémente pas d'affinité de processeur pour les processus ni les threads.

MacOSX ne fournit donc aucun moyen de le faire.

jweyrich
la source
2

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

• Fils de noyau efficaces. Chaque thread POSIX est mis en file d'attente sur un processeur particulier, améliorant l'affinité et l'évolutivité du processeur tout en réduisant les conflits de verrouillage. Les threads sont conformes à POSIX (1c), y compris la prise en charge de l'annulation et des mutex partagés.

Cela ressemble à une annonce pour moi, mon iMac exécutant Lion cherche à respecter cela la plupart du temps, mais il n'épingle pas un processus à un noyau.

De toute façon, je n'ai trouvé aucune API pour contrôler l'affinité des processus pour Darwin.

Alan Baldo
la source