アセンブリの最適化により、バイトの位置ポップカウント アルゴリズムのパフォーマンスをどのように向上させることができますか?

Linda Hamilton
リリース: 2024-10-26 03:58:27
オリジナル
403 人が閲覧しました

How can Assembly Optimization Boost the Performance of a Positional Popcount Algorithm on Bytes?

アセンブリを使用してこの 8 ビット位置ポップカウントを最適化するには?

Go で提供されている __mm_add_epi32_inplace_purego の実装は、高価な受け渡しのため最適ではありません。 [8]int32 配列の。パフォーマンスを向上させるには、代わりに配列へのポインターを渡すことをお勧めします。

ただし、質問はこの特定の関数の最適化を超えて、バイト上の位置人口カウント アルゴリズムのアセンブリを使用した内部ループの最適化を検討します。 .

アセンブリの最適化

提供されたアセンブリ コードは、位置人口カウント アルゴリズムの 2 つの機能を提供します:

  • 一度に 32 バイトCSA (定数加算器)
  • CSA で一度に 96 バイト

導入された改善点

アセンブリ コードは、改善するためにさまざまな手法を利用しています。パフォーマンス:

  • プリフェッチ: キャッシュ ミスを減らすためにデータを事前にプリフェッチします。
  • ベクトル化: SIMD (単一命令複数データ) 命令を採用複数のバイトを同時に処理します。
  • ポップ カウント組み込み関数: 組み込み関数を使用してビットの母集団を効率的にカウントします。
  • キャリーアウトの最適化:シフトされた値のキャリーアウトを利用して、効率的な人口カウントを実行します。
  • CSA を使用した 96 バイトのバリアント: 定数合計加算と呼ばれる手法を実装して、演算数を削減し、効率を向上させます。パフォーマンスが最大 30% 向上します。

パフォーマンス ベンチマーク

ベンチマークは、アセンブリの最適化により、純粋な Go の単純なリファレンス実装と比較してパフォーマンスが大幅に向上することを示しています。 :

  • Reg (32 バイト バリアント): 最大 4998.53 MB/s
  • RegCSA (CSA 付き 96 バイト バリアント): 最大 16053.40 MB/s

完全なソース コード

両方のアセンブリ バリアントの完全なソース コードは、GitHub で見つけることができます。このコードには、Go プログラムの両方のバリアントに使用できる移植可能なライブラリも含まれています。

結論

アセンブリに位置人口カウント アルゴリズムを実装することで、大幅なパフォーマンスが得られます。利益を達成することができます。提供されたアセンブリ コードは、スループットを最大化するためにさまざまな最適化を利用しています。詳細と例については、GitHub リポジトリを参照してください。

以上がアセンブリの最適化により、バイトの位置ポップカウント アルゴリズムのパフォーマンスをどのように向上させることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!