Spo 600プロジェクトパート2

5155 ワード

覚えていない人のために、私は現在オープンソースプロジェクトにSVE 2命令を実装するプロジェクトに取り組んでいます.
最後の部分で、私はSVE 2命令を加えることができる優れた候補を探していました.
この部分はオープンソースディレクトリを調べ、スケーラブルなベクトル拡張をどのように実装できるかを見ます.
まず第一に、私は以前にプロジェクトのVCライブラリで動作することを決めた.https://github.com/VcDevel/Vc
検索の後、私はこのリポジトリはSSEとネオンより良いプロジェクトを持っていることがわかりました.
std - SIMDは私が取り組んでいたプロジェクトとほぼ同じですが、もう少し進められています.
ここでは、私の進捗状況を見ることができます.メンテーナチームと私が作っている進歩と共に
- 1 - https://github.com/VcDevel/std-simd
- 2 - https://github.com/VcDevel/Vc/issues/320
プルリクエスト:https://github.com/VcDevel/std-simd/issues/34
私はRIPOをクローニングし、コードを調べ始めました.
SIMD命令はありますか?はい.
https://github.com/VcDevel/std-simd/pull/35
SVEはありますか?いいえ.

しかし、SSEがあります.はい.

avxもあります.

また、建築をチェックしましょう.
x 86はい.

アーム/アーム64 .なし


すべてのファイルをチェックした後、コードの実行を開始することにしました.
がなかった.ssは少し怖くなりました、しかし、私は計画を持ちます.
既存のx 86関数をARM/ARM 64に切り替えるif if & defとなります.私はARM/64でSVE 2を実装しようとします.
オプションは何か
  • オートベクトル化
  • の陰謀
  • インラインアセンブリ
  • できることを見ましょう
    自動ベクトル化のための
  • は、ビルド命令を変更する必要がありますが、それは特定されませんし、Cコンパイラは常に何をすべきかを知ることができないと私たちの教授として.
  • イントリンシクスとインラインアセンブリは、ビルド命令だけでなくソースコードの変更であるため、複雑である.私がコードを少し見たので、それはマクロとして定義されて、その中に内在しています.

  • また、if文を別の命令で見つけました.
    simd.c 
    #if _GLIBCXX_SIMD_X86INTRIN
    #include "bits/simd_x86.h"
    #elif _GLIBCXX_SIMD_HAVE_NEON
    #include "bits/simd_neon.h"
    #elif __ALTIVEC__
    #include "bits/simd_ppc.h"
    #endif
    #include "bits/simd_math.h"
    
    
    私は自動ベクトル化から始めて、私が時間があるならば、ARM/ARM 64インラインアセンブリまたはintrinsicsで少し働くことに決めました.
    私たちには、まだハードウェアを持っていないので、時間の増加を見る機会がないことに注意したいです、しかし、少なくとも我々のコードを準備して、うまくそれを構築させてください.
    私は自動ベクトル化のためのライブラリ命令を読んで、別のマシンでビルドしようとした、単に私のビルドにフラグを追加します.
    gcc -O3 -march=armv8-a+sve2 ... // 03 flag to enable auto-vectorization
    
    gcc -O2 -march=armv8-a+sve2 -ftree-vectorize ... // or -ftre...
    
    私はARM 64とX 86のローカルコンピュータを持っているので、私は両方のマシンをチェックし、すべてが構築されました.しかし、前述のように、ハードウェアのために違いを見ることができません、しかし、少なくとも、我々はそれが将来の新しい建築で働くということを知っています.
    これに加えて、私はコードに深く飛び込むことを決めました、そして、おそらく少なくともSVE 2のためにintrinsicsを加えることを試みてください.
    ここでは、すべての進捗状況を見ることができます.私はすでにいくつかのファイルを変更しました.ヘッダを含める
    #include <arm_sve.h>
    
    とifdef文を書き、異なるアーキテクチャと命令を切り替える.
    私はパート3とそれ以降にこれ以上進行します、したがって、管理者は私の変更を彼らのコードに受け入れるかもしれません.
    プルリクエスト:
    https://github.com/VcDevel/std-simd/pull/35

    結論


    参考文献

    https://developer.arm.com/documentation/100987/0000/
    ⚠️ プルリクエスト:https://developer.arm.com/architectures/instruction-sets/intrinsics/#f:@navigationhierarchiessimdisa=[sve2]

    https://github.com/VcDevel/std-simd/pull/35 リンク


    🖇 で私について来てください
    🖇 フォローミーオン
    私のソフトウェアの移植性と最適化のクラスのために作られました.プロジェクト2