4

複数のコア間でデータを共有するのに最も効率的なものは何ですか。確かに共有メモリを使用できますが、それには代償も伴います。1 つのコアが継続的に変数に書き込み、もう 1 つのコアが継続的に変数から読み取る必要があるとします。MESI キャッシュ コヒーレンス プロトコルでは、書き込みコアが読み取りコアのキャッシュを時々無効にします。したがって、このシナリオでは、データを共有する最も効率的な方法は何ですか?

4

3 に答える 3

3

典型的な共有メモリマシンでは、あなたが説明するシナリオは、おそらく可能な限り最も効率的な方法です。

  • コア A がメモリ ロケーションに書き込みます。コア B のコピーを無効にします。
  • コア B は、メモリまたはコア A のキャッシュからデータを取得します。

いずれにせよ、データはコア A からコア B に送信する必要があります。最近のプロセッサのキャッシュ コヒーレンシは、メモリに到達することなく直接キャッシュからキャッシュへの転送をサポートする場合があります。


(可能な限り) 回避したいのは、共有リソースの過剰なロックです。これにより、双方向のキャッシュ コヒーレンス トラフィック (およびレイテンシ) が増加します。

于 2012-04-08T19:37:51.260 に答える
0

これは、許容できる古さの度合いによって異なります (教えてください)。

更新をできるだけ早く伝播する必要がある場合、これはすでに最も効率的なソリューションです。数ミリ秒または数秒の古いデータを許容できる場合は、各コアに個別のメモリ ロケーションを使用し、タイマーを使用して同期できます。

于 2012-04-08T20:59:20.010 に答える
0

一般的で一般的なアプローチの 1 つは、可能な場合はコアごとのデータ構造を持つことです。

たとえば、生産者と消費者のシナリオでは、各消費者プロセッサがキューの一部を持ち、それを操作できます。作業項目が不足した場合にのみ、プロデューサー プロセッサに連絡できます。

もちろん、これは常に可能というわけではありませんが、作業項目をこのように設計できれば、コア間の相互依存が減り、アプリケーションがコアの数までスケールアップできるようになります。

この手法は、Solaris OS で広く使用されています。詳細については、Multicore Application Programming: for Windows, Linux, and Oracle Solaris を参照してください。

于 2012-04-08T20:47:58.063 に答える