Depuis que je me suis perdu à travers toute la lecture de SIMD et OpenMP en fonction de la vectorisation, je voudrais vous demander si quelqu'un peut me clarifier ce qui précède. Plus précisément, j'ai une partie d'un code C++ que je veux paralléliser, mais je suis assez bourré pour le moment et je ne peux pas trouver quelque chose par moi-même. Toute aide pour m'expliquer ce qu'est exactement la vectorisation et comment l'utiliser dans la partie suivante du code serait grandement appréciée!Vectorisation & #pragma omp simd
for(unsigned short i=1; i<=N_a; i++) {
for(unsigned short j=1; j<=N_b; j++) {
temp[0] = H[i-1][j-1]+similarity_score(seq_a[i-1],seq_b[j-1]);
temp[1] = H[i-1][j]-delta;
temp[2] = H[i][j-1]-delta;
temp[3] = 0.;
H[i][j] = find_array_max(temp, 4);
switch(ind) {
case 0: // score in (i,j) stems from a match/mismatch
I_i[i][j] = i-1;
I_j[i][j] = j-1;
break;
case 1: // score in (i,j) stems from a deletion in sequence A
I_i[i][j] = i-1;
I_j[i][j] = j;
break;
case 2: // score in (i,j) stems from a deletion in sequence B
I_i[i][j] = i;
I_j[i][j] = j-1;
break;
case 3: // (i,j) is the beginning of a subsequence
I_i[i][j] = i;
I_j[i][j] = j;
break;
}
}
}
Cordialement!
SIMD sur x86 est tout au sujet du chargement 16B (ou 32B) de données contiguës, et faire par exemple quatre 'float'' add's en parallèle, ou deux 'double', ou des entiers de différentes largeurs. Ou shuffling/blending/packed-compare pour obtenir un blend-mask/... –
'H [i] [j]' en fonction de 'H [i-1] [j-1]', 'H [ii] [ j] 'et' H [i] [j-1] ', il n'y a pas de moyen direct de vectoriser ou de paralléliser les boucles dans' i' ou 'j'. Eh bien, vous pouvez probablement faire en sorte que le compilateur vectorise et/ou les parallélise en utilisant '#pragma omp simd' et' #pragma omp parallel for', mais le résultat calculé sera faux. – Gilles