- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于我在阅读所有依赖于矢量化的 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 ,您只在外循环中修改它,但仍存储在内循环中。
参见 x86为指令集的内容标记 wiki。
参见 sse为一些 SIMD 指南标记 wiki,包括这个不错的 intro to SIMD and what it's all about.
关于c++ - 矢量化和#pragma omp simd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630668/
好的,我希望以前没有问过这个问题,因为在搜索中很难找到。 我查看了 F95 手册,但仍然觉得这很模糊: For the simple case of: DO i=0,99 END DO 我正
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
我有这段代码: #include #include int main(){ int i,j = 0 ; int tid; # pragma omp parallel pri
刚开始接触OPENMP,想用它来求解波动方程,串口代码在这里: #include #include #include #include #define GRID_SZ 3000 #define
我对 omp single 感到困惑和 omp task指令。我已经阅读了几个使用它们的例子。以下示例显示如何使用任务构造来处理链表的元素。 1 #pragma omp parallel 2 {
我试图了解 omp ordered 和 omp critical 之间的区别。他们都没有相同的语义吗?每个线程中编写的代码都被串行执行,当一个线程处于有序/关键 block 中时,其他线程等待。我看不
是否可以在 omp 并行 block 之外使用 omp pragma,如 critical、single、master 或 barrier?我有一个函数可以从 OMP 并行 block 调用,也可以不
我想测试 #pragma omp parallel for 和 #pragma omp simd 一个简单的矩阵加法程序。当我分别使用它们时,我没有收到任何错误,而且看起来还不错。但是,我想测试使用它
考虑: void saxpy_worksharing(float* x, float* y, float a, int N) { #pragma omp parallel for
我试图了解 #pragma omp critical 之间的确切区别和 #pragma omp single在 OpenMP 中: Microsoft 对这些的定义是: Single:让您指定应在其上
在带有 openMP 的 C++ 中,两者之间有什么区别吗 #pragma omp parallel for for(int i=0; i
我正在处理一些事情,试图让孤立工作发挥作用,并通过减少 #pragma omp parallel 的调用来减少开销。我正在尝试的是这样的: #pragma omp parallel default(n
在我学习 OpenMP 的过程中,我遇到了一个示例,其中的主要内容如下所示: int main(){ #pragma omp parallel #pragma omp sing
我是 OpenMP 的新手,我一直在尝试运行一个使用 OpenMP 添加两个数组的程序。在 OpenMP 教程中,我了解到,在 for 循环上使用 OpenMP 时,我们需要使用 #pragma om
我正在阅读 Peter S. Pacheco 的《并行编程简介》一书。在第 5.6.2 节中,它对减少 fork/join 开销进行了有趣的讨论。 考虑奇偶转置排序算法: for(phase=0; p
之间有什么区别: #pragma omp for {for_loop} 和 #pragma omp parallel for {for_loop} 最佳答案 #pragma omp par
在 OpenMP 中 #pragma omp master 中的任何代码指令由单个线程(主线程)执行,在区域末尾没有隐含的屏障。 (见 section on MASTER directive in t
如果我明白 aligned omp simd的条款构造,它指的是整个数组的对齐方式。 它如何用于多维数组?认为 ni = 131; nj = 137; nk = 127 !allocates arr
我有一个问题:我必须使用 OMP 并行化这段代码。 存在数据依赖问题,不知道如何解决。有什么建议么? for (n = 2; n < N+1; n++) { dz = *(dynamic_d +
我是一名优秀的程序员,十分优秀!