ホームページ >バックエンド開発 >C++ >Intel CPU では、誤ったデータ依存関係が原因で 64 ビットのポップカウントが 32 ビットよりも遅いのはなぜですか?

Intel CPU では、誤ったデータ依存関係が原因で 64 ビットのポップカウントが 32 ビットよりも遅いのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-09 22:19:11862ブラウズ

Why is 64-bit Popcount Slower Than 32-bit on Intel CPUs Due to False Data Dependencies?

誤ったデータ依存関係が Intel CPU の Popcount パフォーマンスに影響を与える

問題:

重大な問題が観察されましたポップカウント操作に 32 ビット ループ カウンターを使用した場合と 64 ビット ループ カウンターを使用した場合のパフォーマンスの差異Intel CPU の場合。 64 ビット カウンターを使用すると、パフォーマンスが 50% 低下しました。当初はコンパイラのバグが原因でした。

説明: 誤ったデータ依存関係

Intel CPU には誤った依存関係があります。これは、タイトなループの複数回の反復に影響します。この依存関係により、宛先レジスタが使用可能になるまで命令が停止します。この依存関係によって影響を受ける命令の数はループの局所性に依存するため、パフォーマンスに変動が生じます。

依存関係の結果:

  • 異なるレジスタ: ループが連続する Popcnt 操作に異なるレジスタを使用すると、依存関係がループ全体に広がります。
  • 同じレジスタ: すべての Popcnt 操作が同じレジスタを使用する場合、依存関係は単一の反復内に残り、パフォーマンスへの影響が軽減されます。
  • 壊れた依存関係チェーン: 無関係な命令 (xor など) を導入して依存関係を壊すと、

コンパイラの動作:

GCC も Visual Studio もこの誤った依存関係を認識しないため、レジスタ割り当てに基づいて予測不能なパフォーマンスが発生します。 。 Clang や ICC などの他のコンパイラにも、この知識が欠けています。

AMD パフォーマンス:

AMD プロセッサには、この誤った依存関係がないようで、パフォーマンスの向上に寄与しています。ポップカウントでのパフォーマンス

軽減策:

  • アセンブリのインライン化: インライン アセンブリを使用してアセンブリ コードを手動で最適化すると、コンパイラによる依存関係の認識を回避できます。 .
  • を破る依存関係チェーン: 各 Popcnt 操作の後に無関係な命令を挿入すると、誤った依存関係が解消され、パフォーマンスが向上します。
  • 異なるレジスタの使用: 連続した Popcnt 操作に異なるレジスタを割り当てると、問題が軽減されますが、常に可能であるとは限りません。

以上がIntel CPU では、誤ったデータ依存関係が原因で 64 ビットのポップカウントが 32 ビットよりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。