问题标签 [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.
c - Intrinsic __lzcnt64 使用不同的编译选项返回不同的值
我有以下代码:
使用我得到的不同编译器和选项运行(显示的程序集):
铛
没有 -mlzcnt 的 GCC
带有 -mlzcnt 的 GCC
没有 -mlzcnt 的 G++
G++ 与 -mlzcnt
区别很明显是使用 -mlzcnt,但是我实际上是在 C++ 中工作,如果没有这个选项,它就不能在 g++ 上编译(clang++ 很好)。看起来当使用 -mlzcnt 时结果是 63-(没有 -mlzct 的结果)。是否有关于 gcc 的 -mlzcnt 选项的任何文档(我查看了信息文件,但找不到任何东西)?它会做更多选择 lzcnt 指令的事情吗?
assembly - 关于 bsr 和 lzcnt 的困惑
我对这两个指令有点困惑。首先,让我们丢弃扫描值为 0 且 undefined/bsr 或 bitsize/lzcnt 结果的特殊情况 - 这种差异很明显,不是我的问题的一部分。
让我们取二进制值0001 1111 1111 1111 1111 1111 1111 1111
根据英特尔的规范,结果为lzcnt
3
根据英特尔的规范,结果为bsr
28
lzcnt
计数,bsr
返回从位 0(即 lsb)的索引或距离。
如果 CPU 上没有可用的 BMI,这两条指令如何相同以及如何lzcnt
模拟?或者在 msbbsr
的情况下是位 0 ?bsr
英特尔规范中的两个“代码操作”也不同,一个从左侧计数或索引,另一个从右侧计数。
也许有人可以对此有所了解,我没有 CPU 没有BMI/lzcnt
指令来测试回退到是否bsr
具有相同的结果(因为扫描值 0 的特殊情况永远不会发生)。
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)
它们在英特尔编译器上的等价物是什么?铿锵声?
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
中定义的一个?
c++ - 为什么这两个高(64bx64b)函数会给出不同的结果?
我正在尝试在 AVX2 (更具体地说BMI2)上使用 MULX 内在函数编写以下内容。但他们没有给出相同的结果。
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
?
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.
c++ - 选择位掩码中与选择器位图中的 1 位重叠的设置位范围
鉴于:
- 一个位掩码
a
(比如std::uint64_t
),它至少包含一个 set (1
) 位。 - 选择器位掩码
b
,它是a
(iea & b == b
) 的子集,并且具有至少一个位集。
我想选择与 ina
中的位重叠的连续 1 位跨度b
:
XXXX 组为 0,c
因为b & XXXX
是假的。ZZ 组被复制,因为b
设置了 Z 位之一。c
出于同样的原因, 也设置了 YYY 组。请注意,b
在a
.
1
因此,对于s 中的每个连续组a
,将所有这些位设置为c
if在任何这些位置中b
有 a 。1
一个更复杂的例子:
是否有任何位逻辑指令/内在函数(MMX、SSE、AVX、BMI1/BMI2)或位操作技巧可以让我高效c
地 进行计算?(即没有循环)?a
b
额外的:
使用丹尼斯回答中的提示,我只能想象基于循环的算法:
assembly - MMX PANDN 和 BMI ANDN 有什么区别?
PANDN
MMX 指令和 BMI 1.0 指令有什么区别ANDN
?
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 版本: