J'ai une bibliothèque qui a quelques algorithmes de traitement d'image, y compris un algorithme de région d'intérêt (culture). Lors de la compilation avec GCC, le vectorizer automatique accélère une grande partie du code mais aggrave les performances de l'algorithme Crop. Y a-t-il un moyen de signaler une certaine boucle à ignorer par le vectorizer ou existe-t-il un meilleur moyen de structurer le code pour de meilleures performances?Auto vectorisation Région d'intérêt (culture)
for (RowIndex=0;RowIndex<Destination.GetRows();++RowIndex)
{
rowOffsetS = ((OriginY + RowIndex) * SizeX) + OriginX;
rowOffsetD = (RowIndex * Destination.GetColumns());
for (ColumnIndex=0;ColumnIndex<Destination.GetColumns();++ColumnIndex)
{
BufferSPtr=BufferS + rowOffsetS + ColumnIndex;
BufferDPtr=BufferD + rowOffsetD + ColumnIndex;
*BufferDPtr=*BufferSPtr;
}
}
Où SizeX
est la largeur de la source OriginX
est la gauche de la région d'intérêt OriginY
est la partie supérieure de la région d'intérêt
Je ne suis pas sûr d'avoir mal compris votre question. Vous voulez soit marquer cette boucle pour ne pas la vectoriser, soit la restructurer pour de meilleures performances? Cela me semble être une contradiction. Mais en ce qui concerne la performance: Les deux gammes peuvent-elles se chevaucher? Si non: utilisez-vous '__restrict' sur le pointeur pour le rendre clair au compilateur? Pointeraliasing est un grand showstopper pour l'optimisation. D'ailleurs: avez-vous pensé à utiliser 'std :: copy' pour votre boucle interne? Cela pourrait être mieux optimisé et rend votre code plus court. – Grizzly
Cela semble être une contradiction, mais c'est l'idée. La vectorisation dégrade actuellement les performances, donc soit la désactiver pour cette boucle soit améliorer le code sont deux options auxquelles je pourrais penser! Je vais restreindre et copier. – illumi
Vous pourriez vouloir mentionner que la performance pour la culture s'aggrave dans ce cas dans votre question. En l'état, j'ai supposé que la performance de l'algorithme Crop demeurait inchangée par la vectorisation.Au cas où vous ne le sachiez pas encore, l'indicateur '-ftree-vectorizer-verbose = n' pourrait vous aider à obtenir des informations plus concrètes sur ce que fait l'optimiseur et pourquoi. – Grizzly