2010-08-06 10 views
8

Escribí una aplicación de subprocesos múltiples para comparar la velocidad de ejecución de LOCK CMPXCHG (ASM x86).Velocidad de ejecución roscada de LOCK CMPXCHG

En mi máquina (dual Core - Core 2), con 2 subprocesos ejecutándose y accediendo a la misma variable, puedo realizar unos 40M ops/segundo.

Luego di a cada hilo una variable única para operar. Obviamente, esto significa que no hay conflicto de bloqueo entre los hilos, así que esperaba un rendimiento de velocidad. Sin embargo, la velocidad no cambió. ¿Por qué?

Respuesta

14

Si usted tiene 2 hilos con acceso simultáneo de datos que está en la misma línea de caché, se obtiene falsa compartición, en donde cada núcleo tiene que mantener la actualización de su caché debido a que la misma parte de la memoria caché se cambió por el otro núcleo.

Asegúrese de que las variables únicas estén asignadas en diferentes bloques de memoria (por lo menos 128 bytes de separación, por ejemplo) para asegurarse de que este no sea el problema.

DDJ tiene un buen artículo que describe los efectos horribles de intercambio falsa: http://www.drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206

Aquí está la entrada de Wikipedia sobre ella: http://en.wikipedia.org/wiki/False_sharing

+0

lo explica! Gracias :) – IamIC

+0

Lo probé y ahora funciona a aproximadamente el doble de velocidad, como se esperaba. ¡Estupendo! – IamIC

+0

Como nota, 64 bytes son suficientes ya que ese es el tamaño de la línea de caché en las CPU Intel y AMD. – IamIC

Cuestiones relacionadas