RyuJIT не в полной мере использует возможности SIMD

Я запускаю некоторый код С#, который использует System.Numerics.Vector<T>, но насколько я могу судить, я не получаю в полной мере преимущества встроенных SIMD. Я использую Visual Studio Community 2015 с Update 1, а мой clrjit.dll - v4.6.1063.1.

Я запускаюсь на процессоре Intel Core i5-3337U, который реализует расширения набора инструкций AVX. Поэтому я считаю, что я должен выполнить большинство SIMD-инструкций в 256-битном регистре. Например, дизассемблер должен содержать команды типа vmovups, vmovupd, vaddups и т.д., И Vector<float>.Count должен возвращать 8, Vector<double>.Count должен быть 4 и т.д. Но это не то, что я видя.

Вместо этого моя разборка содержит инструкции типа movups, movupd, addups и т.д.... и следующий код:

WriteLine($"{Vector<byte>.Count} bytes per operation");
WriteLine($"{Vector<float>.Count} floats per operation");
WriteLine($"{Vector<int>.Count} ints per operation");
WriteLine($"{Vector<double>.Count} doubles per operation");

Выдает:

16 bytes per operation
4 floats per operation
4 ints per operation
2 doubles per operation

Где я ошибаюсь? Для просмотра всех параметров проекта и т.д. Проект доступен здесь.

Ответы

Ответ 1

Ваш процессор немного устарел, его микро-архитектура - Ivy Bridge. "Ток" Sandy Bridge, функция сжимается без архитектурных изменений. Ваш nemesis - это бит кода в RyuJIT, расположенный в ee_il_dll.cpp, функция CILJit:: getMaxIntrinsicSIMDVectorLength():

if (((cpuCompileFlags & CORJIT_FLG_PREJIT) == 0) &&
    ((cpuCompileFlags & CORJIT_FLG_FEATURE_SIMD) != 0) &&
    ((cpuCompileFlags & CORJIT_FLG_USE_AVX2) != 0))
{
    static ConfigDWORD fEnableAVX;
    if (fEnableAVX.val(CLRConfig::EXTERNAL_EnableAVX) != 0)
    {
        return 32;
    }
}

Обратите внимание на использование CORJIT_FLG_USE_AVX2. Ваш процессор еще не поддерживает AVX2, это расширение стало доступно в Haswell. Следующая микро-архитектура после Ivy Bridge, "тик". Очень хороший процессор btw, такие открытия, как этот, имеют важный фактор вау.

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