首页 > 解决方案 > 使用带有矢量优化的 C++20 的 std::popcount 是否等同于 popcnt intristic?

问题描述

C++20 引入了许多新功能,例如std::popcount,我使用Intel Intrinsic使用相同的功能。

我编译了这两个选项 - 可以在编译器资源管理器代码中看到:

  1. 使用英特尔的 AVX2 内在函数
  2. 使用 std::popcount 和 GCC 编译器标志“-mavx2”

除了 std 模板中使用的类型检查之外,生成的汇编代码看起来是相同的。

在与操作系统无关的代码和具有相同优化方面 - 假设使用std::popcount和 apt 编译器向量优化标志比直接使用内在函数更好吗?

谢谢。

标签: c++language-lawyerc++20intrinsicsavx2

解决方案


技术上没有。(但实际上,是的)。C++ 标准仅指定 的行为popcount而不是实现(请参阅[bit.count])。

实现者可以做任何他们想做的事情来实现这个行为,包括使用popcnt内在函数,但他们也可以编写一个 while 循环:

int set_bits = 0;
while(x)
{
   if (x & 1)
      ++set_bits;
   x >>= 1;
}
return set_bits;

这是[bit.count]标准中的完整措辞:

template<class T>
constexpr int popcount(T x) noexcept;

约束T是无符号整数类型([basic.fundamental])。
返回: 的1值中的位数x

现实吗?编译器编写者非常聪明,并且会对其进行优化以尽可能多地使用内在函数。例如,gcc 的实现似乎进行了相当大的优化。


推荐阅读