MSVC уже много лет поддерживает инструкции AVX / AVX2 в соответствии с это сообщение в блоге msdn, он может автоматически генерировать fused-multiply-add (FMA) инструкция.
Однако ни одна из следующих функций не компилируется в инструкцию FMA:
float func1(float x, float y, float z)
{
return x * y + z;
}
float func2(float x, float y, float z)
{
return std::fma(x,y,z);
}
Хуже того, std :: fma не реализована как одна инструкция FMA, она работает ужасно, намного медленнее, чем простой x * y + z
(ожидается низкая производительность std :: fma, если реализация не полагается на инструкцию FMA).
Я компилирую с /arch:AVX2 /O2 /Qvec
флагами. Также пробовал с /fp:fast
, безуспешно.
Итак, вопрос в том, как заставить MSVC автоматически выдавать инструкции FMA?
ОБНОВЛЕНИЕ
Существует #pragma fp_contract (on|off)
, который (похоже) ничего не делает.
/O1 /arch:AVX2 /fp:fast
с MSVC 2015. - person Z boson   schedule 04.01.2016