【发布时间】:2016-10-04 11:33:35
【问题描述】:
由于我在阅读 SIMD 和 OpenMP 依赖于矢量化的过程中迷失了方向,所以我想问你是否有人可以澄清我上面的问题。 具体来说,我有一部分要并行化的 C++ 代码,但我现在很忙,无法自己想办法。 任何帮助我弄清楚矢量化到底是什么以及如何在以下代码部分中使用它将不胜感激!
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;
}
}
}
问候!
【问题讨论】:
-
x86 上的 SIMD 都是关于加载 16B(或 32B)的连续数据,并执行例如四个
floatadds并行,或者两个double,或者不同宽度的整数。或改组/混合/打包比较以获得混合掩码/ ... -
H[i][j]取决于H[i-1][j-1]、H[i-i][j]和H[i][j-1],没有直接的方法来矢量化或并行化i或j中的循环。好吧,您可能可以使用#pragma omp simd和#pragma omp parallel for使编译器矢量化和/或并行化它们,但计算结果将是错误的。
标签: c++ openmp vectorization simd pragma