2011-09-10 14 views
5

Digamos que un subproceso en un núcleo está girando sobre una variable que se actualizará mediante un subproceso que se ejecuta en otro núcleo. Mi pregunta es qué es la sobrecarga en el nivel de caché. ¿El hilo de espera almacena en caché la variable y, por lo tanto, no causa ningún tráfico en el bus hasta que el hilo de escritura escribe en esa variable?Sobrecarga de Spin Loop en términos de coherencia de caché

¿Cómo se puede reducir esta sobrecarga? ¿Ayuda la instrucción x86 pause?

+0

Supongo que se está refiriendo a SMP? –

+0

Sí Eli, me refiero a los sistemas SMP. – MetallicPriest

Respuesta

3

Creo que todas las CPU modernas x86 utilizan el MESI protocol. Por lo tanto, es probable que el hilo que gira "lector" tenga una copia en caché de los datos en modo "exclusivo" o "compartido", sin generar tráfico de bus de memoria mientras gira.

Es solo cuando el otro núcleo escribe en la ubicación que tendrá que realizar la comunicación entre núcleos.

[Actualización]

A "spinlock" como esto es sólo una buena idea si usted no estará girando por mucho tiempo. Si puede pasar un tiempo antes de que la variable se actualice, use una variable de condición mutex + en su lugar, que pondrá el hilo en modo de suspensión para que no agregue ninguna sobrecarga mientras espera.

(Por cierto, sospecho que mucha gente - incluyendo mí - se preguntan "¿qué está en realidad tratando de hacer?")

+0

"Creo que todas las CPU modernas x86 usan el protocolo MESI". ¿Por qué crees en ello? Creo que AMD64 es MOESI, intel numa (i *) es MESIF. – osgx

+0

@osgx: ¿Porque la última vez que leí sobre eso fue hace 5-10 años? No creo que cambie la respuesta básica, pero gracias por la información. – Nemo

1

Si gira el bloqueo por intervalos cortos, por lo general está bien. Sin embargo, hay una interrupción de temporizador en Linux (y supongo que es similar en otros sistemas operativos) por lo que si activa el bloqueo durante 10 ms o cerca de él, verá una alteración de la memoria caché.

He oído que es posible modificar el kernel de Linux para evitar todas las interrupciones en núcleos específicos y esta perturbación desaparece, pero no sé lo que implica hacer esto.

+0

Creo que RHEL 5 permitió [enlazar IRQ] (http://rt.et.redhat.com/wiki/index.php?title=RHEL-RT_AffinityHowto&printable=yes#IRQ_.28interrupt.29_binding) a través de una aplicación de línea de comandos. –

+0

Es cierto, pero las "interrupciones del temporizador local" no se pueden mover ya que interrumpe alguna vez el hilo a un mínimo de 100 veces por segundo. (Se puede configurar más alto) Si sabes cómo desactivarlo, estaría muy interesado. ;) –

0

En el caso de dos hilos de la sobrecarga puede ser ignorada, de todos modos podría ser una buena idea hacer un punto de referencia simple. Por ejemplo, si implementa spinlocks, cuánto tiempo pasa el hilo en el giro. Este efecto en la caché se llama línea de caché que rebota.

0

He probado esto ampliamente en this post. La sobrecarga en general es generada por el componente de bloqueo de bus del spinlock, generalmente la instrucción "xchg reg, mem" o alguna variante de este. Como no se puede evitar esa sobrecarga en particular, tiene la opción de economizar en la frecuencia con la que invoca el spinlock y realiza la cantidad mínima absoluta de trabajo necesaria, una vez que el bloqueo está en su lugar, antes de soltarlo.

Cuestiones relacionadas