我有这个 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没有。我不认为这是相关的,但我想保持它,因为lhs和rhs从来没有重叠,我想补充的align最终条款。
目前,我正在使用 …