2016-08-01 28 views
-1

嗨,我試圖使用英特爾intrinsics。所以我做了一個包含這樣的內部函數一些宏:使用__m512英特爾內在獲得可理解的錯誤

#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他們像這樣:

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"); 
} 

注意:我用gcc-4.9與Ubuntu 12.04和Eclipse火星作爲IDE 我還包括immintrin.h並使用標記-mavx512f。 可悲的是,我得到這些錯誤:

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' 

可能有人向我解釋的問題,或者有什麼不好呢?? 謝謝

+2

似乎你的工具鏈中的彙編程序不支持AVX512語法......你能否用'gcc'和'as'版本更新這個問題? – fritzone

+0

我懷疑2012年4月發行的發行版中的彙編程序支持AVX512。我很驚訝編譯器和immintrin.h支持'-mavx512',除非這些是backported。無論如何,目前的Ubuntu LTS版本是16.04,四年更新。 –

回答

2

您的宏是以容易出錯的方式定義的。它不能用作if指令的聲明。您應該使用:

#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) 

#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) 

關於你的問題,編譯器配置必須是不完整的,不一致的或過時。升級到更新的Ubuntu發行版。

+1

我希望OP不打算用'__M512_MM_SET_PS(__ m512 tmp,...)'來聲明+初始化一個變量。實際上,我沒有看到宏觀的重點,尤其是如果你打算給它起一個比英特爾內部名稱更長的名字的話。 –

+0

@PeterCordes:將內部函數放入宏中有一個目的,否則我甚至不會花費這些宏的麻煩。 –

+0

@chqrlie:我不確定升級Ubuntu是因爲我使用了一個名爲gem5的模擬器,它可能與較新版本的Ubuntu不兼容。 –