c++ - 如何编写编译器可以优化到 SIMD 比较的代码?

标签 c++ visual-c++ x86 simd auto-vectorization

<分区>

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

最佳答案

这样的事情怎么样:

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 指令倾向于处理水平加法而不是水平位与。

关于c++ - 如何编写编译器可以优化到 SIMD 比较的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49082728/

相关文章:

c++ - 如何使用模板特化来查找成员函数参数类型等?

python - 在 C++ 中运行经过训练的 keras 模型

visual-c++ - 如何在托管 C++ 中检查 "NULL object reference"?

c++ - 调用DLL函数问题

c++ - 基于 OpenCV 边缘的物体检测 C++

android - opensuse 12.1 64 位 - Android - 加载共享库时出错 : libz. so.1

assembly - 为什么在此函数代码的序言中从堆栈指针中减去 0x20?

c++ - 机器视觉 8 位 Bayer RGGB 到 Opencv 中的 RGB

C++ 模板,在不初始化的情况下声明对象

assembly - 使用监控/等待指令