問題の概要
ループカウンター変数が変更されると、popcountベンチマークのパフォーマンスが大幅に変化しました変更がループの基本動作に影響を与えないようであるにもかかわらず、32 ビット符号なしから 64 ビット符号なしへ。
質問
答え
1.パフォーマンスの違いは、Intel CPU の Popcnt 命令の誤ったデータ依存性によるものです。
ループ カウンタが 32 ビットの場合、各ループ反復の Popcnt 命令は独立して実行され、並列処理が可能になります。実行。ただし、ループ カウンタが 64 ビットの場合、popcnt 命令間に誤ったデータ依存関係が導入され、並列実行が不可能になります。この依存関係は、popcnt 命令の宛先レジスタが次の反復で再利用されることによって引き起こされ、パフォーマンスを制限する人為的な依存関係が作成されます。
2.非定数のバッファ サイズを定数値に置き換えると、コンパイラによる一部の最適化の実行が妨げられるため、コードの速度が低下する可能性があります。
バッファ サイズが定数の場合、コンパイラはバッファの正確なサイズを認識します。これにより、より効率的なメモリ アクセス パターンと命令スケジューリングが可能になります。ただし、バッファ サイズが一定ではない場合、コンパイラは最悪のシナリオを想定する必要があり、コードの最適化が低下する可能性があります。
3. 'static' キーワードをバッファ サイズ変数に追加すると、バッファ サイズがコンパイル時の定数になり、コンパイラが追加の最適化を実行できるため、64 ビット ループが高速になります。
バッファ サイズをコンパイル時定数にすると、コンパイラはメモリ アクセス パターンと命令スケジューリングをより積極的に最適化し、結果として高速化できます。 code.
学んだ教訓
ループ内の小さな変更であっても、予期しない依存関係やコンパイラの最適化により、パフォーマンスに大きな影響を与える可能性があります。効率的なコードを作成するには、これらの依存関係とそれがパフォーマンスにどのように影響するかを理解することが重要です。
以上がループ カウンタを 32 ビットから 64 ビットに変更すると、Intel CPU の _mm_popcnt_u64 パフォーマンスに劇的な影響が出るのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。