Pregunta

Sé que las CPU modernas pueden ejecutar fuera de servicio, sin embargo, siempre retiran los resultados en orden, como lo describe Wikipedia.

"Los procesadores fuera de Oder llenan estas" ranuras "a tiempo con otras instrucciones que están listas, Luego reordene los resultados al final para que parezca que las instrucciones se procesaron como normales."

Ahora se dice que las cercas de memoria son necesarias cuando se usan plataformas multinúcleo, porque debido a la ejecución fuera de pedido, valor incorrecto de X se puede imprimir aquí.

Processor #1:
 while f == 0
  ;
 print x; // x might not be 42 here

Processor #2:
 x = 42;
 // Memory fence required here
 f = 1

Ahora mi pregunta es, ya que los procesadores fuera de orden (núcleos en caso de procesadores multinúcleo que supongo) siempre retiran los resultados en orden, entonces cuál es la necesidad de las cercas de memoria. ¿Los núcleos de un procesador multinúcleo no ven los resultados retirados de otros núcleos o también ven resultados que están en vuelo?

Quiero decir en el ejemplo que di arriba, cuando el procesador 2 eventualmente retirará los resultados, el resultado de X Debería venir antes F, ¿Correcto? Sé que durante la ejecución fuera de pedido podría haber modificado F antes de X Pero no debe haberlo retirado antes X, ¿Correcto?

Ahora, con el retiro de resultados en orden y el mecanismo de coherencia de caché, ¿por qué necesitaría vallas de memoria en X86?

¿Fue útil?

Solución

Este tutorial explica los problemas: http://www.hpl.hp.com/techreports/compaq-dec/wrl-95-7.pdf

FWIW, donde los problemas de ordenamiento de memoria ocurren en los procesadores modernos X86, la razón es que, si bien el modelo de consistencia de memoria X86 ofrece una consistencia bastante fuerte, se necesitan barreras explícitas para manejar la consistencia de lectura después de la escritura. Esto se debe a algo llamado "búfer de tienda".

Es decir, X86 es secuencialmente consistente (agradable y fácil de razonar), excepto que las cargas pueden reordenarse las tiendas WRT anteriores. Es decir, si el procesador ejecuta la secuencia

store x
load y

Luego, en el bus del procesador, esto puede verse como

load y
store x

La razón de este comportamiento es el búfer de la tienda mencionado anteriormente, que es un pequeño búfer para las escrituras antes de que salgan al autobús del sistema. La latencia de carga es, OTOH, un problema crítico para el rendimiento y, por lo tanto, las cargas pueden "saltar la cola".

Ver Sección 8.2 en http://download.intel.com/design/processor/manuals/253668.pdf

Otros consejos

La cerca de memoria asegura que todos los cambios en las variables antes de la cerca sean visibles para todos los demás núcleos, de modo que todos los núcleos tengan una vista actualizada de los datos.

Si no pone una cerca de memoria, los núcleos podrían estar trabajando con datos incorrectos, esto se puede ver especialmente en escenarios, donde múltiples núcleos estarían trabajando en los mismos conjuntos de datos. En este caso, puede asegurarse de que cuando la CPU 0 haya realizado alguna acción, que todos los cambios realizados en el conjunto de datos ahora sean visibles para todos los demás núcleos, que luego pueden trabajar con información actualizada.

Algunas arquitecturas, incluida la ubicua X86/X64, proporcionan varias instrucciones de barrera de memoria, incluidas una instrucción a veces llamada "valla completa". Una cerca completa asegura que todas las operaciones de carga y almacenamiento antes de la cerca se habrán cometido antes de las cargas y tiendas emitidas después de la cerca.

Si un núcleo comenzara a trabajar con datos obsoletos en el conjunto de datos, ¿cómo podría obtener los resultados correctos? No podría importar si el resultado final se presentara como si todo se hizo en el orden correcto.

La clave está en el búfer de la tienda, que se encuentra entre el caché y la CPU, y hace esto:

Almacenar búfer invisible a CPU remotas

El búfer de almacenamiento permite guardar escrituras en memoria y/o cachés para optimizar los accesos de interconexión

Eso significa que las cosas se escribirán en este búfer, y luego, en algún momento, se escribirá el búfer en el caché. Por lo tanto, el caché podría contener una vista de los datos que no es el más reciente y, por lo tanto, otra CPU, a través de la coherencia de caché, tampoco tendrá los últimos datos. Es necesario un descarga de búfer de tienda para que los datos más recientes sean visibles, creo que es esencialmente lo que la cerca de memoria hará que suceda a nivel de hardware.

EDITAR:

Para el código que usó como ejemplo, Wikipedia dice esto:

Se puede insertar una barrera de memoria antes de la asignación del procesador #2 a F para garantizar que el nuevo valor de X sea visible para otros procesadores en o antes del cambio en el valor de f.

Solo para hacer explícito lo que está implícito en las respuestas anteriores, esto es correcto, pero es distinto de los accesos de memoria:

Las CPU pueden ejecutar fuera de servicio, sin embargo, siempre retiran los resultados en orden

La jubilación de la instrucción está separada de realizar el acceso a la memoria, el acceso a la memoria puede completarse en un momento diferente a la jubilación de instrucciones.

Cada núcleo actuará como si sus propios accesos de memoria ocurran en la jubilación, pero otros núcleos pueden ver esos accesos en diferentes momentos.

(En X86 y ARM, creo que solo las tiendas están observablemente sujetas a esto, pero por ejemplo, Alpha puede cargar un valor antiguo de la memoria. X86 SSE2 tiene instrucciones con guarentes más débiles que el comportamiento X86 normal).

PD. De memoria, la roca Sparc abandonada podría retirarse fuera de pedido, gastó el poder y los transistores determinando cuándo fue inofensivo. Se abandonó debido al consumo de energía y al recuento de transistores ... No creo que se haya comprado ninguna CPU de propósito general para el mercado con jubilación fuera de orden.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top