メッセージ・パッシング・プロトコル

インテル® TBB のフローグラフで、エッジは、メッセージを渡すために push プロトコルと pull プロトコルを動的に切り替えます。インテル® TBB のフローグラフ G = ( V, S, L ) について考えてみます。ここで、V はノードのセット、S は現在 push プロトコルを使用しているエッジのセット、L は現在 pull プロトコルを使用しているエッジのセットです。各エッジ (Vi, Vj) の Vi はプレデセッサー/センダーで、Vj はサクセサー/レシーバーです。push セット S では、エッジ上のメッセージはセンダーによって開始され、レシーバーに put しようとします。pull セット L では、メッセージはレシーバーによって開始され、センダーから get しようとします。

あるエッジでメッセージの処理に失敗した場合、そのエッジはほかのセットに移動されます。例えば、エッジ (Vi, Vj) で put に失敗すると、エッジは push セット S から削除され、pull セット L に移動されます。失敗した送信または受信を単に繰り返すことが効率的なオプションでない場合、この動的 push / pull プロトコルがインテル® TBB のようなノンプリエンプティブなタスク・ライブラリーのパフォーマンスの鍵となります。次の図は、この動的プロトコルを要約したものです。

動的 push / pull プロトコル
動的 push / pull プロトコル

注意

特定のグラフノードは、push を受け付けるサクセサーがない場合、メッセージを破棄します。push を拒否する可能性があるサクセサーにこれらのノードをアタッチすると、メッセージが失われることがあります。例えば、function_node f1 がシリアル function_node f2 にアタッチされ、f2 がアクティブな場合、f1 によって f2 に push されたメッセージは拒否されます。そして、f1 はバッファーしないため、そのメッセージは破棄されます。

try_get() を受け付けるノードはメッセージを破棄しません。ノードの一覧は、「転送、バッファー、受信ポリシー」を参照してください。

関連情報