Вопрос

Я ищу ссылку на различия между моделями памяти, используемыми .NET CLR / JIT на x86 / x64 / ia64.Я знаю, что есть некоторые различия между x86 и ia64 (переупорядочивание инструкций, удаление инструкций и т.д.), Но я не нашел ссылки на различия между x86 и x64.

У меня есть приложение, которое нацелено на очень низкие значения задержки и в настоящее время будет работать только на x86 и, возможно, на x64 (определенно не на ia64).Мне интересно, могу ли я полагаться на некоторые артефакты реализации x86 JIT и по-прежнему быть относительно безопасным на x64, или мне следует программировать на более слабом ia64 JIT (что потребует изменения количества полей и установки барьеров памяти в нескольких местах).

Заранее спасибо за любые указания.

Это было полезно?

Решение

Две статьи о .Модель сетевой памяти (которая, кстати, сильнее модели ECMA):

Книга Джо Даффи, Параллельное программирование в Windows, также является отличным источником информации по этой теме.

Другие советы

Модель памяти .NET указана в спецификации ECMA ISO/IEC-23271.В частности, в Разделе I:Концепции и архитектура, глава 12.6 "Модель памяти и ее оптимизация".

Этот стандарт определяет границы, в которых JIT может работать.Если вы хотите быть нейтральными к архитектуре, вы должны следовать этому стандарту и не использовать какие-либо особенности JIT для x86 / x64.

Кроме того, x64 является эволюцией к x86, она состоит в основном из дополнительных инструкций, регистров и некоторых расширений (SSE2), определяемых как базовые для всех процессоров, совместимых с x64.В моделях памяти почти не произошло изменений, за исключением дополнительного адресного пространства и дополнительных режимов адресации (указатель инструкции относительно доступа к данным). Таким образом, оптимизация для x86 JIT должна дать хорошие результаты и для x64.

Возможно, это слишком низкий уровень для вас, но некоторые старые 64-разрядные процессоры AMD не имеют CMPXCHG16B (Источник) если бы вы полагались на это как на аппаратную неблокирующую инструкцию.

Также, кажется, есть изменения в модели памяти для C ++ это может быть актуально, поэтому вам, возможно, придется следить, если вы выполняете код очень низкого уровня.

Модель памяти, "указанная" CLR, является постоянной темой дебатов в Microsoft (открыто обсуждалась, по крайней мере, еще в 2003).В качестве дополнительного примечания Крис Брумме утверждает в этой статье, что модель x64 такая же, как и x86, что, я бы предположил, является точным утверждением для целей размещенного в CLR кода.

Если ваши целевые пользователи явно не включают Itanium, я бы подумал, что простого включения резервной, более медленной, но простой и безопасной реализации для этой архитектуры было бы достаточно для корректности.Тогда нет необходимости указывать, что ваше программное обеспечение не работает на этой платформе, достаточно указать, что оно работает в более медленном резервном режиме.Если впоследствии люди захотят серьезно использовать платформу, вы можете написать код для этого многое более свободная модель.

Обратите внимание, что x64 JIT отличается от x86 JIT (значительно отличается начиная с версии 3.5 SP1), поэтому любое тестирование режима выпуска на одном из них не является репрезентативным для другого, и наоборот.Проверьте по мере необходимости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top