问题标签 [bmi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2873 浏览

c - Intrinsic __lzcnt64 使用不同的编译选项返回不同的值

我有以下代码:

使用我得到的不同编译器和选项运行(显示的程序集):

没有 -mlzcnt 的 GCC

带有 -mlzcnt 的 GCC

没有 -mlzcnt 的 G++

G++ 与 -mlzcnt

区别很明显是使用 -mlzcnt,但是我实际上是在 C++ 中工作,如果没有这个选项,它就不能在 g++ 上编译(clang++ 很好)。看起来当使用 -mlzcnt 时结果是 63-(没有 -mlzct 的结果)。是否有关于 gcc 的 -mlzcnt 选项的任何文档(我查看了信息文件,但找不到任何东西)?它会做更多选择 lzcnt 指令的事情吗?

0 投票
2 回答
5041 浏览

assembly - 关于 bsr 和 lzcnt 的困惑

我对这两个指令有点困惑。首先,让我们丢弃扫描值为 0 且 undefined/bsr 或 bitsize/lzcnt 结果的特殊情况 - 这种差异很明显,不是我的问题的一部分。

让我们取二进制值0001 1111 1111 1111 1111 1111 1111 1111

根据英特尔的规范,结果为lzcnt3

根据英特尔的规范,结果为bsr28

lzcnt计数,bsr返回从位 0(即 lsb)的索引或距离。

如果 CPU 上没有可用的 BMI,这两条指令如何相同以及如何lzcnt模拟?或者在 msbbsr的情况下是位 0 ?bsr英特尔规范中的两个“代码操作”也不同,一个从左侧计数或索引,另一个从右侧计数。

也许有人可以对此有所了解,我没有 CPU 没有BMI/lzcnt指令来测试回退到是否bsr具有相同的结果(因为扫描值 0 的特殊情况永远不会发生)。

0 投票
1 回答
1892 浏览

gcc - 英特尔编译器/LLVM 上的并行位存储/并行位提取?

对于带有BMI2指令的 CPU,可以使用内置函数在 GCC 中使用并行位存储 (pdep) 和并行位提取 (pext) :

  • unsigned int _pdep_u32 (unsigned int, unsigned int)
  • unsigned int _pext_u32 (unsigned int, unsigned int)
  • unsigned long long _pdep_u64 (unsigned long long, unsigned long long)
  • unsigned long long _pext_u64 (unsigned long long, unsigned long long)

它们在英特尔编译器上的等价物是什么?铿锵声?

0 投票
1 回答
2665 浏览

gcc - mulx 指令的内在函数

mulx指令是从 Haswell 处理器开始的 BMI2 指令集引入的。

根据英特尔的文档,应该有一个内在的mulx

但是,我在 BMI2 下或一般情况下的英特尔内在指南中没有找到这样的内在指南。但是,我确实从 ADX 指令集中找到了 addcarry 内在函数。

根据这个链接,内在是mulx_u64但我也没有找到那个。

MSVC 在 MSVC 2005 中添加了一个_umul128 内在函数,但这只会产生mul而不是mulx(我不知道如何在 MSVC 中启用 BMI2)。

我可以在 GCC 中使用(或)mulx间接生成指令,但我更愿意使用内在函数更直接地执行此操作。__int128-mbmi2-march=haswell

为什么存在 ADX 内在函数,但不存在英特尔文档mulx中定义的一个?

0 投票
1 回答
138 浏览

c++ - 为什么这两个高(64bx64b)函数会给出不同的结果?

我正在尝试在 AVX2 (更具体地说BMI2)上使用 MULX 内在函数编写以下内容。但他们没有给出相同的结果。

0 投票
1 回答
1473 浏览

gcc - 如何检查我的 ifunc 解析器中是否有 BMI2 指令?

我想使用_bzhi_u32内在函数,但如果运行可执行文件的处理器不支持BMI2指令集,我想恢复为常规 C 实现。

我正在使用 GCC 4.8.3,我有以下

我最初想用来__builtin_cpu_support()明确检查,BMI2但似乎你不能用__builtin_cpu_support(). 我目前的检查corei7似乎也不完美,因为据我了解 i7 Haswell 的某些移动版本没有BMI2(我尝试在 i7-3520@2.9GHZ 上的 Windows 7 上运行的 VirtualBox Linux 客户机上,它引发了 a SIGILL Illegal Instruction)。

那么有没有一种故障安全的方法来检查BMI2

0 投票
2 回答
2023 浏览

c++ - Compiler macro to detect BMI2 instruction set

I was searching on the web to find a proper solution, without much success. So I hope one of you know something about it: Is there any way to detect the "Intel Bit Manipulation Instruction Sets 2" (BMI2) compile time? I want to make some conditional thing based on the availability of it.

0 投票
1 回答
376 浏览

c++ - 选择位掩码中与选择器位图中的 1 位重叠的设置位范围

鉴于:

  • 一个位掩码a(比如std::uint64_t),它至少包含一个 set ( 1) 位。
  • 选择器位掩码b,它是a(ie a & b == b) 的子集,并且具有至少一个位集。

我想选择与 ina中的位重叠的连续 1 位跨度b

XXXX 组为 0,c因为b & XXXX是假的。ZZ 组被复制,因为b设置了 Z 位之一。c出于同样的原因, 也设置了 YYY 组。请注意,ba.

1因此,对于s 中的每个连续组a,将所有这些位设置为cif在任何这些位置中b有 a 。1一个更复杂的例子:

是否有任何位逻辑指令/内在函数(MMX、SSE、AVX、BMI1/BMI2)或位操作技巧可以让我高效c地 进行计算?(即没有循环)?ab


额外的:

使用丹尼斯回答中的提示,我只能想象基于循环的算法:

0 投票
0 回答
153 浏览

assembly - MMX PANDN 和 BMI ANDN 有什么区别?

PANDNMMX 指令和 BMI 1.0 指令有什么区别ANDN

0 投票
1 回答
185 浏览

c++ - Sun 在 Solaris 11 上提供 GCC 的 _blsr_u64 标头?

我们有一些可以在多个平台上运行的代码。该代码在可用时使用BMI/BMI2内在函数,例如 Core i7 5th gen。Sun 在 Solaris 11.3 上提供的 GCC 定义了__BMI__and __BMI2__,但它在定位 BMI/BMI2 内部函数时遇到了问题:

包括immintrin.h并没有什么不同。

_blsr_u64在 Solaris 11.3 上使用 GCC 时,我们包含哪个标头?


以下是 GCC 的相关定义:

和CPU特点:

和 GCC 版本: