Поскольку я потерялся из-за чтения SIMD и OpenMP в зависимости от векторизации, я хотел бы спросить вас, может ли кто-нибудь разъяснить мне вышеизложенное. В частности, у меня есть часть кода на C++, которую я хочу распараллелить, но на данный момент я очень надуман и не могу что-то понять сам по себе. Любая помощь, разрешающая мне, что именно представляет собой векторизация и как я могу ее использовать в следующей части кода, будет очень благодарна!Векторизация & #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;
}
}
}
С уважением!
SIMD на x86 все о загрузке 16В (или 32В) смежных данных, и делать, например, четыре 'float'' добавить 'параллельно, или два' double', или целые числа различной ширины. Или перетасовать/смешать/упаковать-сравнить, чтобы получить blend-mask/... –
'H [i] [j]' в зависимости от 'H [i-1] [j-1]', 'H [ii] [ j] 'и' H [i] [j-1] ', нет прямого способа либо векторизации, либо параллелизации циклов в' i' или 'j'. Возможно, вы, вероятно, можете сделать компилятор для векселирования и/или параллелизации их с помощью '#pragma omp simd' и' #pragma omp parallel for', но вычисленный результат будет неправильным. – Gilles