SDE + gcc 4.9 で AVX512 命令を試す

2014 年に Knights Landing が市場に投入されて AVX512 命令も一般的に使えるようになりそうですね.

Intel SDE(シミュレータ) と AVX512 対応 gcc を使って一足先に AVX512 命令を試してみましょう.

http://software.intel.com/en-us/articles/intel-software-development-emulator

から

– SDE
– GCC
– binutils

を落としましょう. 以下のようなコードを用意します.

#include <immintrin.h>

#include <stdio.h>

void fa(__m512* c, __m512* a, __m512* b)
{
  (*c) = _mm512_add_ps(*a, *b);
}

int
main(
  int argc,
  char** argv)
{
  __m512 a, b, c;

  a = _mm512_set_ps(argc , argc+1, argc+2, argc+3, argc+4, argc+5, argc+6,
    argc+7, argc+8, argc+9, argc+10, argc+11, argc+12, argc+13,
    argc+14, argc+15);
  b = a;

  fa(&c, &a, &b);

  float ret[16];
  _mm512_storeu_ps(ret, c);

  int i;
  for (i = 0; i < 16; i++) {
    printf("c[%d] = %f\n", i, ret[i]);
  }

  return 0;
}

AVX512 対応 gcc と binutils でコンパイルを行います. AVX512 命令を有効にする場合は -mavx512f オプションを付けます.

$ x86_64-unknown-linux-gnu-gcc-4.9.0 -S -mavx512f main.c

zmm レジスタを使う vaddps 命令が出力されているのを確認します

vaddps  %zmm1, %zmm2, %zmm0{%k1}

AVX512 対応 binutils でアセンブルしてバイナリを作ります.

$ as -o main.o main.s

$ gcc main.o

SDE で実行します. -knl フラッグを付けます.

$ sde64 -knl — ./a.out

 ./a.out                                                                        
c[0] = 32.000000
c[1] = 30.000000
c[2] = 28.000000
c[3] = 26.000000
c[4] = 24.000000
c[5] = 22.000000
c[6] = 20.000000
c[7] = 18.000000
c[8] = 16.000000
c[9] = 14.000000
c[10] = 12.000000
c[11] = 10.000000
c[12] = 8.000000
c[13] = 6.000000
c[14] = 4.000000
c[15] = 2.000000

期待する結果が出ましたね!

Happy AVX512 coding!