tecnologia son que procesamiento procesadores multi los c assembly multicore parallel-processing microprocessors

son - ¿Cómo funcionan las vallas de memoria?



que son los procesadores multicore (2)

Necesito comprender vallas de memoria en máquinas multinúcleo. Digamos que tengo este código

Core 1

mov [_x], 1; mov r1, [_y]

Core 2

mov [_y], 1; mov r2, [_x]

Ahora los resultados inesperados sin vallas de memoria serían que tanto r1 como r2 pueden ser 0 después de la ejecución. En mi opinión, para contrarrestar ese problema, deberíamos poner la valla de memoria en ambos códigos, ya que ponerlo a uno solo no resolvería el problema. Algo como lo siguiente ...

Core 1

mov [_x], 1; memory_fence; mov r1, [_y]

Core 2

mov [_y], 1; memory_fence; mov r2, [_x]

¿Es correcto mi entendimiento o todavía me falta algo? Suponga que la arquitectura es x86. Además, ¿alguien me puede decir cómo poner vallas de memoria en un código de C ++?


C ++ 11 ( ISO / IEC 14882: 2011 ) define un modelo de memoria multi-threading-aware. Aunque no conozco ningún compilador que implemente actualmente el nuevo modelo de memoria, C ++ Concurrency in Action de Anthony Williams lo documenta muy bien. Puede consultar el Capítulo 5: El modelo de memoria C ++ y las operaciones sobre tipos atómicos, donde explica las operaciones relajadas y las vallas de memoria. Además, es el autor de la biblioteca de just :: thread que se puede usar hasta que tengamos soporte para el compilador del nuevo estándar. just :: thread es la base de la biblioteca boost :: thread.


Las cercas serializan la operación que delimitan (carga y almacena), es decir, ninguna otra operación puede comenzar hasta que se ejecute la cerca, pero la cerca no se ejecutará hasta que se hayan completado todas las operaciones anteriores. citando intel hace que el significado de esto sea un poco más preciso (tomado de la instrucción MFENCE, página 3-628, Vol. 2A, referencia de Intel Instruction):

Esta operación de serialización garantiza que cada instrucción de carga y almacenamiento que precede a la instrucción MFENCE en orden de programa se vuelve globalmente visible antes de cualquier instrucción load o store que sigue a la instrucción MFENCE.

  1. Se considera que una instrucción de carga se vuelve globalmente visible cuando se determina el valor que se va a cargar en su registro de destino.

Usar vallas en C ++ es complicado (C ++ 11 puede tener semántica de cercado en alguna parte, tal vez alguien más tenga información sobre eso), ya que depende de la plataforma y el compilador. Para x86 usando MSVC o ICC, puede usar _mm_lfence , _mm_sfence y _mm_mfence para cargar, almacenar y cargar + almacenar cercas (tenga en cuenta que algunas de estas son instrucciones de SSE2).

Nota: esto supone una perspectiva de Intel, es decir: una que utiliza un procesador x86 (32 o 64 bits) o IA64