¿Cómo configurar la afinidad del procesador en OS X?

17

¿Cómo se configura la afinidad del procesador en Snow Leopard en un MacBook Pro? Sé que en Windows puedes cambiarlo en el Administrador de tareas.

Troggy
fuente
1
<snarky-comment> Ejecute OS X en una máquina virtual y configure la afinidad de la máquina virtual </snarky-comment>
zildjohn01
Por qué querrías hacer esto? En general, es una mala idea a menos que esté intentando ejecutar programas antiguos que están tan mal codificados que se rompen en sistemas multinúcleo.
jalf
2
@jalf: la afinidad del procesador puede mejorar el rendimiento, ya que reduce la invalidación de caché y la basura en algunos casos.
1
Eso es decepcionante. Parece que Mac nunca será una plataforma ideal para el desarrollo de software en tiempo real.
Evan Plaice
1
@jweyrich Excepciones en CPU con QPI (Intel NUMA) como las de Mac Pro, donde la configuración de la afinidad de la CPU desactiva la afinidad de la memoria y disminuye el rendimiento. Sin embargo, esto no se aplica a los procesadores móviles.
Jano

Respuestas:

14

OS X ha admitido una API de afinidad de subprocesos desde la versión 10.5. Aquí hay material relevante de la página web a la que me vinculé.

Conjunto de afinidad

Un conjunto de afinidad es una colección de hilos que comparten recursos de memoria y desean compartir un caché L2. Los conjuntos de afinidad distintos representan afinidades separadas, es decir, los subprocesos que pertenecen a un conjunto diferente deben usar un caché L2 separado y, por lo tanto, ejecutarse en procesadores lógicos diferentes.

Un conjunto de afinidad se identifica con una "etiqueta". Los hilos se asignan a un conjunto de afinidad particular asignándole la etiqueta que identifica ese conjunto. Un hilo puede pertenecer como máximo a un conjunto de afinidad; es decir, tiene una etiqueta de afinidad.

Efecto de establecer etiquetas de afinidad distintas

Por ejemplo, una aplicación que desea ejecutar 2 subprocesos en cachés L2 separados establecería los subprocesos con diferentes etiquetas de afinidad. En una máquina de doble núcleo, esta afinidad será efectivamente ignorada. Sin embargo, en una MacPro de 4 núcleos, el planificador intentará ejecutar subprocesos en paquetes separados. Del mismo modo, en una MacPro de 8 núcleos, el planificador intentará ejecutar estos subprocesos en troqueles separados (que pueden o no estar en el mismo paquete de CPU física).

Ejemplo de uso

Una aplicación que quiera colocar un hilo en cada procesador disponible haría lo siguiente:

  • Obtenga el número de procesadores en el sistema usando sysctl (3).
  • Crea esa cantidad de hilos.
  • Establezca cada hilo con una etiqueta de afinidad distinta.
  • Comience todos los hilos.

Los hilos con política de afinidad predeterminada se programarán más libremente en cualquier procesador. Estos hilos se migrarán preferentemente para ejecutarse en un procesador inactivo. Los hilos con etiquetas de afinidad tenderán a permanecer en su lugar.

Consulte la fuente para obtener listas de códigos e información sobre el intercambio de etiquetas de afinidad entre procesos primarios y secundarios, obtener la configuración de caché de la CPU y más.

puntero vacío
fuente
¿Existe una utilidad de línea de comandos, además de esta API?
Victor Eijkhout
11

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

Mac OS X no exporta interfaces que identifiquen procesadores o controlen la colocación de subprocesos; no se admite el enlace explícito de subprocesos a procesadores . En cambio, el núcleo gestiona la colocación de todos los hilos. Las aplicaciones esperan que el planificador, en la mayoría de las circunstancias, ejecute sus subprocesos utilizando una buena ubicación del procesador con respecto a la afinidad de caché.

ta.speot.is
fuente
2
OS X ha admitido una API de afinidad de subprocesos desde la versión 10.5. Vea mi respuesta para más detalles.
void-pointer
4

Hasta ahora, el programador XNU (1504.3.12) no implementa la afinidad del procesador por procesos ni hilos.

Entonces MacOSX no proporciona ningún medio para hacerlo.

jweyrich
fuente
2

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

• Hilos de kernel eficientes. Cada hilo POSIX se pone en cola en una CPU particular, lo que mejora la afinidad y la escalabilidad del procesador al tiempo que reduce la contención de bloqueo. Los subprocesos se ajustan a POSIX (1c), incluido el soporte para cancelación y mutexes compartidos.

Me parece un anuncio, mi iMac corriendo Lion parece respetar eso la mayor parte del tiempo, pero no 'fija' un proceso a un núcleo.

De todos modos, no pude encontrar ninguna API para controlar la afinidad del proceso por Darwin.

Alan Baldo
fuente