Advanced Vector eXtensionとは、インテルCPUに搭載されたSIMD演算命令であり、
256bitのデータを一つのレジスタに格納して、同一演算を行うことが出来る。
で、気を抜くとすぐに書き方を忘れるので覚え書き程度に書いておこうっと。
gcc拡張を使う
移植性?何それうまいの?という人向け。
まずAVXの型を登録しておく
メモリのalignmentを256bitにしておく必要があるので、typedefしておく。
これは倍精度×4の場合。
typedef double v4df __attribute__((vector_size(32)));
更に、unionを使ってAVX型と通常の型の読み替えを簡素に出来るようにしておく。
union AVX{
v4df v;
double x[4];
};
もちろん演算子のオーバーロードとかを行っておくと本当は便利だけど今は取り敢えずお試しAVXという事で放置。
で、使ってみる。
int main(void){
AVX z;
AVX x = {. x = {1., 2., 3., 4.}};
AVX y = {. x = {2., 1., 4., 3.}};
z.v = x.v + y.v;
for(int i = 0 ; i < 4 ; ++ i){
std::cout << z.x[i] << std::endl;
}
return 0;
}
とまぁこんな感じ。
コンパイルオプションに-mavx着けるのを忘れないでおこう。
g++ foo.cpp -mavx
アウトプットはたぶん
3
3
7
7
…のはず。-S付けてアセンブラを見るとymm
レジスタが使われているので、AVX化されたと思えばいいのかしら?
intrinsic関数を使う
そのうち書く。。。