通过内在函数或指令手动控制Intel MIC SIMD操作

时间:2014-02-17 04:06:52

标签: c++ assembly intel simd intel-mic

我想手动管理我的代码在MIC上的SIMD操作,并编写下面的内在函数

_k_mask = _mm512_int2mask(0x7ff); // 0000 0111 1111 1111
_tempux2_512 = _mm512_mask_loadunpacklo_ps(_tempux2_512,_k_mask, &u_x[POSITION_INDEX_X(k,j,i-5)]);
_tempux2_512 = _mm512_mask_loadunpackhi_ps(_tempux2_512,_k_mask, &u_x[POSITION_INDEX_X(k,j,i-5)]+16);

编译器icpc给出了这些错误消息。

test.cpp:574: undefined reference to `_mm512_mask_extloadunpacklo_ps'
test.cpp:575: undefined reference to `_mm512_mask_extloadunpackhi_ps'

如果我使用_mm512_mask_load_ps可以编译,但我的内存不能是64字节对齐的,所以使用_mm512_mask_load_ps会导致运行时错误。

然后我尝试像这样手动编写内联asm块

MOV rax,0x7ff
KMOV k1,rax
VMOVAPS zmm1 {k1}, [data_512_1]
VMOVAPS zmm2 {k1}, [data_512_2]
VMULPS  zmm3 {k1}, zmm2 zmm1
VMOVAPS [data_512_3] {k1}, zmm3

编译器icpc再次显示错误

test_simd.cpp(30): (col. 10) error: Unknown opcode KMOV in asm instruction .
test_simd.cpp(33): (col. 10) error: Syntax error ZMM1 in asm instruction vmulps.

我是汇编语言的初学者,如果有人能告诉我为什么icpc没有找到参考资料以及如何修复它,或者可以向我推荐一些材料,我将非常感激。 (我已阅读英特尔®至强融核™协处理器指令集架构参考手册,但仍不知道如何编写它。)

非常感谢。

1 个答案:

答案 0 :(得分:3)

您的目标似乎是AVX-512指令集,该指令集将在未来的桌面处理器和Xeon Phi协处理器中实现。当前一代Xeon Phi使用不同的指令集,通常称为KNCNIK1OM,它类似但与AVX-512不兼容(特别是AVX-512支持未对齐加载指令和KNCNI建议使用一对load-unpack-lo + load-unpack-hi指令用于相同的目的)。要编译KNCNI,您应该对英特尔编译器使用-mmic选项(将其视为-m64选项的替代,这使得编译器目标x86-64 ISA:结果代码将不能在正常的x86-64处理器上运行,反之亦然)。英特尔编译器的公开发行版尚不支持AFAIK AVX-512集,但很可能会使用新的-x选项。