Различия между моделями памяти x86/x64/ia64 on.NET
Я ищу ссылку на различия между моделями памяти, используемыми .NET CLR / JIT на x86 / x64 / ia64. Я знаю, что есть некоторые различия между x86 и ia64 (переупорядочивание инструкций, удаление инструкций и т. д.), но я не нашел ссылки на различия между x86 и x64.
У меня есть приложение, которое нацелено на некоторые очень жесткие цифры задержки и будет работать только на x86 в это время, и, возможно, на x64 (определенно не на ia64). Интересно, смогу ли я полагайтесь на некоторые артефакты реализации x86 JIT и все еще будьте относительно безопасны на x64, или если я должен программировать на более свободном JIT ia64 (который потребует больше полей быть волевым и барьеры памяти будут вставлены в нескольких местах).
Заранее спасибо за любые указатели.
3 ответа:
Две статьи о модели памяти .NET (которая сильнее, чем модель ECMA, кстати):
Книга Джо Даффи, параллельное программирование на Windows , также является отличным источником информации по этой теме.
- Вэнс Моррисон (подробно)
- Джо Даффи (набор правил, основанных на вышеизложенном)
Модель памяти .NET указана в спецификации ECMA ISO / IEC-23271. В частности, в разделе I: концепции и архитектура, глава 12.6"модель памяти и оптимизация".
Этот стандарт определяет границы, в которых может работать JIT. Если вы хотите быть нейтральным к архитектуре, вы должны следовать этому стандарту и не использовать никаких особенностей x86/x64 JITs.
Дополнительно x64-это эволюция к x86, она состоит в основном из дополнительных инструкций, регистров и некоторые расширения (SSE2), определяемые как базовые для всех процессоров, совместимых с x64. Модели памяти практически не изменились, за исключением дополнительного адресного пространства и дополнительных режимов адресации (указателя инструкции относительно доступа к данным.) Так что оптимизация для x86 JIT должна дать хорошие результаты и на x64.
Это может быть слишком низким уровнем, но некоторые старые 64-битные процессоры AMD не имеют CMPXCHG16B (Source ), Если вы полагались на это как на аппаратную неблокирующую инструкцию.
Также, по-видимому, естьизменения в модели памяти для C++, которые могут быть релевантными, поэтому вам, возможно, придется держать ухо востро, если вы делаете код очень низкого уровня.
Модель памяти, "заданная" средой CLR, является постоянной темой дискуссий в Microsoft (обсуждалась открыто, по крайней мере, до сих пор как 2003). В качестве дополнительной заметки Крис Брумме утверждает в этой статье, что модель x64 такая же, как x86, что я бы предположил, является точным утверждением для целей размещенного кода CLR.
Если ваши целевые пользователи явно не включают Itanium, я думаю, что простого включения резервного, более медленного, но простого и безопасного, внедрения для этой архитектуры будет достаточно для корректности. Тогда нет необходимости указывать, что ваше программное обеспечение сломано на этой платформе, просто это он работает в более медленном резервном режиме. Если люди впоследствии захотят серьезно использовать платформу, вы можете написать код для этой гораздо более свободной модели.
Обратите внимание, что x64 JIT отличается от x86 JIT (значительно начиная с 3.5 SP1), поэтому любое тестирование режима выпуска на одном не является репрезентативным для другого и наоборот. Тест по мере необходимости.