- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在以下链接中有一个非 simd intel 内在函数的部分: https://software.intel.com/sites/landingpage/IntrinsicsGuide/
这些包括像 bsf 和 bsr 这样的汇编指令。对于 SIMD 指令,我可以复制 c 函数并在包含正确的 header 后运行它。
对于非 simd 函数,如 _bit_scan_reverse
(bsr),我知道这个函数对于 gcc 是未定义的(隐式定义)。 GCC 具有类似的“内置函数”,例如__builtin_ctz
,但没有 _bit_scan_reverse
或 _mm_popcnt_u32
。为什么这些内在函数不可用?
#include <stdio.h>
#include <immintrin.h>
int main(void) {
int x = 5;
int y = _bit_scan_reverse (x);
printf("%d\n",y);
return 0;
}
最佳答案
看来我需要进行两个更改:
首先,包含 x86intrin.h
似乎是最佳实践,而不是更具体的包含。这似乎是特定于编译器的,并且在以下内容中有更详细的介绍:
Header files for x86 SIMD intrinsics
重要的是,如果不使用 gcc,您会有不同的包含。
其次,还需要启用编译器选项。对于 gcc,这些在以下内容中有详细说明:
https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
尽管缺少许多标志的文档。
由于我的目标是分发已编译的二进制文件,因此我想尝试避免 -march=native
我感兴趣的大多数“其他”内在函数都与位操作相关。Ye Olde Wikipedia 有一篇关于像 bmi2 这样重要的位操作内在群的不错的文章: https://en.wikipedia.org/wiki/Bit_Manipulation_Instruction_Sets
我需要 bmi2 用于 BZHI
(指令)或 _bzhi_u32
(c)
因此我可以通过类似的方式得到我想要的东西:
-mavx2 -mbmi2
使用 编辑: 似乎添加 bmi2 支持并没有添加 bmi1 和 abm,我可能一直在使用 __builtin 调用......我后来需要明确添加 -mbmi2
似乎足以获得 bmi1 和 abm 之类的东西(参见链接的维基百科页面了解定义),尽管我在链接的 gcc 页面中没有看到任何提及所以我可能错了......-mabm
和 -mbmi
以获得我想要的指令。正如 Peter Cordes 所建议的那样,最好以 Haswell -march=haswell
为起点,然后根据需要添加其他标志。 Haswell 是 2013 年第一款采用 AVX2 的处理器,所以在我看来 -march=haswell
基本上是在说,我希望你有一台 2013 年或更新的计算机。
此外,根据一些快速阅读,听起来 __builtin 的使用启用了必要的标志(SO 的 future 问题),尽管内在函数和内置函数之间似乎没有 1:1 的对应关系。更具体地说,并非所有内在函数似乎都作为内置函数包含在内,这意味着标志设置方法似乎是必要的,而不是总是使用内置函数而不用担心设置标志。此外,出于分发目的,了解正在使用哪些内在函数也很有用,因为在相当一部分计算机上似乎仍然缺少 bmi2(例如,我认为从 2015 年起需要 AMD)。
我仍然不清楚为什么仅使用英特尔文档中指定的包含不起作用,但此信息使我 99% 到达了我想要的位置。
关于c - 非simd intel intrinsic的隐式定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52902417/
我是一名优秀的程序员,十分优秀!