矢量化& #pragma omp simd

时间:2016-06-04 13:15:59

标签: c++ openmp vectorization simd pragma

由于我根据矢量化读取了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;
            }
        }
    }

问候!

1 个答案:

答案 0 :(得分:1)

因此ind对于两个嵌套循环都是常量吗?

您可能会使用OpenMP将编译器自动向量化。 (将行#pragma omp simd放在for循环之前,看看当用-O3编译时是否会影响asm。我不太了解OpenMP,所以IDK如果你需要其他选择。)

将它包装在一个实际编译的函数中,这样我就可以看到会发生什么。 (例如,将代码放在http://gcc.godbolt.org/上以获得格式正确的asm输出)。

如果它没有自动矢量化,那么使用Intel内在函数为x86手动矢量化可能并不困难,因为你只是用数组索引初始化一些数组。保持一个以__m128i jvec = _mm_set_epi32(3, 2, 1, 0);向量开头的循环计数器向量,并使用向量_mm_add_ps()[ 4 4 4 4 ])的_mm_set1_epi32(4)递增它,将每个元素递增4。 / p>

保留i值的单独向量,您只在外部循环中修改,但仍存储在内部循环中。

请参阅标记wiki以获取指令集内容。

有关某些SIMD指南,请参阅代码Wiki,包括此intro to SIMD and what it's all about.