`boost :: simd :: bitwise_and`和类型兼容性

时间:2016-09-26 11:06:22

标签: c++ boost simd avx

我将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的库一样)。我想这是因为incrementcondition不是同一类型。这个假设得到以下事实的支持:一旦我将该行更改为无意义的increment = boost::simd::bitwise_and(increment, increment);,代码就会编译。

The documentation声明两个操作数必须共享相同的位大小,就我的情况而言。因此,我不明白为什么我的代码不能编译。

在Ivy Bridge上使用-march=native进行编译(AVX支持但不支持AVX2)。

1 个答案:

答案 0 :(得分:2)

两件事:

  • 您使用的是生活在NT2中的旧版boost.SIMD还是https://github.com/NumScale/boost.simd处的新版自治版?最新应该有更好的表现。

  • 最好的做法是使用boost::simd::if_inc通过使用True(也称为-1)的按位表示来进行正确的优化,以便进行计算。