8

どの並列フレームワークを使用するかを検討していC/C++ます。いくつかの非常に特殊な条件があり、100% 確実ではありません。たとえば、TBB「さらに」何かを追加することができます。

  • N実行中のスレッドと 1 つの同期されたワークキュー (pthreadミューテックスを使用)があります。
  • 私たちの仕事は優先されます ( int)。
  • ジョブはキューに入れられ、アイドル スレッドが最も優先度の高いジョブを取得します。

これは、キューが空になるまで繰り返されます。

TBBさて、そして今、 (スレッド ビルディング ブロック)のようなフレームワークが、アルゴリズムの観点から、この特別なシナリオにさらに多くを提供できるかどうか知りたいです?? (だから、内部...)

4

5 に答える 5

5

TBB 4は、concurrent_priority_queueを提供します(リファレンスマニュアルで「priority」を検索してください)。さらに、スレッドではなくタスクを念頭に置いてプログラムを設計できる場合は、TBBを使用すると便利です。確かに、それはタスク間の依存関係を説明するために多くのものを提供します。また、TBBは、それがあなたにとって重要である場合、かなり移植性があるようです。

于 2011-12-13T13:00:32.493 に答える
3

私の意見では、spin_rw_mutex: http://threadingbuildingblocks.org/files/documentation/a00163.htmlのように、重いミューテックスをより堅牢なものに置き換えることで得られる可能性があります。ほとんどの場合、挿入/削除操作は高速であるため、ノンブロッキング ロックの恩恵をより多く受けることができます。

于 2011-12-13T17:59:45.480 に答える
0

TBBはあなたに提供することができます:

  • ロックフリーのconcurrent_queue。優先キューについては何も覚えていませんが、Jamesがコメントで示唆したように、cocurrent_queueを介して自分で構築できます。
  • マルチスレッド環境でのパフォーマンスに合わせて調整されたメモリアロケータ。
  • アトミック変数のような同期プリミティブ
  • マルチスレッドのものを効果的に実装する方法についての良いアイデア

TBBを使用してすべてを正しく集中的に実行しても、自分のパフォーマンスと比較してパフォーマンスの向上に気付かない可能性があることに注意してください。特にスレッド間通信、特に同期がボトルネックである場合は、システムに大きく依存します。通常、タスクが小さく、タスクがたくさんある場合です。

于 2011-12-13T11:53:16.167 に答える
0

私は、OpenMP、Cilk などの並列化フレームワークを使用してきました。これにより、優れた抽象化が実現し、並列化が比較的簡単になります。ただし、これらがプライオリティ キューを直接サポートしているのか、それともタスク キューを変更できるのかさえ疑問です。

このカスタマイズされた TaskQueueを使用して優先度ベースのキューを実行できます。

TBB を使用したい場合は、OpenMP で使用しましたが、非常にうまく溶け込んでいるようです。さらに、並行コンテナーについて心配する必要はありません。また、人々が利用できる他の実装と比較して、非常に信頼性があります。

お役に立てれば。

于 2011-12-17T16:37:37.507 に答える
0

TBB モジュールの概要ページを見て、役立つものがあるかどうかを確認することをお勧めします。

たとえば、Containersセクションの下にはconcurrent_queue< T, A >、「高パフォーマンスのスレッドセーフなノンブロッキングの同時キュー」はありません。これはプライオリティ キューではないため、自分で作成する必要があります。

一方、Synchronizationの下には、作業を楽にするミューテックスのバリエーションがいくつかあります。

結論: TBB はそれほど魔法のようなものではありませんが、役に立つかもしれません。

于 2011-12-05T17:04:41.780 に答える