SMP 環境のプロセッサ動作で、ある読み出しアクセスが、同じメモリ ロケーションにアクセスする後続の読み出しにバイパスされてしまうことがあります。[Normal Memory Write-Back Shared] になっているメモリ領域への読み出しアクセスに対してのみ、この問題は発生します。
これはよく発生する問題ではなく、回避策が複数あります。
影響: | 深刻な問題ではありません。回避策は複数あります。 |
回避策: | マルチプロセス コードのほとんどはこの問題が発生するような形式では書かれていません。したがって、この問題は、この読み出し順序に依存したコードのごく限られたエリアに影響するものと見られます。詳細は「回避策の詳細」セクションを参照してください。 |
対象となる構成: | プロセッサの 1 つまたは両方を使用するシステム |
対象となるデバイス リビジョン: | すべて修正予定はありません。(Xilinx Answer 47916) - 「Zynq-7000 SoC デバイス - シリコン リビジョン間の相違点」を参照してください。 |
ARM アーキテクチャおよび一貫性に関する一般的なルールでは、アクセス順序を監視するため、読み出しは同じメモリ ロケーションにアクセスする必要があります。一部の内部再生パス構造のため、プロセッサで、ある読み出しアクセスが同じメモリ ロケーションにアクセスする後続の読み出しにバイパスされることがあり、値がプログラム順序どおりではなくなってしまいます。
この問題は、SMP モードのプロセッサで [Normal Memory Write-Back Shared] と設定されているメモリ領域でのみ発生します。
回避策の詳細
DMB バリア命令なしのシーケンス | DMB バリア命令ありのシーケンス |
結果、プロセッサ 2 で間違って Rx == <valueB> および Ry == <valueA> となることがある。 | データ順序は保持される。 |
|
|
プロセッサ 1 | プロセッサ 1 |
STR <valueA>, [loc] | STR <valueA>, [loc] |
|
|
STR <valueB>, [loc] | STR <valueB>, [loc] |
|
|
プロセッサ 2 | プロセッサ 2 |
LDR Rx, [loc] | LDR Rx, [loc] |
| DMB |
LDR Ry, [loc] |
|
| LDR Ry, [loc] |
| DMB |
この問題は、LDREX、LDREXB、LDREXH および LDREXD を除く、すべてのタイプのメモリ ロード命令に影響します。
高位言語の場合、コンパイラにより最適化が行われるか、または同じメモリ ロケーションへの複数のアクセスの順序が再度決定されるので、揮発性として宣言されているメモリ ロケーションのみにこの問題が発生するものと考えられます。また、この問題の引き金となるコンディションを防ぐには、2 つのロード間にバリア操作を介入させることで十分であり、ロックフリーのプログラミング メソドロジのみが問題の影響を受けます。
注記: 標準メモリにアクセスしない限り LDREX の使用は予測がつきません。このため 2 番目のシーケンスは、メモリの揮発性オブジェクトにアクセスするための一般的な回避策としては使用することはできません。
Answer Number | アンサータイトル | 問題の発生したバージョン | 修正バージョン |
---|---|---|---|
47916 | Zynq-7000 SoC デバイス - シリコン リビジョン間の相違点 | N/A | N/A |
AR# 47548 | |
---|---|
日付 | 06/13/2018 |
ステータス | アクティブ |
種類 | デザイン アドバイザリ |
デバイス |