Sun 在 Solaris 11 上提供 GCC 的 _blsr_u64 标头?
Posted
技术标签:
【中文标题】Sun 在 Solaris 11 上提供 GCC 的 _blsr_u64 标头?【英文标题】:Header for _blsr_u64 with Sun supplied GCC on Solaris 11? 【发布时间】:2016-07-20 04:11:17 【问题描述】:我们有一些可在多个平台上运行的代码。该代码在可用时使用 BMI/BMI2 内在函数,例如 Core i7 5th gen。 Sun 在 Solaris 11.3 上提供的 GCC 定义了 __BMI__
和 __BMI2__
,但它无法定位 BMI/BMI2 内在函数:
$ cat test.cxx
#include <x86intrin.h>
int main(int argc, char* argv[])
unsigned long long t = argc;
#if defined(__BMI__) || defined(__BMI2__)
t = _blsr_u64(t);
#endif
return int(t);
$ /bin/g++ -march=native test.cxx -o test.exe
test.cxx: In function ‘int main(int, char**)’:
test.cxx:6:18: error: ‘_blsr_u64’ was not declared in this scope
t = _blsr_u64(t);
^
包含immintrin.h 并没有什么不同。
在 Solaris 11.3 上使用 GCC 时,我们为 _blsr_u64
包含哪个标头?
以下是来自 GCC 的相关定义:
$ /bin/g++ -march=native -dM -E - < /dev/null | sort | \
/usr/gnu/bin/egrep -i '(sse|aes|rdrnd|rdseed|avx|bmi)'
#define __AES__ 1
#define __AVX__ 1
#define __AVX2__ 1
#define __BMI__ 1
#define __BMI2__ 1
#define __core_avx2 1
#define __core_avx2__ 1
#define __RDRND__ 1
#define __RDSEED__ 1
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSSE3__ 1
#define __tune_core_avx2__ 1
以及 CPU 功能:
$ isainfo -v
64-bit amd64 applications
avx xsave pclmulqdq aes movbe sse4.2 sse4.1 ssse3 amd_lzcnt popcnt tscp
ahf cx16 sse3 sse2 sse fxsr mmx cmov amd_sysc cx8 tsc fpu prfchw adx
rdseed efs rtm hle bmi2 avx2 bmi1 f16c fma rdrand
和 GCC 版本:
$ /bin/g++ --version
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
【问题讨论】:
【参考方案1】:在 Solaris 11.3 上使用 GCC 时,我们为 _blsr_u64 包含哪个标头?
看起来#include <x86intrin.h>
是正确的。
问题是编译器调用需要-march=native -m64
,即使 64 位是本机的本机并且内核是 64 位:
$ /bin/g++ -march=native -m64 test.cxx -o test.exe
【讨论】:
即使 64 位是本机的并且内核是 64 位的: "Native mode" on Solaris is 32-bit.-march=native
从不影响 -m32 与 -m64 与 -mx32。如果优化选项可能会破坏您的 32 位构建(例如,通过制作不会与您的其他 32 位目标文件链接的 64 位 .o),那将非常不方便。它只是在目标 ISA 中启用指令集扩展(并设置-mtune
)以上是关于Sun 在 Solaris 11 上提供 GCC 的 _blsr_u64 标头?的主要内容,如果未能解决你的问题,请参考以下文章
在Sun Unix solaris 下安装Oracle8i 最好能给完整的安装步骤
求solaris sparc补丁144501-19,或最新版本的 sol-10-u11-ga-sparc-dvd.iso在simics虚拟机上的安装方法。
Solaris 上的 GCC - 在“0x00000002”之前解析错误
Java千百问_01基本概念(010)_Solaris操作系统是什么