プロジェクトステージ3


導入


これはTECCAです、そして、このポストはプロジェクトの概要です.
ステージ2では、プロジェクトにオートベクトル化を実装し、このポストでいくつかの詳細について行き、オートベクトル化が適用されなかった場所があるかどうかを確認します.

キャップ


を実行する前に



自動ベクトル化を適用した後、qemu - aarch 64上でdjpegを実行した後



自動ベクトル化後のwhileloの数



私は、上記のスクリーンショットを明らかにAutoVectorizationが正常にプロジェクトに適用されたことを示し、元の関数djpegはクラッシュせずにうまく動作します.しかし、私はすべての必要な場所が自動ベクトル化されたかどうか.
私はqemu - aarch 64の性質のためにqemu - aarch 64の性質のために、私の実装が実際に元のコードより遅く走ると信じています.
とにかく、すべてのベクトル化されたファイルのログを取得し、ベクトル化ファイルを取得するには、私はステージ2でやった方法を再構築する必要があります.
make -j$((`nproc`+1)) |& tee make.log
これを通じて、makeプロセスの詳細をmakeに保存します.ログファイル.

我々は、ログから、間違いなく自動ベクトル化から“逃した”場所があることを伝えることができます.

詳細ベクトルファイルの詳細




上記のスクリーンショットからわかるように、ベクトル化されたファイルの量は、ベクトル化されていないファイルよりも少ない.
私の推測は、大量のデータを処理するループを持つファイルだけが自動ベクトル化によって最適化されるということです.なぜなら、大量のデータを処理しないループを最適化することは、自動ベクトル化からの利益が非常に少ないからです.そして、重要なループがより重要なものより少ない方法であるということを意味します.

別のベクトル化


変数の長さと指定バイトベクトル

ベクトル化されたコードを調べて修正を適用しようとする


私はベクトル化されていないコードを変更しようとすると、手動で自動ベクトル化できるかどうかを確認してください.しかし、私がしようとする方法のどれも、そこに様々な理由がある可能性があり、それは実際に作るために説明されました.ログ.
私は少しの研究をしました、そして、いくつかはほとんどの場合、C/C++コンパイラが定義されたベクトル化テンプレートにその構造にマッチすることができないので、forループをベクトル化できないと言います.

結論


3つのステージを通して、私は最適化のための候補オープンソースパッケージを選択しました、ステージ3で、私は手動でSVE 2サポートを加えることを試みました、しかし、私はソースコードを変更することによってより多くのベクトル化を加えることができませんでした、しかし、私は首尾よくコンパイラオプションを修飾することによって、おそらく、おそらく、ライブラリのすべての必要な場所にステージ2で自動ベクトル化を加えました.