Vector APIを理解するためにSIMD命令をCで試す

JavaVector APISIMD命令を呼び出すためのAPIです。
ということで、実際にSIMD命令を知っておいたほうが理解が深まる気がします。
ただ、直接SIMD命令を試すのはめんどいので、C++から呼びだしてみます。

Cの文法とかだいぶ忘れてるというか知らないものが多いので、適当にぐぐりながら書いてみました。

#include<cstdio>
#include<x86intrin.h>

typedef __attribute__((aligned(32))) struct {
    double x;
    double y;
    double z;
    double w;
} Vec;

int main(void) {
  Vec v1 = {2, 3,4, 0};
  Vec v2 = {3, 4, 5,0};
  const __m256d d1 = _mm256_load_pd((double*)&v1);
  const __m256d d2 = _mm256_load_pd((double*)&v2);
  const __m256d r = _mm256_add_pd(d1, d2);
  Vec *v3 = (Vec*)&r;
  printf("%f, %f, %f\n", v3->x, v3->y, v3->z);
}

最初まったくコンパイルが通らなくてあきらめたんだけど、 Twitterで-mavx2とかつければいいと教えてもらいました。
https://twitter.com/objectxplosive/status/1165307957417930752

$ gcc -mavx2 hello.cpp -o hello
$ ./hello
5.000000, 7.000000, 9.000000

無事うごいた。