我想在 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 没有找到参考以及如何修复它,或者可以向我推荐一些材料,我将不胜感激。(我已经阅读了英特尔®至强融核™协处理器指令集架构参考手册,但仍然不知道如何编写。
多谢。
您似乎以AVX-512
指令集为目标,该指令集将在未来的台式机处理器和至强融核协处理器中实现。当前一代的至强融核使用不同的指令集,通常称为KNCNI
或K1OM
,这是相似的,但与AVX-512
不兼容(特别是,AVX-512
支持未对齐的加载指令,KNCNI
建议使用一对加载-解包-lo + load-unpack-hi 指令用于相同的目的)。要针对KNCNI
进行编译,您应该使用英特尔编译器-mmic
选项(将其视为-m64
选项的替代方法,该选项使编译器目标x86-64
ISA:生成的代码不会在普通的 x86-64 处理器上运行,反之亦然)。AFAIK AVX-512
集在英特尔编译器的公开版本中尚不受支持,但很可能将使用新的-x
选项。