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

`boost::simd::bitwise_and` and type compatibility

我的程序使用 boost::simd。奇怪的是,与不使用 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)。

两件事:

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

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