Почему.NET не поддерживает SSE в 32-битной среде (в то время как может работать 64-битная версия), в то время как Mono поддерживает как 32-битную, так и 64-битную версию?

Ryujit будет поддерживать инструкции SSE, однако Ryujit предназначен только для 64 бит.

Большинство клиентов придерживаются 32-битной ОС Windows из-за политики компании и бюджета (из-за стоимости тестирования).

Насколько я понимаю, Ryujit - это новая "схема JIT, оптимизированная для 64-битных систем".

Однако, как вы знаете, набор инструкций SSE выходит на 32-битную и 64-битную.

Mono.Simd работает x86 или 32-битный процессор Arm.

(Java SIMD Call, кажется, работает на x86 и 64-битных).

Наш проект для любого процессора, поэтому мне очень сложно сказать клиенту: "Пожалуйста, используйте Mono, потому что у них есть поддержка SSE, или смените CPU и ОС".

Почему MS .NET Framework для x86 не обеспечивает поддержку команд SSE, а Ryujit может?

(Я не специалист по центральным процессорам, но я надеюсь, что в.NET есть возможность выбрать "принудительно использовать SSE для этой команды (если это возможно)")

3 ответа

RyuJIT основан на той же кодовой базе, что и x86 JIT. Хотя сейчас это только для x64, это современный компилятор, который в будущем станет основой для всех наших JIT-компиляторов: x86, ARM, MDIL и всего остального. Наличие единой кодовой базы означает, что программы.NET более согласованы между архитектурами, иными словами, вы обычно получаете совместимость "ошибка за ошибкой". Но наличие единой базы кода также означает, что мы можем быстрее вводить новшества и быстрее предоставлять вам больше возможностей для генерации кода.

По сути, они построили четыре отдельные реализации JIT-компилятора для x86, x64, Itanium и ARM. Itanium в основном мертв, но он по-прежнему дает им три реализации, которые имеют очень мало общего.

Я считаю, что целью является замена.NET Framework JIT на RyuJIT, когда он станет достаточно стабильным. Действительно.NET Framework 4.6 включает RyuJIT в качестве x64-компилятора.

Размышляя об этом, для меня причина:

A) Ryujit - это новый JIT-компилятор, созданный с нуля, поэтому он может делать новые и замечательные вещи. Вероятно, они ограничили его до 64 бит, чтобы облегчить его сборку, и потому что "текущий" JIT на 64 битах иногда был медленнее, чем 32-битная версия, поэтому он был "более необходимым" на 64 битах

B) Будучи новым и блестящим, легче включать новые функции / точки расширения (например, функции SIMD)

C) Microsoft, похоже, тоже не хочет мыслить со "старым" компилятором.NET (я не считаю то, что они делали в.NET 4.5, где они перенесли какую-то работу в фоновый поток, "слишком много мыслителем")). Если вы посмотрите внимательно, то увидите, что они никогда не добавляли новые коды операций в CIL (общий промежуточный язык), язык ассемблера.NET (они внесли изменения в GC и библиотеки.NET, но они отличаются "вещи"), и ясно, чтобы добавить функции SIMD, они должны были бы внести изменения

D) Mono JIT "новее", чем "текущий" компилятор.NET JIT (потому что Mono "родился" позже). Это может оправдать, почему он поддерживает SIMD.

С появлением.Net Core 2.0 RyuJit теперь используется как jit для генерации кода x86 и позволяет x86 использовать преимущества SSE2 для общих операций с плавающей запятой и SSE2/AVX2 SIMD для Vector.

В готовящемся к выпуску.Net Core 2.1 вы можете найти предварительный обзор аппаратных функций, которые обеспечивают доступ (почти) ко всему спектру новых инструкций для процессоров x86 и x64.

В настоящее время маловероятно, что мы изменим.Net Framework на использование RyuJit для генерации кода x86.

Другие вопросы по тегам