JavaのVector APIはSIMD命令を呼び出すための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
無事うごいた。