Pregunta

I leído en la documentación de Visual C ++ que es seguro para múltiples hilos para leer desde el mismo objeto.

Mi pregunta es: ¿cómo hace una CPU con múltiples núcleos x86-64 manejar esto

Supongamos que tiene un bloque de 1 MB de memoria. Son diferentes hilos, literalmente, capaz de leer exactamente los mismos datos al mismo tiempo o qué núcleos leen una palabra a la vez con un solo núcleo permitido leer una palabra en particular a la vez?

¿Fue útil?

Solución

No sólo son diferentes núcleos permitidos para leer desde el mismo bloque de memoria, que se les permita escribir al mismo tiempo también. Si es "seguro" o no, eso es una historia totalmente diferente. Es necesario poner en práctica una especie de guardia en el código (generalmente hecho con semáforos o derivados de ellos) para protegerse de múltiples núcleos que luchan en el mismo bloque de memoria de una manera que no permiten específicamente.

Sobre el tamaño de la memoria lee un núcleo a la vez, eso es por lo general el valor de un registro, 32 bits en una CPU de 32 bits, 64 bits para una CPU de 64 bits y así sucesivamente. Incluso en streaming se realiza por DWORD DWORD (mira establecimiento de memoria, por ejemplo).

Sobre la forma concurrente múltiples núcleos son en realidad, todos los núcleos utiliza un único bus para leer y escribir en la memoria, por lo que el acceso a los recursos (RAM, dispositivos externos, la unidad de procesamiento de punto flotante) es una solicitud a la vez, un núcleo a la vez. El procesamiento real en el interior del núcleo es totalmente concurrente sin embargo. También transferencias de DMA no bloquee el bus, las transferencias simultáneas quedan en cola y se procesan uno a la vez (creo, no es 100% seguro de esto).

editar: sólo para aclarar, a diferencia del otro comentario aquí, estoy hablando sólo de un escenario de no-cache. Por supuesto, si la memoria se almacena en caché el acceso de sólo lectura es completamente concurrente.

Otros consejos

Si no hay realmente escribe en su bloque 1 MB entonces sí, cada núcleo puede leer de su propia línea de caché sin ningún problema, ya que no hay escrituras se cometen 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 de poner en práctica el MOESI protocolo de coherencia de caché.

coherencia de caché es un tema complejo que se ha discutido en gran medida (me gusta especialmente algunos artículos de Joe Duffy aquí y aquí ). La discusión, sin embargo, gira en torno a las posibles penalizaciones en el rendimiento de código que, siendo aparentemente libres de bloqueo, pueden retrasar debido al protocolo de coherencia de caché patadas en mantener una coherencia entre los cachés de los procesadores, pero, siempre y cuando no haya escribe simplemente no hay la coherencia de mantener y por lo tanto no se pierde en el rendimiento.

Solo para aclarar, como se ha dicho en el comentario, RAM no se puede acceder simultáneamente desde x86 y x64 arquitecturas implementan un único bus que se comparte entre los núcleos con SMP garantizar la equidad para acceder a la memoria principal. No obstante esta situación está oculto por cada caché núcleo que permite que cada núcleo tiene su propia copia de los datos. Para 1 MB de datos sería posible incurrir en cierta contención mientras que el núcleo actualizar su caché pero eso sería insignificante.

Algunos enlaces útiles:

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