32 ビット アトミックを使用した 64 ビット アトミック カウンタの実装
組み込みシステムでは、32 ビット アトミックのみを使用して 64 ビット アトミック カウンタを作成します-bit アトミックは多くの場合必要になります。一般的なアプローチは、読み取りロックとして機能する最下位ビットを持つ世代カウントを利用することです。ただし、他に考えられる方法があるのか、提案された実装が最適なのかという疑問が生じます。
代替アプローチ
推奨される実装は実行可能なアプローチですが、考慮すべき代替方法:
-
SeqLock パターン: この手法奇数と偶数の値を交互に使用して単調に増加する世代数を使用します。リーダーは、世代数が安定し、読み取りロック ビット (最下位ビット) が設定解除されるまでスピンします。この方法では、リーダーが複数あるがライターが 1 つだけのシナリオでパフォーマンスが向上します。
-
直接 64 ビット アトミック操作: あまり一般的ではありませんが、一部のシステムは 64 ビット アトミック操作をネイティブにサポートしている場合があります。このような場合、64 ビット カウンターの両方の半分にアトミック操作を直接使用すると、ロックやシーケンス カウンターが不要になります。
設計上の考慮事項
提供された実装に関しては、いくつかの領域が可能です。最適化:
-
世代数のアトミック読み取り変更書き込み (RMW): 世代数にアトミック RMW 操作を使用する代わりに、純粋なロードとストアを使用することができます。リリース順序。この変更により、RMW 操作に関連するオーバーヘッドが削減されます。
-
ペイロードのアトミック インクリメント: ペイロードのインクリメントにアトミック RMW を利用する必要はありません。純粋なロード、インクリメント、ストアだけで十分です。この変更により、カウンタを維持するオーバーヘッドがさらに削減されます。
追加の考慮事項
-
ARM ロード ペア命令: 一部ARM アーキテクチャは、両方を同時にロードできる効率的なロードペア命令 (ldrd または ldp など) をサポートしています。 64 ビット値の半分の 32 ビット。これらの命令を利用すると、パフォーマンスを向上させることができます。
-
コンパイラーの最適化: コンパイラーは、uint64_t のような大規模な構造に対するアトミック操作に最適なコードを常に生成するとは限りません。このような構造へのアトミック アクセスを回避し、代わりに volatile キーワードとメモリ バリアを使用すると、より効率的なコードが得られます。
結論
32 ビット アトミックを使用して 64 ビット アトミック カウンタを構築するための推奨手法は、特に単一のライターと複数のリーダーを使用するシナリオに適しています。ただし、特定の状況では、SeqLock パターンや直接 64 ビット アトミック操作などの他のオプションの方が適している場合があります。概要を示した設計上の考慮事項に対処し、追加の最適化を検討することで、プログラマーは実装の効率をさらに向上させることができます。
以上が32 ビット アトミックのみを使用して 64 ビット アトミック カウンターを効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。