オープンソースライブラリへのSVE 2サポートの追加-パート1
3815 ワード
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を使用して、依存関係が何をしようとしていたかを調べて、最適化のための良いターゲットとなります.良い候補となるライブラリがいくつかありました.
そこから、私はソースコードへのアクセスを得るためにFLACライブラリをチェックして、SVE 2最適化がどのように働くことができるかについて詳しく知る.彼らのウェブサイトのGit URLはダウンしました、それで、彼らがパンを出さないならば、私が現在他の図書館と円をそれをチェックするために、現在それを残しました.
私はpage 関連する情報を使用してALSAライブラリをクローン化し、そうしました.
私のリストの最後はliboggです.私は、それが位置するとわかりましたhere そして、FLACを維持する同じ組織によって維持されます.ありがたいことに、このgitリンクは壊れていませんでした.残念ながら、私は再びネオンやSIMDへのリファレンスを探しているときに空になってきたので、私は様々なXIPHプロジェクトを通して検索を拡大しました.そうすることで、私は偉大な候補を見つけました.
イン
これは、このパッケージがSimdを利用していることを示します.
ライブラリを設定した後、私はMakefileを見つけることができ、それを使用してコンパイルオプションを参照してください.この場合、次のようになりました.
私の第一の課題は、オープンソースライブラリを使って、暗号化やマルチメディアライブラリのような大量のデータを処理するのに理想的に使われるSVE 2サポートを実装することです.私はオーディオとオーディオプログラミングに興味があるので、私はそこを見始めて、うまくいけば良い候補を見つけます.検索の基準は次のとおりです.
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開発者メーリングリストに電子メールを送りました.もっとすぐに.Reference
この問題について(オープンソースライブラリへのSVE 2サポートの追加-パート1), 我々は、より多くの情報をここで見つけました https://dev.to/gusmccallum/adding-sve2-support-to-an-open-source-library-part-i-349mテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol