2013-02-13 1 views
3

J'essaye d'écrire du code C qui peut être vectorisé. Ceci est la boucle que je suis en train:C: Ecriture de code qui peut être vectorisé automatiquement, boucle imbriquée, GCC

for(jj=0;jj<params.nx;jj++) 
    for(kk=0;kk<NSPEEDS;kk++) 
     local_density_vec[jj] += tmp_cells_chunk[jj].speeds[kk]; 

GCC me donne le message suivant lorsqu'il est exécuté avec le drapeau -ftree-vectorizer-verbose=5http://pastebin.com/RfCc04aS.

Comment puis-je le réécrire afin qu'il puisse être vectorisé automatiquement. NSPEEDS est 5.

EDIT:

J'ai continué à travailler, et je ne semble pas être en mesure de vectoriser quoi que ce soit avec .speeds[kk]. Y a-t-il un moyen de le restructurer afin qu'il le puisse?

+1

Le compilateur ne peut pas vectoriser parce qu'il ne peut pas déterminer s'il y a aliasing passe entre vos tableaux. De plus, votre compte de voyage 'NSPEEDS' est trop petit pour accélérer la vectorisation. – Mysticial

+0

Dans ma première tentative, j'ai fait tourner les boucles. Je voulais qu'il se déroule avec 'NSPEEDS' et vectoriser l'autre boucle. Toute boucle avec '.speeds [kk]' échoue à vectoriser. Puis-je changer cela? – superbriggs

+0

Que signifie l'aliasing dans ce contexte? – superbriggs

Répondre

2
for (jj = 0; jj < nx; jj++) { 
     partial = 0.0f; 
     fp = c[jj].speeds; 
     for (kk = 0; kk < M; kk++) 
       partial += fp[kk]; 
     out[jj] = partial; 
} 
(...) 
Calculated minimum iters for profitability: 12 

36: Profitability threshold = 11 

Vectorizing loop at autovect.c:36 

36: Profitability threshold is 11 loop iterations. 
36: LOOP VECTORIZED. 

Points importants:

1) Dans votre décharge, la boucle était considérée comme "modèle d'accès compliqué" (voir la dernière ligne de votre journal). Comme déjà commenté, ceci est lié au fait que le compilateur soit incapable de vérifier l'alias. Pour les modèles d'accès "simples", voir: http://gcc.gnu.org/projects/tree-ssa/vectorization.html#vectorizab

2) Mon exemple de boucle nécessitait 12 itérations pour la vectorisation. Puisque NSPEEDS == 5, le compilateur perdrait du temps s'il vectorisait le vôtre.

3) Je n'ai réussi à vectoriser ma boucle qu'après avoir ajouté des optimisations -funsafe-math. Je crois que cela est nécessaire en raison d'un comportement différent d'arrondi ou d'associativité avec les opérations vectorielles résultantes. Voir, par exemple: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

4) Si vous inversez la boucle, vous pourriez avoir à nouveau des problèmes avec des modèles d'accès "compliqués". Comme déjà commenté, vous devrez peut-être inverser l'organisation du tableau. Vérifiez les documents de vectorisation gcc sur les accès strides pour vérifier si vous pouvez correspondre à l'un des modèles.

Pour être complet, voici l'exemple complet: http://pastebin.com/CWhyqUny