使用 C++20 的 std::popcount 和向量优化是否等同于 popcnt 内在?

问题描述

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

我编译了这两个选项 - 可以在 Compiler Explorer code 中看到:

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

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

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

谢谢。

解决方法

技术上否。(但实际上,是的)。 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's implementation 似乎得到了相当大的优化。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...