RyuJIT не в полной мере использует встроенные SIMD
Я использую код C#, который использует System.Numerics.Vector<T>
но, насколько я могу судить, я не получаю в полной мере пользы от SIMD. Я использую Visual Studio Community 2015 с обновлением 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. "Ток" Песчаного Моста, функция сокращается без архитектурных изменений. Ваш заклятый враг - это бит кода в 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 - "галочка". Очень хороший процессор, кстати, открытия, подобные этому, имеют большое значение.
С этим ничего не поделаешь, кроме как ходить по магазинам. Для вдохновения вы можете посмотреть на код, который он генерирует в этом посте.