誤ったデータ依存関係が Intel CPU の Popcount パフォーマンスに影響を与える
問題:
重大な問題が観察されましたポップカウント操作に 32 ビット ループ カウンターを使用した場合と 64 ビット ループ カウンターを使用した場合のパフォーマンスの差異Intel CPU の場合。 64 ビット カウンターを使用すると、パフォーマンスが 50% 低下しました。当初はコンパイラのバグが原因でした。
説明: 誤ったデータ依存関係
Intel CPU には誤った依存関係があります。これは、タイトなループの複数回の反復に影響します。この依存関係により、宛先レジスタが使用可能になるまで命令が停止します。この依存関係によって影響を受ける命令の数はループの局所性に依存するため、パフォーマンスに変動が生じます。
依存関係の結果:
コンパイラの動作:
GCC も Visual Studio もこの誤った依存関係を認識しないため、レジスタ割り当てに基づいて予測不能なパフォーマンスが発生します。 。 Clang や ICC などの他のコンパイラにも、この知識が欠けています。
AMD パフォーマンス:
AMD プロセッサには、この誤った依存関係がないようで、パフォーマンスの向上に寄与しています。ポップカウントでのパフォーマンス
軽減策:
以上がIntel CPU では、誤ったデータ依存関係が原因で 64 ビットのポップカウントが 32 ビットよりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。