オープンソースライブラリへのSVE 2サポートの追加-パート1


SVEはAIMD 64への拡張として使用される新しいSIMD命令セットとしてARMによって開発されました.sve 2はsveとその前駆体,neonの超集合である.SVEとSVE 2の多くの利点の中で、1つは異なるバイナリが異なったベクトル長実装で異なるAARR 64ハードウェアで動くことができるということです.それは特に大きなデータセットを処理するのに適しています、そして、この理由のために、私はパフォーマンスを改善するためにオープンソース図書館でその使用を実行しています.
私の第一の課題は、オープンソースライブラリを使って、暗号化やマルチメディアライブラリのような大量のデータを処理するのに理想的に使われるSVE 2サポートを実装することです.私はオーディオとオーディオプログラミングに興味があるので、私はそこを見始めて、うまくいけば良い候補を見つけます.検索の基準は次のとおりです.
  • オープンソース
  • ライブラリレベルパッケージ、アプリケーションレベルのSVE 2最適化は役に立ちません
  • 理想的には、私がSVE 2実装にどのようにアプローチするかについてのアイデアをつかむために、ネオンの実装が既にあります
  • 私が知っているオープンソースのオーディオアプリケーションを考えることから始めました.私は私のprofとしてDNFリストを使用して、Aarcha 64サーバー上のパッケージを調べて、1つが利用可能であることを確認しました.

    DNF Deplistを使用して、依存関係が何をしようとしていたかを調べて、最適化のための良いターゲットとなります.良い候補となるライブラリがいくつかありました.

    高度なLinuxサウンドアーキテクチャライブラリ



    無料ロスレスオーディオコーデック



    リボルガ



    そこから、私はソースコードへのアクセスを得るためにFLACライブラリをチェックして、SVE 2最適化がどのように働くことができるかについて詳しく知る.彼らのウェブサイトのGit URLはダウンしました、それで、彼らがパンを出さないならば、私が現在他の図書館と円をそれをチェックするために、現在それを残しました.
    私はpage 関連する情報を使用してALSAライブラリをクローン化し、そうしました.
    git clone git://git.alsa-project.org/alsa-lib.git alsa-lib
    
    残念ながら、多くの検索の後、何かを見つけることができなかったSVE、ネオン、またはAARR 64固有の実装に関連する何かを見つけるしようとした.もう一度、私は私が壁に当たったならば、これに行って、円に戻るつもりです.
    私のリストの最後はliboggです.私は、それが位置するとわかりましたhere そして、FLACを維持する同じ組織によって維持されます.ありがたいことに、このgitリンクは壊れていませんでした.残念ながら、私は再びネオンやSIMDへのリファレンスを探しているときに空になってきたので、私は様々なXIPHプロジェクトを通して検索を拡大しました.そうすることで、私は偉大な候補を見つけました.

    インopus/cmake/OpusFunctions.cmake CPUとコンパイラがネオンをサポートするかどうかをチェックすることができました.

    これは、このパッケージがSimdを利用していることを示します.
    ライブラリを設定した後、私はMakefileを見つけることができ、それを使用してコンパイルオプションを参照してください.この場合、次のようになりました.
    CFLAGS = -g -O2 -fvisibility=hidden -D_FORTIFY_SOURCE=2 -W -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes
    
    これを水平にする-O3 SET 2 AutoVectorizationの最適化を蹴るために取得し、さらに私はこのパッケージは、例えばopus/celt/arm/pitch_neon_intr.c ソースファイル:
    for (i = 0; i < N - 7; i += 8) {
            x_s16x8  = vld1q_s16(&x[i]);
            y_s16x8  = vld1q_s16(&y[i]);
            xy_s32x4 = vmlal_s16(xy_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y_s16x8));
            xy_s32x4 = vmlal_s16(xy_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y_s16x8));
        }
    
    これは起動するのに良い場所になるでしょうpitch_neon_intr.c //celt_neon_intr.c Sin 2バージョンのイントリンクスでは、このパッケージをSVE 2用に最適化することでボールをローリングできます.私は、そうするために私の意図を表現しているOpus開発者メーリングリストに電子メールを送りました.もっとすぐに.