2012-04-13 9 views
6

Cuando diferentes variables están dentro de la misma línea de caché, puede experimentar False Sharing, lo que significa que incluso si dos subprocesos diferentes (que se ejecutan en diferentes núcleos) acceden a dos variables diferentes, si esas dos variables residen en el misma línea de caché, tendrá éxito de rendimiento, ya que cada coherencia de caché de tiempo se activará.Compartir falsa y variables atómicas

Ahora diga que esas variables son atómicas (por atómico me refiero a variables que introducen una valla de memoria, como atomic<t> de C++), el intercambio de información falsa allí, o no importa si las variables atómicas están en el mismo caché línea o no, ya que supuestamente introducirán coherencia de caché de todos modos. En otras palabras, ¿colocar variables atómicas en la misma línea de caché hace que la aplicación sea más lenta que si no las coloca en la misma línea de caché?

Respuesta

5

Una aclaración: para las consecuencias negativas, al menos algunos accesos a variables "falsamente compartidas" deben escribirse. Si las escrituras son raras, el impacto en el rendimiento del intercambio falso es bastante insignificante; cuanto más escribe (y por lo tanto la línea de caché invalida los mensajes) peor es el rendimiento.

Incluso con atomics, compartir la línea de caché (ya sea falso o verdadero) sigue siendo importante. Busque alguna evidencia aquí: http://www.1024cores.net/home/lock-free-algorithms/first-things-first. Por lo tanto, la respuesta es sí, colocar variables atómicas utilizadas por diferentes subprocesos en la misma línea de caché puede hacer que la aplicación sea más lenta en comparación con ubicarlas en dos líneas diferentes. Sin embargo, creo que pasará desapercibido, a menos que la aplicación invierta una gran parte de su tiempo actualizando estas variables atómicas.

0

pondrá variables atómicas en la misma línea de caché que la aplicación más lenta que no ponerlas en la misma línea de caché?

Falso intercambio de variables "atómicas" podría conducir a problemas de rendimiento (si es o no lo hará ventaja a este tipo de problemas depende de muchas cosas).

Digamos que tiene dos núcleos, A y B, y cada uno opera en su propia variable. Llamemos a estas variables a y b respectivamente.

A tiene a en su caché, y B tiene b en su caché.

Considere lo que sucede cuando A incrementa a.

  • si a y b comparten una línea de caché,B 's copia de b conseguirá invalidado, y su siguiente acceso a b incurrirá en una falta de memoria caché.
  • si a y b no comparten una línea de caché, no hay impacto en B en lo que se refiere a su copia en caché de b.

Esto sucede independientemente de si a y b son "atómicos".

0

Si usa variables atómicas con los requisitos de consistencia más fuertes, una barrera de memoria completa, el efecto de la compartición falsa probablemente no será notorio.Para dicho acceso, la ejecución de una operación atómica está básicamente limitada por la latencia de acceso a la memoria. Así que las cosas son lentas de todos modos, no creo que sean mucho más lentas en presencia de compartir falsamente.

Si tiene otras ordenaciones de memoria menos intrusivas, el rendimiento alcanzado por las propias atómicas puede ser menor, por lo que el impacto de la compartición falsa puede ser significativo.

En total, primero vería el rendimiento de la operación atómica en sí misma antes de preocuparme por la compartición falsa para tales operaciones.

Cuestiones relacionadas