При каких условиях компилятор.NET JIT выполняет автоматическую векторизацию?
Генерирует ли когда-нибудь новый компилятор RyuJIT векторные (SIMD) инструкции ЦП и когда?
Примечание: Пространство имен System.Numerics содержит типы, которые позволяют явно использовать операции Vector, которые могут генерировать или не генерировать инструкции SIMD в зависимости от ЦП, версии CLR, версии JITer, независимо от того, выполняется ли компиляция непосредственно в собственный код или нет. Этот вопрос конкретно о том, когда не векторный код (например, в C# или F#) будет давать SIMD инструкции.
1 ответ
Генерация SIMD-кода в RuyJIT строго ограничена типами в пространстве имен System.Numerics.Vectors. Универсальная поддержка SIMD потребует очень значительного пересмотра CLR, такой код может быть эффективным только при правильном выравнивании переменных SIMD. По крайней мере, до 16 для SSE2, до 32, чтобы иметь возможность использовать AVX2, до 64 для предстоящего AVX-512.
Сейчас это далеко, 32-битный CLR может выравниваться только до 4, 64-битная версия - до 8. "Естественное" выравнивание для 32-битного и 64-битного кода. Необходимые изменения повлияют на каждую часть CLR, сборщик мусора и загрузчик классов. Нет никаких слухов о рассмотрении такого крупного изменения. И никаких признаков того, что это было учтено в проекте CoreCLR, это была бы самая очевидная целевая версия.
Если вы хотите использовать SIMD вне текущей поддержки System.Numerics.Vectors, то используйте компилятор C++, используя для взаимодействия расширения языка C++/CLI или C++/CX.