2009-11-03 35 views
6

Leí en la documentación de Visual C++ que es seguro para múltiples hilos leer desde el mismo objeto.Múltiples hilos y memoria

Mi pregunta es: ¿cómo maneja esto una CPU X86-64 con varios núcleos?

Digamos que tiene un bloque de memoria de 1 MB. ¿Hay diferentes hilos literalmente capaces de leer exactamente los mismos datos al mismo tiempo o los núcleos pueden leer una palabra a la vez con solo un núcleo permitido para leer una palabra en particular a la vez?

Respuesta

4

No sólo son diferentes núcleos pueden leer desde el mismo bloque de memoria, que se les permita escribir al mismo tiempo también. Si es "seguro" o no, esa es una historia completamente diferente. Necesitas implementar algún tipo de protección en tu código (usualmente hecho con semáforos o derivados de ellos) para protegerse contra múltiples núcleos que luchan por el mismo bloque de memoria de una manera que no permites específicamente.

Acerca del tamaño de la memoria que lee un núcleo a la vez, normalmente es un valor de registro, 32 bits en una CPU de 32 bits, 64 bits para una CPU de 64 bits, etc. Incluso la transmisión se realiza dword por dword (mira memcpy, por ejemplo).

Acerca de cómo son múltiples núcleos concurrentes, cada núcleo utiliza un solo bus para leer y escribir en la memoria, por lo que acceder a cualquier recurso (RAM, dispositivos externos, la unidad de procesamiento de coma flotante) es una solicitud a la vez núcleo a la vez. Sin embargo, el procesamiento real dentro del núcleo es completamente concurrente. Las transferencias de DMA tampoco bloquean el autobús, las transferencias simultáneas se ponen en cola y se procesan de una en una (creo que no estoy 100% seguro de esto).

editar: solo para aclarar, a diferencia de la otra respuesta aquí, estoy hablando solo de un escenario sin caché. Por supuesto, si la memoria se almacena en caché, el acceso de solo lectura es completamente simultáneo.

+1

Cualquier acceso de memoria tiene realmente un tamaño de línea de caché = 64 bytes para procesadores modernos. El acceso a la línea de caché es atómico. Las líneas pueden ser compartidas por núcleos para leer. – osgx

8

Si realmente no hay escrituras en su bloque de 1MB, sí, cada núcleo puede leer desde su propia línea de caché sin ningún problema ya que no se comprometen escrituras y por lo tanto no surgen problemas de coherencia de caché.

En una arquitectura de múltiples núcleos, básicamente hay una memoria caché para cada núcleo y un "protocolo de coherencia de caché" que invalida la memoria caché en algunos núcleos que no disponen de la información más actualizada. Creo que la mayoría de los procesadores implementan el MOESI protocol para la coherencia de la caché.

La coherencia de la caché es un tema complejo que ha sido ampliamente discutido (me gustan especialmente algunos artículos de Joe Duffy here y here). La discusión, sin embargo, gira en torno a las posibles penalizaciones de rendimiento del código que, aunque parece estar libre de bloqueos, puede ralentizarse debido a que el protocolo de coherencia de caché se activa para mantener la coherencia entre los cachés de los procesadores, pero mientras no haya escrituras simplemente no habrá coherencia para mantener y, por lo tanto, no perder en el rendimiento.

Solo para aclarar, como se dijo en el comentario, la memoria RAM no se puede acceder simultáneamente ya que las arquitecturas x86 y x64 implementan un solo bus que se comparte entre los núcleos con SMP garantizando la equidad accediendo a la memoria principal. No obstante, esta situación está oculta por cada memoria caché principal que permite que cada núcleo tenga su propia copia de los datos. Para 1MB de datos sería posible incurrir en alguna contención mientras el núcleo actualiza su caché, pero eso sería insignificante.

Algunos enlaces útiles:

+0

En general, la respuesta correcta hoy. La RAM en sí no puede soportar múltiples accesos simultáneos, pero esto está efectivamente oculto por cachés. Pero si varios núcleos realizan una lectura no almacenada en caché, estas solicitudes aún deben someterse a arbitraje. – MSalters

Cuestiones relacionadas