2012-05-24 15 views
6

Estoy escribiendo una aplicación en C++ que necesita leer solo desde la misma memoria muchas veces desde muchos hilos. Mi pregunta es desde un punto de vista del rendimiento será mejor copiar la memoria para cada hilo o darles a todos los hilos el mismo puntero y hacer que todos ellos accedan a la misma memoria.acceso a memoria vs. copia de memoria

Gracias

+1

¿La máquina es NUMA? – Mysticial

+1

La pregunta obvia es: ¿esta memoria es constante mientras se lee o está sujeta a cambios? –

+1

@Mysticial, uno esperaría que todas las arquitecturas manejen de manera eficiente los datos de lectura múltiple, no solo un sistema NUMA. –

Respuesta

6

No hay una respuesta definitiva de la poca información que usted ha dado acerca de su sistema de destino y así sucesivamente, pero en un PC normal, muy probablemente la más rápida será la de no copiar.

Una razón por la cual copiar podría ser lento, es que podría provocar fallas en la memoria caché si el área de datos es grande. Una PC normal almacenaría en caché el acceso de solo lectura a la misma área de datos de manera muy eficiente entre los hilos, incluso si esos hilos se ejecutan en diferentes núcleos.

Uno de los beneficios enumerados explícitamente por Intel para su enfoque al almacenamiento en caché es "Allows more data-sharing opportunities for threads running on separate cores that are sharing cache". Es decir. fomentan una práctica en la que no tienes que programar los hilos para almacenar caché explícitamente los datos, la CPU lo hará por ti.

1

Como usted menciona específicamente muchos hilos, supongo que tiene al menos un sistema de enchufes múltiples. Normalmente, los bancos de memoria están asociados a sockets de procesador. Es decir, un procesador está "más cercano" a sus propios bancos de memoria y necesita comunicarse con los demás controladores de memorandos del procesador para acceder a los datos de otros bancos. (Procesador aquí significa lo físico en el zócalo)

Al asignar datos, normalmente se usa una política de primera escritura para determinar en qué bancos de memoria se asignarán sus datos, lo que significa que puede acceder a él más rápido que el otro procesadores.

Por lo tanto, al menos para múltiples procesadores (no solo para varios núcleos) debería haber una mejora en el rendimiento desde la asignación de una copia al menos para cada procesador. Asegúrese de asignar/copiar los datos con cada procesador/hilo y no desde un hilo maestro (para explotar la política de primera escritura). También debe asegurarse de que los hilos no migrarán entre los procesadores, ya que es probable que pierda la conexión cercana a su memoria.

No estoy seguro de cómo copiar los datos de cada hilo en un único procesador podría afectar el rendimiento, pero creo que no copiar podría mejorar la capacidad de compartir los contenidos de los cachés de nivel superior, que se comparten entre los núcleos.

En cualquier caso, comparta y decida en base a las mediciones reales.

Cuestiones relacionadas