Pregunta

Busco una referencia sobre las diferencias entre los modelos de memoria utilizadas por el .NET CLR / JIT en x86 / x64 / IA64. Sé que hay algunas diferencias entre x86 y IA64 (reordenamiento de instrucciones, la eliminación de instrucciones, etc.), pero no he encontrado una referencia sobre las diferencias entre x86 y x64.

Tengo una aplicación que apunta a algunos números de latencia muy ajustados, y sólo se ejecutará en x86 en este momento, y tal vez en x64 (definitivamente no en IA64). Me pregunto si puedo confiar en algunos artefactos de la puesta en práctica x 86 JIT y seguir siendo relativamente segura en x64, o si debería de programación para el JIT más flojo IA64 (que requieren más campos sean barreras volitile y la memoria se inserte en varios lugares).

Gracias de antemano por cualquier punteros.

¿Fue útil?

Solución

Dos artículos sobre el modelo de memoria .NET (que es más fuerte que el modelo ECMA, por cierto):

libro de Joe Duffy, Programación Concurrente en Windows , es también una gran fuente de información sobre este tema.

Otros consejos

El modelo de memoria de .NET se especifica en la especificación ECMA ISO / IEC-23271. Específicamente en la partición I: Conceptos y Arquitectura, Capítulo 12.6 "modelo de memoria y optimizaciones".

Esta norma define los límites de un ECI podrá funcionar. Si quieres ser neutral a la arquitectura, que debe seguir esta norma y no utilizar cualquier detalles de los equipos conjuntos de investigación x86 / x64.

Además x64 es una evolución a x86, que consiste principalmente de instrucciones adicionales, registros y algunas extensiones (SSE2) se define como línea de base para todos los procesadores compatibles con x64. No ha habido prácticamente ningún cambio en los modelos de memoria, excepto para el espacio de direcciones adicionales y modos de direccionamiento adicional (puntero de instrucción de acceso a datos relativa.) Por lo tanto la optimización para el JIT x86 debe dar buenos resultados en x64 también.

Esto puede ser demasiado bajo nivel que usted, pero algunas CPUs AMD 64 bits de más edad no tienen CMPXCHG16B ( Fuente ) si confiaban en que, como la instrucción de no bloqueo de hardware .

También parece que hay los cambios en el modelo de memoria para C ++ que puede ser relevante por lo que tendrá que mantener un ojo hacia fuera si usted está haciendo código de nivel muy bajo.

El modelo de memoria 'especificado' por el CLR es un tema de debate en curso dentro de Microsoft (discutido abiertamente al menos tan atrás como 2003 ). Como nota al margen Chris Brumme establece en ese artículo que el modelo de 64 bits es la misma que la que X 86 que supongo es una declaración exacta de los efectos de CLR código organizadas.

A menos que los usuarios de destino incluyen explícitamente Itanium Me gustaría pensar que simplemente incluyendo un repliegue, más lento pero sencilla y segura, la aplicación para que la arquitectura sería suficiente para su corrección. Entonces no hay necesidad de indicar que el software se divide en esa plataforma, sólo que opera en un modo de recuperación más lenta. Si las personas quieren utilizar posteriormente la plataforma serio puede codificar para que más modelo más flexible.

Tenga en cuenta que el JIT x64 es diferente a la JIT x86 (significativamente por lo que desde 3,5 SP1) por lo que cualquier prueba de Modo de salida en uno no es representativa de la otra y viceversa. Prueba según sea apropiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top