2009-04-20 13 views
5

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

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

Заранее благодарим за любые указатели.

+1

Зачем использовать .net, если время памяти ограничено? Будет ли C++ не лучше? – gbn

+0

Сроки жесткие, но время дежурства все еще имеет значение. Кроме того, у нас есть ряд уже разработанных библиотек .Net, с которыми нам нужно связаться. Построение этой части на C++ и ее вызов через PInvoke не может быть и речи, но должно быть доказано первыми числами. Я пытаюсь заставить код .Net работать как можно лучше, прежде чем мы «сдадимся» и отправимся на этот маршрут. –

ответ

5

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

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

+0

Не могли бы вы обобщить различия в модели ECMA? – grover

+0

Первая связанная статья делает лучшую работу, чем я мог. –

+0

Вторая ссылка больше не работает, но она доступна через http://www.bluebytesoftware.com/blog/SearchView.aspx?q=memory, ища модель памяти CLR 2.0 –

0

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

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

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

+0

Это определяет модель ECMA - модель .NET немного сильнее и, следовательно, легче писать. –

+0

в качестве примечания стороны x86 и x64 JIT на самом деле просто расходились совсем немного (ранее x64 превосходил по большей части, теперь его немного интереснее), надеюсь, они получат больше встроенных друг в друга (извините за каламбур) – ShuggyCoUk

+0

Но только в отношении качества кода, который они произвели. – grover

0

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

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

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

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

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