コンパイラが冗長なアトミック書き込みのマージを避ける理由
はじめに
コンパイラは多くの場合、「 as-if ルールにより、監視可能な動作が続く限り操作の順序を変更できます。 一貫性のある。ただし、次のような同じ値を持つアトミック変数への連続ストアの場合、コンパイラーは書き込みを個別に発行する傾向があります。
std::atomic<int> y(0); void f() { auto order = std::memory_order_relaxed; y.store(1, order); y.store(1, order); y.store(1, order); }
C の制限事項標準
C 11 および C 14 標準では技術的に 3 つのストアを統合できますが、オブザーバーが中間値 2 を確認できるとは限りません。したがって、ストアを 1 つの操作に折りたたんで最適化すると、有効な順序付けを許可するという標準の意図に違反します。
コンパイラに関する考慮事項
コンパイラは予測可能性よりもパフォーマンスの最適化を優先するため、保守的なアプローチになります。標準の寛容性にも関わらず、コンパイラは、複数のストアが誤って結合された場合に進行状況バーが動かなくなるなどの潜在的な問題を回避するために、アトミック書き込みをマージしないことを選択します。
最小驚きの原則
プログラマは通常、アトミック ストアが順番に発生し、各ストアが書き込まれたとおりに実行されることを期待します。コンパイラがこれらの操作をマージすると、予期しない動作が発生し、最小の驚きの原則に違反する可能性があります。
今後の API 拡張機能
C ワーキング グループで議論が進行中です。追加の最適化コントロールを使用して std::atomic API を拡張します。これにより、順序付け要件に違反することなくアトミック書き込みが有益な場合に、コンパイラーがアトミック書き込みを最適化できるようになります。
代替ソリューション
それまでの間、プログラマは揮発性アトミック変数を使用できます。ストアの最適化を防ぐため。この方法は主に進行状況バーの問題に対処しますが、長期的な理想的な解決策ではありません。
結論
コンパイラーは通常、連続するアトミック書き込みを同じものとマージしません。この値を使用して、C 標準との一貫性を確保し、潜在的なパフォーマンスの問題を回避し、最小の驚きの原則を順守します。ただし、今後の API の機能強化により、コンパイラーがこの最適化を安全に実装できるようになる可能性があります。
以上がコンパイラはなぜ同じ値の冗長なアトミック書き込みをマージしないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。