gpt4 book ai didi

c++ - 矢量化和#pragma omp simd

转载 作者:行者123 更新时间:2023-11-28 05:38:47 26 4
gpt4 key购买 nike

由于我在阅读所有依赖于矢量化的 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;
}
}
}

问候!

最佳答案

所以 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); 的 vector 开头的循环计数器 vector ,并使用带有 vector 的 _mm_add_ps() 递增它[ 4 4 4 4 ] (_mm_set1_epi32(4)) 将每个元素递增 4。

保留一个单独的 i 值 vector ,您只在外循环中修改它,但仍存储在内循环中。


参见 为指令集的内容标记 wiki。

参见 为一些 SIMD 指南标记 wiki,包括这个不错的 intro to SIMD and what it's all about.

关于c++ - 矢量化和#pragma omp simd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com