2014-11-13 1 views
3

Я просматривал исходный код .NET и видел this attribute. Это говорит,Как JitIntrinsicAttribute влияет на генерацию кода?

Атрибут, который может быть присоединен к JIT характеристическую методов/свойств

и в соответствии с MSDN:

Указывает, что модифицированный метод является внутренним значением, для которого компилятор «точно в срок» (JIT) может выполнять специальную генерацию кода. Этот класс не может быть унаследован.

, но мне было трудно найти как. На каком коде он выполняет специальное генерирование кода?

Моя основная догадка заключается в том, что в основном используются инструкции процессора, такие как SIMD, что-то вроде Java JIT does. Вот an example. Мне интересно, как это ускорится, и мне интересно, делает ли это Mono тоже.

ответ

14

Это относится к RyuJIT, 64-разрядному дрожанию следующего поколения, над которым работает в настоящее время Microsoft. Еще в alpha (aka CTP), следующая версия .NET и Visual Studio планируется включить в нее. В настоящее время доступен в .NET 4.6 Preview.

Одной из новых функций в RyuJIT является его способность генерировать машинный код SIMD, используя команды векторизации в процессорах Intel/AMD. Выполнение операций с плавающей запятой на массивах до x8 раз быстрее. Атрибут [JitIntrisic] является маркером кода C#, который RyuJIT имеет специальные встроенные знания, он будет генерировать SIMD-версию машинного кода вместо обычной не-вексельной версии.

Помните, что это еще миллион миль от кода, который могут сгенерировать текущие компиляторы C и C++. RyuJIT может делать это только для помазанных типов, о которых он знает. Как System.Numerics.Vector2. SIMD-код имеет очень сильные требования к выравниванию, чтобы быть эффективными, согласованными с 16 для инструкций SSE2, до 32 для инструкций AVX. Получение такого выравнивания в .NET-программе потребует полной капитализации CLR, в настоящее время она может согласовываться только с 4 в 32-битном режиме, до 8 в 64-битном режиме.

Краткая история: как вы спрашиваете о джиттере. Моно возился со своей поддержкой SIMD, он, похоже, получил stuck 5 years ago. .NET Core недавно был анонсирован с открытым исходным кодом с очень либеральной лицензией MIT, я предполагаю (но пока не знаю пока что), что это будет включать исходный код для RyuJIT. Проект github сейчас идет полным ходом и очень неполный.

ОБНОВЛЕНИЕ: Это привело к RT.6. Vector.IsHardwareAccelerated теперь является внутренним. Только типы System.Numerics.Vector2, Vector3 и Vector4 получают любовь SIMD. Вы можете получить System.Numerics.Vectors версии 4.1.0.0 from Nuget. Он предоставляет больше, включая Vector<T>.

+1

2015 обновление: SIMD работает (с ошибками бета-версии) в x64 в кандидате на выпуск Visual Studio 2015 года. Предположительно, он будет работать на x86 в полной версии, хотя я не знаю, будет ли он работать и на любом CPU. –

+0

Надеюсь, что они улучшат это в будущем, чтобы обеспечить эту оптимизацию для кода пользователя. В численных классах векторные классы действительно не полны. –

 Смежные вопросы

  • Нет связанных вопросов^_^