Come impostare l'affinità del processore su OS X?


17

Come si imposta l'affinità del processore in Snow Leopard su un MacBook Pro? So che in Windows potresti semplicemente cambiarlo in Task Manager.


2
<snarky-comment> Esegui OS X in una macchina virtuale e imposta l'affinità della macchina virtuale </snarky-comment>
zildjohn01

Perché vorresti farlo? In genere è una cattiva idea a meno che non si stia tentando di far funzionare vecchi programmi che sono così male codificati da rompersi sui sistemi multicore.
jalf

2
@jalf: l'affinità del processore può migliorare le prestazioni poiché riduce l'invalidazione e il cestino della cache in alcuni casi.

1
È deludente. Sembra che Mac non sarà mai una piattaforma ideale per lo sviluppo di software in tempo reale.
Evan Plaice,

1
@jweyrich Eccetto nelle CPU con QPI (NUMA di Intel) come quelle su Mac Pro, dove l'impostazione dell'affinità della CPU disabilita l'affinità della memoria e diminuisce le prestazioni. Questo non si applica ai processori mobili però.
Jano,

Risposte:


14

OS X supporta un'API di affinità di thread dalla versione 10.5. Ecco del materiale pertinente dalla pagina web a cui ho collegato.

Set di affinità

Un insieme di affinità è una raccolta di thread che condividono risorse di memoria e desiderano condividere una cache L2. I set di affinità distinti rappresentano affinità separate, ovvero i thread appartenenti a un set diverso devono utilizzare una cache L2 separata e quindi essere eseguiti su processori logici diversi.

Un set di affinità è identificato da un "tag". I thread sono assegnati a un determinato set di affinità assegnandogli il tag che identifica quel set. Un thread può appartenere al massimo a un set di affinità; cioè, ha un tag di affinità.

Effetto dell'impostazione di etichette di affinità distinte

Ad esempio, un'applicazione che desidera eseguire 2 thread in cache L2 separate imposta i thread con tag di affinità diversi. Su una macchina dual core, questa affinità verrà effettivamente ignorata. Tuttavia, su una MacPro a 4 core, lo scheduler proverà ad eseguire thread su pacchetti separati. Allo stesso modo, su una MacPro a 8 core, lo scheduler proverà a eseguire questi thread su die separati (che possono o meno essere nello stesso pacchetto di CPU fisica).

Esempio di utilizzo

Un'applicazione che desidera posizionare un thread su ogni processore disponibile farebbe quanto segue:

  • Ottieni il numero di processori sul sistema usando sysctl (3).
  • Crea quel numero di thread.
  • Imposta ogni thread con un tag di affinità distinto.
  • Inizia tutte le discussioni.

I thread con criteri di affinità predefiniti verranno programmati più liberamente su qualsiasi processore. Questi thread verranno migrati preferenzialmente per essere eseguiti su un processore inattivo. I thread con tag di affinità tenderanno a rimanere al loro posto.

Consultare la fonte per elenchi di codice e informazioni sulla condivisione di tag di affinità tra processi padre e figlio, come ottenere la configurazione della cache della CPU e altro ancora.


Esiste un'utilità da riga di comando, oltre a questa API?
Victor Eijkhout,

11

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

Mac OS X non esporta interfacce che identificano i processori o controllano il posizionamento dei thread: il collegamento esplicito tra thread e processori non è supportato . Invece, il kernel gestisce tutto il posizionamento dei thread. Le applicazioni prevedono che lo scheduler, nella maggior parte dei casi, eseguirà i propri thread utilizzando un buon posizionamento del processore rispetto all'affinità della cache.


2
OS X supporta un'API di affinità di thread dalla versione 10.5. Vedi la mia risposta per i dettagli.
void-pointer

4

Fino ad ora, lo scheduler XNU (1504.3.12) non implementava l'affinità del processore per processi o thread.

Quindi MacOSX non fornisce alcun mezzo per farlo.


2

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

• Thread del kernel efficienti. Ogni thread POSIX è messo in coda su una particolare CPU, migliorando l'affinità e la scalabilità del processore riducendo al contempo la contesa tra i blocchi. I thread sono conformi a POSIX (1c), incluso il supporto per la cancellazione e i mutex condivisi.

Mi sembra una pubblicità, il mio iMac con Lion in esecuzione sembra rispettarlo per la maggior parte del tempo, ma non "fissa" un processo su un core.

Non sono riuscito a trovare alcuna API per controllare l'affinità di processo per darwin comunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.