Bonjour à tous.
Je bute depuis quelques temps sur un problème que j'ai du coup décidé de vous soumettre. Je travaille actuellement sur un code de simulation 2D hautes performances qui fait intervenir une méthode de transposition. Plus précisément, j'utilise des tableaux 2D (des matrices donc) mais qui sont stockés en mémoire dans des tableaux à une dimension, ligne par ligne.
C'est-à-dire que si mon tableau est de taille Nx*Ny, l'accès à l'élément (i,j) se fait en accédant au (j*Nx+i)ème élément du tableau 1D.
Ma fonction de transposition peut donc s'écrire de la manière suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
void Transposition(const int Nx,
const int Ny,
const real * toto_in,
real * toto_out){
for (int j=0; j<Ny; j++){
for (int i=0; i<Nx; i++){
int n_in = j*Nx+i;
int n_out = i*Ny+j;
toto_out[n_out] = toto_in[n_in];
}
}
return;
} |
Je compile le tout avec icpc. Problème : j'aimerais que le compilo vectorise tout seul la boucle interne histoire de grapiller quelques secondes mais rien à faire, j'obtiens systématiquement le message suivant :
Loop was not vetorized: dereference too complex.
D'où ma question : auriez-vous un moyen de forcer la vectorisation ? J'ai déjà essayé de rajouter les directives #pragma ivdep et #pragma vector always ainsi que de réécrire mes 2 boucles en une seule, rien n'y fait. Des idées ?
Merci d'avance 
edit : je pensais naïvement que le code serait indenté automatiquement entre les balises :o
Partager