3
std::array<int, 4> a = {1, 1, 1, 1};
std::array<int, 4> b = { 1, 2, 3, 4 };
std::array<int, 4> c;
bool res = false;
for (int i = 0; i < a.size(); i++) {
    a[i] = rand() % 10;
}

for (int i = 0; i < 4; i++) {
    c[i] = a[i] + b[i];
}

智能编译器可以很好地编译到 SIMD 上面。但是如何编写像下面这样的比较也可以很好地编译为 SIMD;

res = a[0] <= b[0] && a[1] <= b[1] && a[2] <= b[2] && a[3] <= b[3]; // not compile to SIMD
4

1 回答 1

0

像这样的东西怎么样:

int res = 0;
#pragma omp simd reduction(+:res)
for (int i = 0 ; i < 4 ; i++) {
  res += a[i] < b[i];
}

?

如果您可以使输入正确对齐(并向 openmp pragma 添加对齐子句),它应该很快。特别是如果您的输入确实长于 4 个元素。

res将是 0-4 而不是 0 或 1,但这可能不是问题。SIMD 指令倾向于处理水平加法,但不处理水平位与。

于 2018-03-03T15:43:35.303 回答