2016-07-20 34 views
2

Wir haben Code, der auf mehreren Plattformen läuft. Der Code verwendet BMI/BMI2 intrinsics, wenn verfügbar, wie ein Core i7 5. Gen. GCC von Sun auf Solaris geliefert 11.3 ist die Definition __BMI__ und __BMI2__, aber seine Probleme beim Auffinden BMI/BMI2 intrinsics:Header für _blsr_u64 mit Sun geliefert GCC auf Solaris 11?

$ 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); 
       ^

Einschließlich immintrin.h keinen Unterschied machen.

Welchen Header enthalten wir für _blsr_u64 bei Verwendung von GCC unter Solaris 11.3?


Hier sind die relevanten definiert von 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 

und CPU-Funktionen:

$ 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 

Und GCC-Version:

$ /bin/g++ --version 
g++ (GCC) 4.8.2 
Copyright (C) 2013 Free Software Foundation, Inc. 

Antwort

3

Welche Kopf fügen wir für _blsr_u64 bei Verwendung von GCC unter Solaris 11.3 ein?

Es sieht wie #include <x86intrin.h> ist richtig aus.

Das Problem war der Compiler Aufruf beide erforderlich -march=native -m64 obwohl 64-Bit ist für die Maschine nativen und der Kernel ist 64-Bit:

$ /bin/g++ -march=native -m64 test.cxx -o test.exe 
+1

* obwohl nativen 64-Bit für die Maschine ist und die Kernel ist 64-Bit: * ["Nativer Modus" unter Solaris ist 32-Bit] (https://docs.oracle.com/cd/E60778_01/html/E60745/bjapr.html#OSSSCGgewif). –

+1

'-march = native' betrifft nie -m32 vs. -m64 vs. -mx32. Das wäre sehr unpraktisch, wenn eine Optimierungsoption Ihren 32-Bit-Build zerstören könnte (z. B. indem Sie ein 64-Bit-.o erstellen, das keine Verbindung zu Ihren anderen 32-Bit-Objektdateien herstellt.) Es werden nur Befehlssatzerweiterungen innerhalb der Ziel-ISA aktiviert '-Mtune') –