2016-03-29 9 views
2

I-Code wie dieses:undefined reference to `_addcarry_u64'

uint8_t carry; 

carry = 0; 
for (i = 0; i < 8; i++) 
    carry = _addcarry_u64 (carry, *(buf1 + i), 
      *(buf2 + i), buf1 + i); 

Und der folgende Fehler:

undefined reference to `_addcarry_u64' 

ich kompilieren mit Fahnen:

CCFLAGS = -Wall -g -msse -msse2 -msse3 -msse4 -mavx -mavx2 -fopenmp 

ich auch:

#include <immintrin.h> 
#include <emmintrin.h> 
#include <pmmintrin.h> 
#include <smmintrin.h> 
#include <omp.h> 

Die gleiche Art von Problem habe ich beim Versuch, bittest Funktion von intrinsics zu verwenden.

Ich benutze x86_64 Ubuntu 14.04 und GCC-Compiler.

+0

verwandten http://stackoverflow.com/questions/29229371/addcarry-u64-and-addcarryx-u64-with-msvc-and-icc – Samer

+0

nicht finden die Antwort dort auf meine Frage – Artyom

+0

Sie GCC benötigen 5.1 oder höher ... – isedev

Antwort

4

wurde in GCC 5.1 hinzugefügt. Sie müssen auch die Spezifika sind:

#include <x86intrin.h> 

Dann wird Ihr Beispiel kompiliert, wie Sie on the Godbolt compiler explorer sehen können.


Für die damit verbundenen _addcarryx_u64 intrinsischen zu kompilieren eigentlich zu ADCX/ADOX, müssen Sie auch -madx Code-gen mit der ADX Befehlssatzerweiterung zu ermöglichen. -march=native wird dies auf Hosts einschließen, die es unterstützen (siehe /proc/cpuinfo), und auch -mtune=native aktivieren.

Sie benötigen auch eine neuere Version von gcc (die noch nicht existiert). gcc curently (2016) just compiles it to correct code using the normal adc.

+0

yeah, das hat sehr geholfen, danke – Artyom

+0

@jww: behoben deine Bearbeitung: _addcarryx_u64 und _addcarry_u64 aren Das selbe. (Obwohl meine Vermutung ist, dass beide in einer zukünftigen gcc- und clang-Version mit "-madx" zu ADCX/ADOX kompilieren werden. Wenn Sie dem Compiler mitteilen, dass das Ziel dies unterstützt, warum sollte er es * nicht * benutzen, wenn es mehr machen kann effizienter Code?) –

Verwandte Themen