Intel Xeon Phi系列又称为MIC(Many integrated core),是Intel提供的高性能众核加速方案,拥有60左右的核心,具有高并发的特点,使用SIMD设备能够提供强大的性能。MIC加速卡的性能计算公式中使用的性能完全是其向量处理器VPU带来的性能,对于一个MIC上的应用,性能好坏也主要看代码向量化的程度,因此MIC的向量化技术是一个非常重要的问题。当然最重要的参考还是intel编译器的官方手册

数据结构

MIC向量化指令使用__m512系列变量(两个下划线)。在MIC的向量化指令函数中使用的__mm512变量被定义成了下表的这几种格式,每一个向量化变量,他的长度都是512bit。目前支持的变量有32位和64位的float,以及32位的int。

  1. __m512 单精度浮点向量(float32 vector)
  2. __m512i 整型向量(int32 vector)
  3. __m512d 双精度浮点向量(float64 vector)

另外还有一种格式:__mmask16,实质上是一个unsigned short类型,使用这种变量来表示一些mask操作(掩码操作)。

内存中的变量需要先进行对齐才能被存取成向量化变量,使用declspec align(64)来进行对齐,或者使用_mm_malloc()函数申请对齐的数组。

指令结构

MIC一代产品的向量化指令并不全,不支持完整的shuffle等操作,下一代MIC的向量化产品会很好的解决这些问题。MIC向量化操作支持mask操作,也就是掩码操作,能够通过使用掩码实现条件写入,进位,借位,结果比较等操作。其指令函数名大致可以分为4个部分,使用”_“来隔开,这4个部分的含义如下:

  1. 第一个部分是_mm512(1个下划线)。表示使用的是MIC的512位向量指令。
  2. 第二个部分为是否使用掩码,如果使用掩码这部分是mask,不使用掩码这部分为空。
  3. 第三部分为操作函数名称,如add,fmadd,这里的定义有很多,有时候会不止一个单词,但大致可归为是操作名称。
  4. 第四部分是操作的数据结构。ps表示操作向量是单精度浮点,pd表示操作向量是双精度浮点数,epi32表示操作向量是32位有符号整型,epu32表示操作向量是32位无符号整型。

四个部分组合起来就形成了一个向量操作函数,如不带mask的_mm512_add_ps,带mask的_mm512_mask_add_ps

指令的第三部分非常众多,组成了丰富的向量指令集。使用的时候查阅官方手册找intrinsics部分,找适合自己算法的指令来进行优化,这里就不详细介绍了。