gpt4 book ai didi

c++ - `boost::simd::bitwise_and` 和类型兼容性

转载 作者:行者123 更新时间:2023-11-30 03:38:14 25 4
gpt4 key购买 nike

我的程序使用 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 应该会带来性能 boost 。但是,当尝试编译该变体时,我的编译器会打印出几页神秘的错误消息(与基于 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)的按位表示来进行计算,尽可能进行正确的优化。

关于c++ - `boost::simd::bitwise_and` 和类型兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39701185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com