【问题标题】:Manually control Intel MIC SIMD operations by intrinsics or instructions通过内部函数或指令手动控制 Intel MIC SIMD 操作
【发布时间】:2014-03-16 05:52:32
【问题描述】:

我想手动管理我的代码在 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没有找到参考以及如何修复它,或者可以向我推荐一些材料,我将非常感激。 (我已经阅读了英特尔® 至强融核™ 协处理器指令集架构参考手册,但仍然不知道如何编写。)

非常感谢。

【问题讨论】:

  • 确保使用-mmic 选项进行编译

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


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。我想使用麦克风卸载模块,即程序在 cpu 上运行,但某些部分在协处理器上运行,_mm512_mask_loadunpacklo_ps 应该是您提到的指令的本质。有什么方法可以正确编译吗?我也需要程序在 cpu 上运行....software.intel.com/sites/products/documentation/doclib/iss/2013/…
  • 那么你应该只在定义__MIC__时使用Xeon Phi内在函数
  • 非常感谢!我想使用#ifndef MIC,但在我的文件中它是#ifdef MIC。非常感谢!!
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多