如何启用硬件支持的popcount来计数dynamic bitset库中Boost 1.64.0中的设置位?

最佳答案

#include <boost/dynamic_bitset.hpp>
#include <boost/function_output_iterator.hpp>
#include <cstddef>

std::size_t fn(boost::dynamic_bitset<> const & p)
{
    std::size_t acc = 0;

    boost::to_block_range(p, boost::make_function_output_iterator(
        [&acc](boost::dynamic_bitset<>::block_type v)
        {
            acc += __builtin_popcountll(v);
        }
    ));

    return acc;
}

编译为(g++ -O3 -march=native -c bitset.cpp -std=c++14):
  30:   48 8b 77 08             mov    0x8(%rdi),%rsi
  34:   48 8b 17                mov    (%rdi),%rdx
  37:   48 89 f0                mov    %rsi,%rax
  3a:   48 29 d0                sub    %rdx,%rax
  3d:   48 83 f8 07             cmp    $0x7,%rax
  41:   b8 00 00 00 00          mov    $0x0,%eax
  46:   7e 1d                   jle    65 <_Z3fn3RKN5boost14dynamic_bitsetImSaImEEE+0x35>
  48:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
  4f:   00
  50:   31 c9                   xor    %ecx,%ecx
  52:   48 83 c2 08             add    $0x8,%rdx
  56:   f3 48 0f b8 4a f8       popcnt -0x8(%rdx),%rcx
  5c:   48 01 c8                add    %rcx,%rax
  5f:   48 39 d6                cmp    %rdx,%rsi
  62:   75 ec                   jne    50 <_Z3fn3RKN5boost14dynamic_bitsetImSaImEEE+0x20>
  64:   c3                      retq
  65:   c3                      retq
  66:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  6d:   00 00 00

关于c++ - Boost库中用于动态位集的硬件支持的popcount,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46720932/

10-13 08:24