c++ - 使用带有矢量优化的 C++20 的 std::popcount 是否等同于 popcnt intristic?
问题描述
C++20 引入了许多新功能,例如std::popcount
,我使用Intel Intrinsic使用相同的功能。
我编译了这两个选项 - 可以在编译器资源管理器代码中看到:
- 使用英特尔的 AVX2 内在函数
- 使用 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 的实现似乎进行了相当大的优化。
推荐阅读
- python - 无法在烧瓶中应用 css 样式表(url_for() 问题)
- c# - Task.Run() 访问方法范围变量是否安全?
- javascript - 变量从 Flask 发送到 JS 后仍然未定义
- c++ - DX11 CreateDepthStencil 视图 - nullptr
- node.js - 是否可以通过单击加载页面的 DOM 来触发 puppeteer 的屏幕截图?
- r - 在 dplyr 函数调用中使用 = inside bquote
- amazon-web-services - Flutter:如何为 AWS S3 编写 PUT 请求
- c++ - 用于从多个线程一致地存储在原子变量中的 C++ 内存顺序
- ruby-on-rails - 如何在 Rails 测试中要求 gem?
- python - 使用熊猫图的不同列的不同线宽