我将boost::simd
用于我的程序。奇怪的是,与没有使用boost::simd
相比,整个程序运行速度更慢。我设法找到导致绝大多数CPU运行时间的行:
using pack_t = boost::simd::pack<double>;
using logical_pack_t = boost::simd::pack<boost::simd::logical<double>, pack_t::static_size>;
using iters_pack_t = boost::simd::pack<std::uint64_t, pack_t::static_size>;
static_assert(sizeof(double) == sizeof(std::uint64_t), "mismatch of pack sizes");
const iters_pack_t zero(0);
const iters_pack_t one(1);
iters_pack_t increment(1);
logical_pack_t condition = /* ... */;
increment = boost::simd::if_else(condition, one, zero); // bottleneck
increment = boost::simd::bitwise_and(increment, condition); // better version, doesn't compile
如源代码所述,我认为bitwise_and
应该会带来性能提升。但是,在尝试编译该变体时,我的编译器会打印出神秘错误消息的页面(与使用基于TMP的库一样)。我想这是因为increment
和condition
不是同一类型。这个假设得到以下事实的支持:一旦我将该行更改为无意义的increment = boost::simd::bitwise_and(increment, increment);
,代码就会编译。
The documentation声明两个操作数必须共享相同的位大小,就我的情况而言。因此,我不明白为什么我的代码不能编译。
在Ivy Bridge上使用-march=native
进行编译(AVX支持但不支持AVX2)。
答案 0 :(得分:2)
两件事:
您使用的是生活在NT2中的旧版boost.SIMD还是https://github.com/NumScale/boost.simd处的新版自治版?最新应该有更好的表现。
最好的做法是使用boost::simd::if_inc通过使用True(也称为-1)的按位表示来进行正确的优化,以便进行计算。