2016-08-01 35 views
-1

Hallo, ich versuche, Intel intrinsics zu verwenden. Also habe ich einige Makros gemacht, die die Spezifika wie folgt enthält:Bekomme einen verständlichen Fehler mit __m512 Intel intrinsic

#define __M512_MM_SET_PS(dest, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\ 
{                         \ 
dest = _mm512_set_ps(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0);  \ 
} 

andtest sie etwa so:

void test_intel_512() 
{ 
__M512_MM_SET_PS(vec1,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0,7.0); 
__M512_MM_SET_PS(vec2,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0); 
__M512_MM_ADD_PS(res,vec1,vec2); 
if (res[0]==9 && res[1]==9 &&res[2]==9 && res[3]==9 && res[4]==9 && res[5]==9 && res[6]==9 && res[7]==9 && 
    res[8]==9 && res[9]==9 && res[10]==9 && res[11]==9 && res[12]==9 && res[13]==9 && res[14]==9 && res[15]==9) 
    printf("Addition : OK!\n"); 
else 
    printf("Addition : FAILED!\n"); 
} 

Hinweis: Ich bin mit gcc-4.9 mit Ubuntu 12.04 und Eclipse Mars als IDE Ich bin auch einschließlich immintrin.h und mit den Flaggen -mavx512f. Leider, ich bin immer diese Fehler:

make all 
gcc -g -c -Wall -O0 -mavx -mavx512f test_inst.c -lm -o test_inst.o 

Assembler messages: 
Error: no such instruction: `vinsertf64x4 $0x1,%ymm1,%zmm0,%zmm0' 
Error: bad register name `%zmm0' 
Error: no such instruction: `vinsertf64x4 $0x1,%ymm1,%zmm0,%zmm0' 
Error: bad register name `%zmm0' 
Error: bad register name `%zmm0' 
Error: bad register name `%zmm0' 
Error: bad register name `%zmm0' 
Error: bad register name `%zmm0' 
Error: bad register name `%zmm0' 
Error: bad register name `%zmm1' 
Error: no such instruction: `kmovw %eax,%k1' 
Error: bad register name `%zmm1' 
Error: bad register name `%zmm0' 

könnte jemand das Problem mir erklären, oder was mit diesem ist falsch ?? Vielen Dank

+2

Es scheint, dass der Assembler in Ihrer Toolchain nicht mit Unterstützung für AVX512-Syntax kommt ... können Sie bitte die Frage mit den Versionen von 'gcc' und' as' aktualisieren? – fritzone

+0

Ich bezweifle, dass der Assembler, der von einer Distribution vom April 2012 ausgeliefert wird, AVX512 unterstützt. Ich bin überrascht, dass der Compiler und immintrin.h '-mavx512' unterstützen, sofern diese nicht zurückportiert wurden. Wie auch immer, die aktuelle Version von Ubuntu LTS ist 16.04, vier Jahre jünger. –

Antwort

2

Ihr Makro ist fehleranfällig definiert. Es kann nicht als Anweisung verwendet werden, die von if befohlen wird. Sie sollten entweder verwenden:

#define __M512_MM_SET_PS(dest,e15,e14,e13,e12,e11,e10,e9,e8,e7,e6,e5,e4,e3,e2,e1,e0) \ 
     (dest) = _mm512_set_ps(e15,e14,e13,e12,e11,e10,e9,e8,e7,e6,e5,e4,e3,e2,e1,e0) 

oder

#define __M512_MM_SET_PS(dest,e15,e14,e13,e12,e11,e10,e9,e8,e7,e6,e5,e4,e3,e2,e1,e0) \ 
     do { \ 
      (dest) = _mm512_set_ps(e15,e14,e13,e12,e11,e10,e9,e8,e7,e6,e5,e4,e3,e2,e1,e0); \ 
     } while (0) 

Zu Ihrer Frage, muss der Compiler-Konfiguration unvollständig, inkonsistent oder veraltet sein. Upgrade auf eine neuere Ubuntu-Version.

+1

Ich hoffe, dass das OP nicht deklariert + initialisiert eine Variable mit etwas wie '__M512_MM_SET_PS (__ m512 tmp, ...)'. Wirklich, ich sehe nicht den Sinn eines Makros dafür, vor allem nicht, wenn Sie ihm einen Namen geben wollen, der noch länger ist als Intels eigener Name. –

+0

@PeterCordes: Das Einfügen der Eigenschaftswerte in Makros hat einen Zweck in meinem Projekt, sonst werde ich nicht einmal die Mühe machen, diese Makros zu erstellen. –

+0

@chqrlie: Ich bin mir nicht sicher, ob ich Ubuntu upgraden soll, weil ich einen Simulator namens "gem5" verwende, der mit neueren Ubuntu-Versionen inkompatibel sein könnte. –