multithreading caching locking atomic lock-free

multithreading - ¿Las operaciones atómicas se vuelven más lentas a medida que se agregan más CPU?



caching locking (4)

Como nota adicional a esta pregunta, vale la pena mencionar que el futuro al que hace referencia ya está presente en la tecnología de las GPU. una GPU quadro moderna tiene hasta 256 núcleos y puede realizar operaciones atómicas en la memoria global (pantalla).
No estoy seguro de cómo se logra esto, pero el hecho es que ya está sucediendo.

x86 y otras arquitecturas proporcionan instrucciones atómicas especiales (bloqueo, cmpxchg, etc.) que le permiten escribir estructuras de datos "sin bloqueo". Pero a medida que se agregan más y más núcleos, parece que el trabajo que estas instrucciones tendrán que hacer detrás de escena crecerá (¿al menos para mantener la coherencia de caché?). Si un agregado atómico toma alrededor de 100 ciclos hoy en día en un sistema de doble núcleo, ¿podría tardar mucho más en las máquinas de más de 80 núcleos del futuro? Si está escribiendo el código para que dure, ¿podría ser una mejor idea usar los bloqueos incluso si hoy son más lentos?


No creo que el problema sea que las operaciones atómicas se demorarán más; El problema real podría ser que una operación atómica podría bloquear las operaciones de bus en otros procesadores (incluso si realizan operaciones no atómicas).

Si desea escribir el último código, intente evitar el bloqueo en primer lugar.


Para la pregunta planteada en el título, la respuesta corta es "sí", la respuesta larga es "es complicada".

Con respecto a que las cerraduras sean mejores, no. Internamente, una cerradura debe empujar al menos tanto (si no más) el tráfico sobre el autobús. Piénselo de esta manera, si el procesador solo tiene una operación atómica, una comparación atómica y un intercambio, puede usarlo para implementar bloqueos e incrementos atómicos. Bueno, a nivel de protocolo de bus, solo se utilizan algunas primitivas. Los bloqueos no son más lentos que las operaciones atómicas porque están haciendo algo diferente, son más lentos porque están haciendo más de lo mismo (desde un punto de vista de coherencia). Así que a medida que las operaciones atómicas se vuelven más lentas, los bloqueos tenderán a disminuir de manera comparable.

Dicho esto, hay muchos artículos sobre el tema y los casos particulares son complicados. No me preocuparía cómo se va a escalar su código en 80 CPU centrales que tienen características de rendimiento impredecibles (porque no sabemos cómo se diseñarán). O se comportarán como nuestras CPU actuales y su código funcionará bien, o no lo harán, y lo que sea que haya adivinado ahora resultará incorrecto. En la mayoría de los casos, resultará que el código no era sensible al rendimiento de todos modos, así que no importa, pero si lo hace, entonces lo correcto será corregirlo en el futuro cuando comprenda las características de arquitectura y rendimiento. de sus procesadores de destino.


Tiene razón en que las restricciones de topología aumentarán, de una forma u otra, la latencia de la comunicación entre los núcleos, una vez que los conteos comiencen a ser más altos que un par de docenas. Realmente no sé cuáles son las intenciones de las compañías x86 para lidiar con ese tipo de escalamiento.

Pero los bloqueos se implementan en términos de operaciones atómicas. Así que realmente no ganas al cambiar a ellos, a menos que se implementen de una manera más escalable que lo que intentarías con tus propias operaciones atómicas enrolladas a mano. Pienso que, en general, para las contiendas de un solo token, los primitivos atómicos siempre serán la forma más rápida, independientemente de cuántos núcleos tengas.

Como Cray descubrió hace mucho tiempo, aquí no hay almuerzo gratis. El diseño de software de alto nivel, en el que intenta utilizar recursos potencialmente contenciosos en la forma menos frecuente posible, siempre conducirá al mayor pago en aplicaciones masivas en paralelo. Esto significa hacer todo el trabajo posible como resultado de una adquisición de un bloqueo, pero también lo más rápido posible. En situaciones extremas, esto puede significar hacer un cálculo previo de su trabajo en el supuesto de un bloqueo adquirido con éxito, intentar agarrarlo y completar el proceso lo más rápido posible, de lo contrario, deshacerse de su trabajo y volver a intentarlo en caso de fallo.