Vectorisation automatique de la multiplication masortingcielle

Je suis assez nouveau chez SIMD et je voulais essayer de voir si je pouvais obtenir que GCC vectorise une action simple pour moi.

Alors j’ai regardé ce post et je voulais faire plus ou moins la même chose. (mais avec gcc 5.4.0 sur Linux 64 bits, pour un processeur KabyLake)

J’ai essentiellement cette fonction:

/* m1 = N x M masortingx, m2 = M x P masortingx, m3 = N x P masortingx & output */ void mmul(double **m1, double **m2, double **m3, int N, int M, int P) { for (i = 0; i < N; i++) for (j = 0; j < P; j++) { double tmp = 0.0; for (k = 0; k < M; k++) tmp += m1[i][k] * m2[k][j]; tmp = m3[i][j]; } return m3; } 

Ce que je comstack avec -O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5 , mais je ne vois aucun message indiquant que la vectorisation a été effectuée.

Si quelqu’un pouvait m’aider, ce serait très apprécié.

Il n’y a pas de message pour la vectorisation fait dans votre commande! Vous pouvez utiliser -fopt-info-vec pour activer le rapport de vectorisation. Mais ne comptez pas dessus. Le compilateur ment parfois (ils vectorisent et signalent mais ne l’utilisent pas!) Vous pouvez vérifier les améliorations! Pour ce faire, vous pouvez mesurer l’accélération. Commencez par désactiver la vectorisation et mesurez le temps t1. Puis activez et mesurez le temps t2. La vitesse d’accélération sera de t1 / t2 s’il est supérieur à 1, cela indique que le compilateur s’est amélioré si 1 aucune amélioration si moins d’un, il est indiqué que le vectoriseur automatique du compilateur a gâché cela pour vous! Vous pouvez également append -S à votre commande et voir les codes d’assemblage dans un fichier .s séparé.

REMARQUE: si vous souhaitez voir la puissance de la autovectorisation, ajoutez -march=native et supprimez-le -msse2 .

UPDATE: Lorsque vous utilisez une variable telle que N , M , etc. comme compteur de boucle, vous risquez de ne pas voir la vectorisation. Ainsi, vous auriez dû utiliser des constants place. D’après mon expérience, la multiplication masortingce-masortingce est vectorisable à l’aide de gcc 4.8, 5.4 and 6.2 . D’autres compilateurs tels que clang-LLVM , ICC et MSVC vectorisent également. Comme mentionné dans les commentaires, si vous utilisez double types de données double ou float vous devrez peut-être utiliser -ffast-math qui est un indicateur activé dans le niveau d’optimisation -Ofast , pour indiquer que vous n’avez pas besoin d’un résultat de grande précision (c’est OK la plupart du temps ). C’est parce que les compilateurs sont plus attentifs aux opérations à sharepoint retournement.