C++ 通过内部函数或指令手动控制英特尔麦克风SIMD操作

C++ 通过内部函数或指令手动控制英特尔麦克风SIMD操作,c++,assembly,intel,simd,intel-mic,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

我想在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没有找到参考资料以及如何修复它,或者向我推荐一些资料,我将不胜感激。(我读过英特尔至强Phi™ 协处理器指令集体系结构参考手册,但仍不知道如何编写。)


非常感谢。

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

请确保使用
-mmic
选项进行编译,以获得答复。我希望使用麦克风卸载模块,即程序在cpu上运行,但某些部分在协处理器上运行,\u mm512\u mask\u loadunpacklo\u ps应该是你提到的指令的本质。有没有正确编译它的方法?我也需要在cpu上运行程序…那么你应该只在
\uu MIC\uuuu
被定义时才使用Xeon Phi intrinsics谢谢!我想使用#ifndef MIC,但在我的文件中它是#ifdef MIC。非常感谢!!