Affinity es el mapeo entre hilos de software y hardware: puede tener 8 hilos y 8 núcleos, pero el mapeo entre ellos es variable.
El problema es que el sistema operativo puede migrar hilos. Por lo tanto, si no establece afinidad, pueden suceder dos cosas malas:
- un hilo puede moverse a un núcleo diferente, perdiendo así el contenido de su caché
- dos hilos pueden terminar en el mismo núcleo, dejando otro núcleo sin usar.
La afinidad se expresa como una “máscara” que describe dónde se puede ejecutar un subproceso. Por ejemplo, puede vincular un subproceso (de software) a un subproceso de hardware, un núcleo (lo que significa que puede elegir o migrar entre subprocesos de hardware), un socket (que le da todos los núcleos de ese chip procesador) o ninguno. De puede especificar un conjunto de estos, como todos los núcleos impares …
- ¿Por qué la pantalla de mi computadora portátil se vuelve negra después del BIOS?
- ¿Cuál es el valor de depreciación de una computadora portátil HP 15-ay112ne?
- ¿Qué es mejor, un Core i5 6300HQ o un Core i7 7500U?
- ¿Por qué los aspectos de diseño hacen que el AMD FX-8370 funcione peor que el i7-6700k?
- ¿Cuál debo elegir HP o Dell? ¿Y qué computadora portátil de esa compañía debo comprar?
Si establecer afinidad y cómo establecerlo, generalmente es una función de su aplicación. Si tiene 4 hilos y 8 núcleos en 2 zócalos:
- puede asignarles [0-x-1-x] [2-x-3-x] con los corchetes que indican los sockets. Esta es una buena solución si su aplicación usa mucho ancho de banda y poca reutilización de caché.
- puede asignarles [0–1–2–3] [xxxx]. Esta es una mejor solución si la aplicación está vinculada al cómputo y los núcleos necesitan compartir muchos datos de caché. (¡Esto reduce al menos 20ns de su latencia de coherencia!) No es bueno para las aplicaciones vinculadas al ancho de banda, ya que los cuatro hilos ahora están luchando por el ancho de banda de un solo socket.
Si tiene hilos de hardware, el problema de afinidad se vuelve aún más interesante: con 8 hilos en 4 núcleos y dos hilos de hardware por núcleo:
- puede asignarlos [0–1] [2–3] [4–5] [6–7], o
- puede asignarlos [0–4] [1–5] [2–6] [3–7]
La primera opción tiene más sentido, la mayoría de las veces, pero también podrías probar la otra. Puede que tenga sentido para su aplicación.
Si está tratando de entender la afinidad, realmente necesita la herramienta “hwloc”. Localidad de hardware portátil (hwloc) Puede generar imágenes detalladas de cómo está organizado su procesador. Ejemplo:
Esta es una configuración de dos sockets con L3 compartido por socket y L2 / L1 compartido entre los hilos de hardware en un solo núcleo. Si quieres minimizar el tráfico de coherencia, ¡es mejor que lo sepas! (Además, si es más probable que algunos de sus subprocesos hablen con el PCI, los quiere en el zócalo uno, no en el cero). (Nota personal: he estado imprimiendo el equivalente al anterior en tamaño de póster para el Desembarco del Caballero. Con 4 dominios numa, 68 núcleos en 34 mosaicos y 272 hilos de hardware, tener una imagen general es la única forma de obtener la imagen general. Por así decirlo).