LoginSignup
1
1

More than 5 years have passed since last update.

【私的メモ】AVX覚え書き

Posted at

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関数を使う

そのうち書く。。。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1