Различия между моделями памяти x86 / x64 / ia64 в .NET - PullRequest
5 голосов
/ 20 апреля 2009

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

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

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

Ответы [ 3 ]

5 голосов
/ 20 апреля 2009

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

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

0 голосов
/ 20 апреля 2009

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

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

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

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

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

0 голосов
/ 20 апреля 2009

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

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

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

...