2009-09-12 9 views
35

Microsoft ofrece la función InterlockedCompareExchange para realizar operaciones atómicas de comparación e intercambio. También hay un _InterlockedCompareExchangeintrínseco.requisitos de alineación para atomic x86 instructions

En x86 estos se implementan utilizando la instrucción cmpxchg.

Sin embargo, al leer la documentación sobre estos tres enfoques, no parecen estar de acuerdo con los requisitos de alineación.

de Intel reference manual dice nada acerca de la alineación (excepto los de comprobación si alineación está habilitado y una referencia de memoria no alineado se hace, se genera una excepción)

También busqué el prefijo lock, que establece específicamente que

la integridad del prefijo LOCK es no afectados por la alineación del campo de memoria.

(el énfasis es mío)

Así Intel parece decir que la alineación es irrelevante. La operación será atómica sin importar qué.

La documentación intrínseca _InterlockedCompareExchange tampoco dice nada sobre la alineación, sin embargo la función InterlockedCompareExchange establece que

Los parámetros para esta función deben estar alineados en un límite de 32 bits; de lo contrario, la función se comportará de forma impredecible en sistemas multiprocesador x86 y cualquier sistema que no sea x86.

¿Qué ofrece? ¿Los requisitos de alineación para InterlockedCompareExchange solo son para asegurarse de que la función funcionará incluso en CPUs pre-486 donde la instrucción cmpxchg no está disponible? Eso parece estar basado en la información anterior, pero me gustaría estar seguro antes de confiar en él. :)

¿O es la alineación requerida por el ISA para garantizar la atomicidad, y solo estoy buscando los lugares incorrectos en los manuales de referencia de Intel?

Respuesta

9

El PDF you are quoting from es de 1999 y CLARAMENTE desactualizado.

El up-to-date Intel documentation, específicamente Volume-3A cuenta una historia diferente.

Por ejemplo, en un procesador Core-i7, TODAVÍA tiene que asegurarse de que sus datos no abarquen las líneas de caché, de lo contrario, la operación NO garantiza que sea atómica.

Por Volumen 3A, Programación del Sistema, para x86/x64 de Intel afirma claramente:

8.1.1 garantizado operaciones atómicas

El procesador Intel486 (y más nuevos procesadores ya) garantiza que la siguiente básica las operaciones de memoria siempre se llevan a cabo de forma atómica:

  • de lectura o escritura de un byte
  • Re ADing o escribir una palabra alineados en un 16-bit límite
  • leer o escribir una palabra doble alineados en un límite de 32 bits

El procesador Pentium (y más nuevos procesadores desde) garantiza que las siguientes operaciones de memoria adicionales siempre será llevado a cabo atómicamente:

  • leer o escribir una palabra cuádruple alineados en un límite de 64 bits
  • 16 bits accede a las posiciones de memoria sin almacenar en caché que se ajustan dentro de un bus de datos de 32 bits

Los procesadores de la familia P6 (y más nuevos procesadores ya) garantía de que la siguiente operación memoria adicional siempre se llevará a cabo de forma atómica:

  • Unaligned 16, 32 y 64 bits accesos a caché memoria que encaja dentro de una línea de caché

los accesos a la memoria puede almacenar en caché que se divide en líneas de caché y límites de la página no se garantiza que sea atómica por el procesador Intel Core 2 Duo, Intel® Atom ™, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, familia P6, procesadores Pentium e Intel486. Los procesadores Intel Core 2 Duo, Intel Atom, Intel Core Duo Duo, Pentium M, Pentium 4, Intel Xeon, y familia P6 proporcionan señales de control de bus que permiten a la memoria externa subsistemas para hacer que los accesos divididos sean atómicos; Sin embargo, los datos no alineados se accede afectar seriamente el rendimiento del procesador y debe evitarse

+1

El texto que menciono arriba ES de los manuales de Intel y establece claramente los diferentes requisitos de alineación por familia de procesadores. Probablemente debería haber usado una redacción diferente para expresar que la información ACTUALIZADA de Intel es muy clara, supongo que lo que obtienes por leer un .pdf de 1999. – damageboy

+7

-1: Has sacado la sección incorrecta del manual correcto. Las operaciones básicas de memoria y las operaciones atómicas bloqueadas son cosas diferentes. –

+3

@damageboy -1: Como correctamente señala MackieMesser, su cita habla de * operaciones de memoria * básicas y no * operaciones atómicas *, es decir, operaciones con un 'BLOQUEO ', que era lo que OP preguntó, como' BLOQUEO 'es lo que utilizado en caso de operaciones atómicas x86. –

5

Consulte this SO question: la alineación natural es importante para el rendimiento, y es necesaria en la arquitectura x64 (por lo tanto, no solo los sistemas PRE-x86, sino también POST-x86; x64 puede ser un nicho de caso, pero está creciendo en popularidad después de todo ;-); esa puede ser la razón por la cual Microsoft lo documenta según sea necesario (documentos difíciles de encontrar sobre si MS decidió FORZAR el problema de alineación habilitando la verificación de alineación, que puede variar según la versión de Windows; al reclamar en los documentos que se requiere alineación, MS mantiene el libertad para forzarlo en alguna versión de Windows, incluso si no lo forzaron en otros).

+1

Gracias. Y bah, por supuesto, alguien más había preguntado esto antes. No me sorprendería ...: p Acerca de x64, ¿requiere alineación para * todas * instrucciones atómicas, incluso aquellas que no lo requieren en el modo de 32 bits? No es que no te crea, pero parece un poco sorprendente si están rompiendo la compatibilidad con versiones anteriores. ¿Tienes una fuente para eso? – jalf

+1

No tengo información sobre los problemas de alineación de x64 excepto los de Microsoft (vea también http://forum.winimage.com/viewtopic.php?t=137 para otras discusiones y sugerencias sobre la alineación x64, más allá de la atomicidad). Por cierto, ¿qué compatibilidad con versiones anteriores? x64 es una nueva arquitectura (los chips que la ejecutan también ejecutan x86 para el código anterior de 32 bits) por lo que no hay "retroceso": el código de máquina que se ejecuta en x64 (en lugar del modo heredado x86) debe haberse escrito/compilado/generado específicamente para él, no para x86! -) –

+1

Ese enlace parece decir que la alineación es * solo requerida * en Itanium, no en x64, que es lo que esperaría. Obviamente, todavía tiene un (mayor) impacto en el rendimiento, pero sería extraño si x64 repentinamente requiriera alineamiento para las instrucciones que no lo requerían en x86. Y no importa la compatibilidad con versiones anteriores. Fue medio brainfart, y medio irrelevante para la pregunta. ;) (El conjunto de instrucciones es básicamente el mismo, hasta donde yo sé. Los cambios consisten principalmente en agregar nuevas instrucciones y agregar otro byte de prefijo opcional para permitirle especificar uno de los nuevos registros) – jalf

3

Las API de interbloqueo de Microsoft también se aplicaron a ia64 (mientras aún existía). No había ningún prefijo de bloqueo en ia64, solo las instrucciones cmpxchg.acq y cmpxchg.rel (o fetchadd y otras bestias similares), y todas estas requieren alineación si recuerdo correctamente.

+0

ia86 todavía existe, y Windows todavía corre en él, hasta donde yo sé. De todos modos, mi pregunta era específicamente sobre x86. :) – jalf

+2

re: ia64. Estoy bastante seguro de que Windows dejó de enviar un sistema operativo para ia64 después de que Intel publicara su versión de amd64 (x86-64), y no vista ni win7 para ia64. Ahora solo están las versiones x86 y x86-64 del sistema operativo. En lo que a mí respecta, eso efectivamente mata ia64 (a menos que cuentes HPUX IPF). re: entrelazado y x86. Es mi recuerdo que comenzamos a ver las API enclavadas cuando Microsoft lanzó su versión ia64 de la plataforma SDK. Si eso es preciso, probablemente explicaría por qué la documentación de enclavamiento no se basa en la semántica del prefijo LOCK de x86. –

+0

IA64 Windows existía hasta Server 2008 R2, que se lanzó justo antes de que se publicara el comentario anterior. –

10

x86 hace no requieren la alineación para la instrucción cmpxchg. Sin embargo, se recomienda la alineación para el rendimiento. Esto no debería ser una sorpresa, la compatibilidad con versiones anteriores significa que el software escrito con un manual de hace 14 años todavía se ejecutará en los procesadores de hoy.

Por qué Microsoft requiere exactamente la alineación no está claro en su documentación. Puede ser para rendimiento o para soportar arquitecturas RISC o ambas.

Intel® 64 e IA-32 Arquitecturas de Software Manual del desarrollador
Volumen 3 (3A): Guía de programación del sistema
de enero de 2013

8.1.2.2 Software autobús bloqueo

Para forzar explícitamente controlada el software de semántica LOCK puede usar el prefijo LOCK con las siguientes instrucciones cuando se usan para modificar una ubicación de memoria. [...]

• Las instrucciones de intercambio (XADD, CMPXCHG y CMPXCHG8B).
• El prefijo LOCK se asume automáticamente para la instrucción XCHG.
• [...]

[...] La integridad de un cierre del bus no se ve afectada por la alineación del campo memoria. Se sigue la semántica LOCK para tantos ciclos de bus como sea necesario para actualizar todo el operando. Sin embargo, se recomienda que los accesos bloqueados estén alineados en sus límites naturales para un mejor rendimiento del sistema :

• Cualquier límite para un acceso de 8 bits (bloqueado o no).
• Límite de 16 bits para accesos de palabras bloqueadas.
• Límite de 32 bits para accesos de doble palabra bloqueados.
• Límite de 64 bits para accesos de cuatro palabras bloqueados.

Cuestiones relacionadas