使用 __m512 intel intrinsic 得到一个可以理解的错误
Getting an understandable error using __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); \
}
并像这样测试它们:
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 Mars 一起使用 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 [=13=]x1,%ymm1,%zmm0,%zmm0'
Error: bad register name `%zmm0'
Error: no such instruction: `vinsertf64x4 [=13=]x1,%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'
有人可以向我解释一下这个问题或者这有什么问题吗??
谢谢
您的宏定义方式容易出错。它不能用作 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 版本。
您好,我正在尝试使用英特尔内部函数。所以我制作了一些包含这样的内在函数的宏:
#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); \
}
并像这样测试它们:
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 Mars 一起使用 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 [=13=]x1,%ymm1,%zmm0,%zmm0'
Error: bad register name `%zmm0'
Error: no such instruction: `vinsertf64x4 [=13=]x1,%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'
有人可以向我解释一下这个问题或者这有什么问题吗?? 谢谢
您的宏定义方式容易出错。它不能用作 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 版本。