MSVC は何年も前から AVX/AVX2 命令をサポートしており、この msdn ブログ投稿によると、融合乗算加算 (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
されます (実装が FMA 命令に依存していない場合、std::fma のパフォーマンスの低下が予想されます)。
/arch:AVX2 /O2 /Qvec
フラグでコンパイルします。も試してみましたが/fp:fast
、成功しませんでした。
問題は、MSVC に FMA 命令を自動的に発行させるにはどうすればよいかということです。
アップデート
#pragma fp_contract (on|off)
(のように見える) 何もしない があります。