Cで書かれたマルチプロセッサPowerPC上の32/64ビットAIXにカーネルエクステンションを移植しています。アトミックな読み取り操作やアトミックな書き込み操作以上の処理は必要ありません(フェッチアンドアドミ、比較とスワップなど) 私には、「原子性」とは「インターリーブなし」だけでなく、「複数のコアにわたる可視性」をも意味します。 操作はポインタで動作するので、 'int'変数の操作は役に立ちません。AIX/powerpcでのアトミック割り当ての実装方法は?
変数 "volatile"を宣言すると、C標準によれば、変数は未知の要素によって変更される可能性があるため、最適化の対象にはなりません。
私が読んだところでは、通常の読み取りと書き込みはインターリーブされていないと思われ、linux kernel soucesは同意するようです。それは言う:
__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
stw
はおそらくアトミックである「ストア・ワード」、ですが、私は「%のU0の%のX0」は何を意味するのかわかりません。私は、このアセンブリ命令がどのように可視性を課すかを理解していません。 カーネル拡張をコンパイルするときに、 'std'が必要な割り当てに使用されますが、読み込んだものから64ビットマシンの場合はアトミックでなければなりません。私はPowerPCとその命令セットの仕様をほとんど理解していませんが、コンパイルされたファイルのアセンブリリストにメモリバリア命令(「同期」または「eieio」)が見つかりませんでした。
カーネルには、アトミックな読み取り(たとえばv = fetch_and_addlp(&x, 0)
)の実装に使用できるfetch_and_addlp()サービスが用意されています。
だから私の質問は以下のとおりです。
は、それが十分な可視性の感覚と非インタリーブでアトミックを読み書き達成するために、変数「揮発性」を宣言するのですか?
1に対する答えが「いいえ」の場合、そのようなアトミック性はどのように達成されますか?
Linux PowerPCアトミック実装の "%U0%X0"の意味は何ですか?
:制約の完全なリストはで見つけることができます!注文保証が必要な場合は、メモリバリアを使用してください。誰もが障壁になるので、ロックを使用してください。 –
@tc:残念ながら、マイクロソフトのコミュニティでは、「原子」という言葉の意味に同意しません。 1991年頃にIntel x86メモリオーダーアーキテクチャーを定義したとき、私はtcの使用定義を使用しました。これは、すべての操作が完了したかどうかを示す「原子」、途中で使用されなかった操作、および別のものとしての「メモリー順序付け」です。しかし、最近では、ARMはメモリオーダリングを参照するために「アトミック」を使用し、tcと私がちょうど「アトミック」と呼ぶものには「単一の場所のアトミック性」を、メモリの順序付けには「マルチロケーション - アトミック性」または「アトミック性を記述する」システムの特性。 –