MSVC prend en charge les instructions AVX/AVX2 depuis des années et selon this msdn blog post, il peut générer automatiquement des instructions fused-multiply-add (FMA).Générer automatiquement des instructions FMA dans MSVC
Cependant, aucune des fonctions suivantes à l'instruction FMA compilez:
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);
}
Pire encore, std :: fma n'est pas mis en œuvre comme une seule instruction FMA, il effectue terriblement, beaucoup plus lent qu'un x * y + z
ordinaire (la une mauvaise performance de std :: fma est attendue si l'implémentation ne repose pas sur l'instruction FMA). Je compile avec /arch:AVX2 /O2 /Qvec
drapeaux. Également essayé avec /fp:fast
, sans succès. Donc, la question est de savoir comment MSVC peut-il forcer l'émission automatique d'instructions FMA?
MISE À JOUR
Il y a un #pragma fp_contract (on|off)
qui (ressemble) ne fait rien.
Vous devez probablement utiliser [fonctions intrinsèques du compilateur] (https://msdn.microsoft.com/fr-fr/library/hh977022.aspx). –
Je connais ces intrinsèques mais cela ne m'intéresse pas. Je veux que le compilateur génère automatiquement les instructions, tout comme GCC et Clang. C'est 2016.De plus, il y a de nombreux cas où vous ne pouvez pas utiliser explicitement ces instrinsics, car le fusionné-multiplier-ajouter n'appartient pas à une seule opération ou fonction, il vient d'une expression optimisée en ligne multiple. – plasmacel
Bonne chance. D'après mon expérience, MS ne se soucie pas de cette partie du compilateur. Même lorsque vous utilisez des intrinsèques, il génère une génération de code assez terrible pour les instructions FMA. Si vous vous intéressez aux performances des FMA sous Windows, utilisez un autre compilateur. (ICC est assez bon) – Mysticial