【发布时间】:2018-03-03 09:32:21
【问题描述】:
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
【问题讨论】:
-
您使用什么编译器和编译器选项?
-
如果你使用 gcc 可能是
__attribute__ ((vector_size (16)))? -
Visual Studio 2015,x64,完全优化 (/Ox),高级矢量扩展 2 (/arch:AVX2),@BasileStarynkevitch
-
我不抱太大希望,这需要
movmskps-ing 从向量中比较结果并对其进行标量比较,这不是我见过 MSVC 在其上做的事情拥有。
标签: c++ visual-c++ x86 simd auto-vectorization