【问题标题】:Standard C++11 code equivalent to the PEXT Haswell instruction (and likely to be optimized by compiler)等效于 PEXT Haswell 指令的标准 C++11 代码(并且可能由编译器优化)
【发布时间】:2014-02-04 07:46:57
【问题描述】:

Haswell 架构提出了几个新指令。其中之一是PEXT (parallel bits extract),其功能由这张图片解释(来源here):

它接受一个值r2 和一个掩码r3 并将r2 的提取位放入r1

我的问题如下:纯标准 C++11 中优化的模板化函数的等效代码是什么,将来编译器可能会针对该指令进行优化.

【问题讨论】:

  • 我认为编译器永远不会尝试确定一个函数是否正在执行此操作并将其编译为单个指令。如果有一些内置的方法可以做到这一点,当然,但每个人都会有不同的实现。所以我不确定你的问题是否可以回答。
  • 我想不出你需要这样做的理由。为什么是模板?
  • 希望我能对 cme​​ts 投反对票。格雷厄姆,仅仅因为你不需要到处乱搞并不会使问题无效。当您编写低级代码(压缩?图形?)时,快速位杂耍可能非常有价值。
  • 这个问题变相重复了? stackoverflow.com/questions/21141848 这是否仍然适用于进行数十亿次迭代的超级计算机?
  • @Mehrdad 您的评论无效。文森特,如果你想要这条指令,你可以通过内联汇编直接使用它,而不是在 C++ 中解决它。这样,您可以确定编译器执行您想要的操作,并且阅读起来应该更清晰。你用的是什么编译器?

标签: c++ c++11 bit-manipulation compiler-optimization instruction-set


【解决方案1】:

这里是来自 Matthew Fioravante 的 stdcxx-bitops GitHub reposome code,它是 floated to the std-proposals 邮件列表,作为为 C++ 添加 constexpr 位运算库的初步建议。

#ifndef HAS_CXX14_CONSTEXPR
#define HAS_CXX14_CONSTEXPR 0
#endif

#if HAS_CXX14_CONSTEXPR
#define constexpr14 constexpr
#else
#define constexpr14
#endif

//Parallel Bits Extract
//x    HGFEDCBA
//mask 01100100
//res  00000GFC
//x86_64 BMI2: PEXT
template <typename Integral>
constexpr14 Integral extract_bits(Integral x, Integral mask) {
  Integral res = 0;
  for(Integral bb = 1; mask != 0; bb += bb) {
    if(x & mask & -mask) {
      res |= bb;
    }
    mask &= (mask - 1);
  }
  return res;
}

【讨论】:

  • 如果它优化到 x86-64 上的 pext,这很有趣......它是否也优化到其他架构上的“一些很酷的东西”(我的主要应用程序是 morton 解码)。此外,这是否也在 C 中的 gcc 或 clang 中进行了优化(不使用模板)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2013-03-11
相关资源
最近更新 更多