3

このSO投稿で [[carries_dependency]] について読んでいました。

しかし、私が理解できなかったのは、受け入れられた回答の以下の文です:

「特に、memory_order_consume で読み取られた値が関数に渡され、[[carries_dependency]] がない場合、適切なメモリ順序付けセマンティクスが維持されることを保証するために、コンパイラはメモリ フェンス命令を発行する必要がある場合があります。パラメータが[[carries_dependency]] で注釈が付けられている場合、コンパイラは関数本体が依存関係を正しく運ぶと想定でき、このフェンスは不要になる可能性があります。

同様に、関数が memory_order_consume でロードされた値、またはそのような値から派生した値を返す場合、[[carries_dependency]] がない場合、適切なメモリ順序付けセマンティクスが維持されることを保証するために、コンパイラはフェンス命令を挿入する必要がある場合があります。[[carries_dependency]] アノテーションを使用すると、呼び出し元が依存関係ツリーの維持を担当するようになるため、このフェンスは不要になる可能性があります。」

それを一歩一歩見てみましょう:

「memory_order_consumeで読み取られた値が関数に渡された場合、[[carries_dependency]]なしで、コンパイラはメモリフェンス命令を発行して、適切なメモリ順序セマンティクスが維持されることを保証する必要があります。」

そのため、アトミック変数がパラメータとして関数に渡されるときのリリース消費メモリ モデルのアトミック変数の場合、コンパイラはフェンス ハードウェア命令を導入して、関数に提供されるアトミック変数の最新の更新された値を常に持つようにします。

次 -

「パラメーターに [[carries_dependency]] の注釈が付けられている場合、コンパイラーは関数本体が依存関係を正しく運ぶと想定でき、このフェンスは不要になる可能性があります。」

これは私を混乱させます-アトミック変数の値はすでに消費されており、関数はどの依存関係を持っていますか?

同様に -

「関数がmemory_order_consumeでロードされた値、またはそのような値から派生した値を返す場合、[[carries_dependency]]なしでは、適切なメモリ順序付けセマンティクスが維持されることを保証するために、コンパイラはフェンス命令を挿入する必要がある場合があります。 [[呼び出し元が依存関係ツリーを維持する責任を負うようになったため、このフェンスは不要になる可能性があります。」

例から、依存関係の実行について何を言おうとしているのか明確ではありませんか?

4

1 に答える 1