小编mba*_*bar的帖子

如何自动矢量化循环,其中 1) 修改数组,2) 指示数组最后是否更改?

我有这个 C++ 函数:

#include <stddef.h>

typedef unsigned long long Word;

bool fun(Word *lhs, const Word *rhs, size_t s)
{
    bool changed = false;
    #pragma omp simd
    for (size_t i = 0; i < s; ++i) {
        const Word old = lhs[i];
        lhs[i] |= rhs[i];
        changed = changed || old != lhs[i];
    }

    return changed;
}
Run Code Online (Sandbox Code Playgroud)

本质上,它是位向量 ( lhs |= rhs)的按位或实现。我对编写具有 SIMD 意识的代码很陌生,我无法弄清楚如何让编译器在不引入额外开销的情况下对其进行矢量化(例如,创建changed一个数组然后循环遍历它)。移除这changed = ...条线可以让一切都很好地进行矢量化。

我试过有omp simd没有。我不认为这是相关的,但我想保持它,因为lhsrhs从来没有重叠,我想补充的align最终条款。

目前,我正在使用 …

c c++ simd vectorization openmp

2
推荐指数
1
解决办法
201
查看次数

标签 统计

c ×1

c++ ×1

openmp ×1

simd ×1

vectorization ×1