2009-05-19 18 views
6

Estoy confundido de que Microsoft dice que la alineación de memoria es necesaria para InterlockedExchange, sin embargo, la documentación de Intel dice que la alineación de memoria no es necesaria para LOCK. ¿Me estoy perdiendo algo, o lo que sea? graciasAlineación InterlockedExchange y memoria

de Microsoft MSDN Library

SDK de la plataforma: DLL, procesos y subprocesos InterlockedExchange

La variable apuntada por el parámetro de destino debe ser alineados en un límite de 32 bits ; de lo contrario, esta función se comportará imprevisiblemente en en los sistemas multiprocesador x86 y cualquier sistema que no sea x86.

de Intel Software Developer's Manual;

  • instrucción LOCK Causas # señal de BLOQUEO del procesador para afirmar durante la ejecución de la instrucción adjunta (convierte la instrucción en una instrucción atómica). En un entorno de multiprocesador, la señal LOCK # asegura que el procesador tiene el uso exclusivo de cualquier memoria compartida mientras se afirma la señal.

    La integridad del prefijo LOCK no se ve afectada por la alineación del campo de memoria. Se observa bloqueo de memoria para campos arbitrariamente desalineados.

  • Orden Memoria en P6 y más recientes, las familias de procesadores

    instrucciones bloqueadas tienen un orden total.

  • software controlado por bus bloqueo

    La integridad de un cierre del bus no se ve afectada por la alineación del campo de memoria. Se sigue la semántica de 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.

Respuesta

1

A pesar de que el prefijo de bloqueo no requiere memoria para alinearse, y la operación cmpxchg que probablemente se utiliza para poner en práctica InterlockedExchange() no requiere alineación, si el sistema operativo ha permitido comprobar la alineación entonces la voluntad cmpxchg plantear una excepción de verificación de alineación (AC) cuando se ejecuta con operandos desalineados. Compruebe los documentos para cmpxchg y similares, mirando la lista de excepciones de modo protegido. No estoy seguro de que Windows permita la verificación de alineación, pero no me sorprendería.

+0

¿Debería ser eso? : "operación cmpxchg ... no requiere * requiere * alineación" –

1

Oye, I respondió algunas preguntas relacionadas con esto, también tenga en cuenta;

  1. Hay NO nivel de byte InterlockedExchange no ES un 16 bits corta InterlockedExchange sin embargo.
  2. La discrepancia de documentación a la que se refiere, es probablemente solo un poco de supervisión de documentación.
  3. Si desea TODO Byte/acceso atómica nivel de bits, hay SON mucha variedad de formas TODO esto con los intrínsecos existentes, Interlocked [and8 | OR8 | Xor8]
  4. Cualquier operación en la que el bloqueo de alta Potencia haciendo (usando el código de machiene como usted discute), no debería estar funcionando sin alinear (performance anti-pattern)
  5. xchg (instrucción optimizada con prefijo LOCK implícito, optimizado debido a la capacidad de bloqueo de caché y evitar un bloqueo de bus completo a main memoria). CAN hacer operaciones interbloqueadas de 8 bits.

casi lo olvido, de Intel de TBB, tienen de 8 bits de carga/tienda definido w/o el uso de bloqueo implícita o explícita (en algunos casos);

.code 
    ALIGN 4 
    PUBLIC c __TBB_machine_load8 
__TBB_machine_Load8: 
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check. 
    mov ecx,4[esp] 
    test ecx,7 
    jne load_slow 
    ; Load within a cache line 
    sub esp,12 
    fild qword ptr [ecx] 
    fistp qword ptr [esp] 
    mov eax,[esp] 
    mov edx,4[esp] 
    add esp,12 
    ret 

EXTRN __TBB_machine_store8_slow:PROC 
.code 
    ALIGN 4 
    PUBLIC c __TBB_machine_store8 
__TBB_machine_Store8: 
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check. 
    mov ecx,4[esp] 
    test ecx,7 
    jne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp 
    fild qword ptr 8[esp] 
    fistp qword ptr [ecx] 
    ret 
end 

De todos modos, espero que aclare al menos algo de esto para usted.

6

Érase una vez, Microsoft soportaba WindowsNT en procesadores distintos de x86, como MIPS, PowerPC y Alpha. Todos estos procesadores requieren alineación para sus instrucciones interconectadas, por lo que Microsoft puso el requisito en su especificación para garantizar que estas primitivas sean transferibles a diferentes arquitecturas.

+0

También el modo x64 requiere alineación en operaciones interbloqueadas – Rom

-1

No entiendo de dónde proviene su información de Intel.

Para mí, es bastante claro que a Intel le preocupa MUCHO la alineación y/o la expansión de las líneas de caché.

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 3-I, Programación del Sistema, para x86/x64 de Intel dice claramente:

8,1.1 Garantizado operaciones atómicas

El procesador Intel486 (y más nuevos procesadores desde) garantiza que los siguientes operaciones básicas de memoria siempre se llevarán a cabo de forma atómica:

  • de lectura o escritura de un byte
  • la escritura o lectura palabra alineado en un límite de 16 bits
  • de lectura o escritura de un doble palabra alineados en un límite de 32 bits

El procesador Pentium (y más nuevos procesadores desde) garantiza que los siguientes operaciones de memoria adicionales siempre se llevarán a cabo atómicamente:

  • leer o escribir una palabra cuádruple alineados en un límite de 64 bits
  • 16 bits accesos a no almacenado en caché posiciones de memoria que caben 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 que se lleve a cabo de forma atómica:

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

accesos a memoria puede almacenar en caché que se divide en líneas de caché y límites de la página no están garantizados ser atómico por los procesadores Intel Core 2 Duo, Intel® Atom ™, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, P6, 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 accesos a datos no alineados serán y afectarán gravemente el rendimiento del procesador, por lo que deben evitarse.

+1

La información presentada en esta respuesta parece estar relacionada con "operaciones básicas de memoria" mientras que el contexto de la pregunta está * bloqueado * operaciones. –

Cuestiones relacionadas