2

(スレッドビルディングブロック)が洗練されたエンジンを持っていると主張していることは知っTBBていますが、アルゴリズムの観点からは:

(Linux などで)N作業スレッド (POSIX スレッド、Nコアの数) とミューテックスで同期されたタスクのキューを持つワークキューがあった場合、各作業スレッドはアイドル時にキューからタスクを取得し、同期も行います。TBB素晴らしいC++構文を除いて、他に何が提供できるでしょうか? コアへのタスクの貪欲な割り当てよりも優れたアルゴリズムはありません。

4

2 に答える 2

15

独自のワークスティーリング スケジューラを開発した者として、私は次のように言うことができます。

  • 独自のスケジューラを作成しないでください (ここではワーク キューがカウントされます)。
  • 非効率的に行うか、間違った方法で行うかのどちらかです。

実際、正しいスケジューラーを書くことはそれほど難しくありません。残念ながら、効率的にやろうとすると難しいです。効率的なスケジューラは、ロックの使用を効果的に排除し (おそらく、非常に具体的で明確に指定された状況を除く)、ロックのないクロススレッド通信は苦痛の世界です。

逸話として、私は実際に 1 つのスケジューラーを実装しましたが、そこでは基本的に既存のアルゴリズムをコードにコピーする必要がありましたが、考えられるほぼすべての競合状態をコードに導入することができました。このコードのデバッグは、

  • 膨大で複雑なテスト ケースを作成する (実行の 1% 未満でしか発生しない時折の失敗をピックアップするためだけに)、
  • コードを見つめるだけで何時間も費やし、ロジックを適用してエラーを把握しようとする
  • デバッガーで各行をトレースし (エラーが発生すると、スタック トレースなしでクラッシュします)、すべてのスレッドのすべての変数の状態を手動で追跡しプログラムの実際の状態が期待される状態と一致していることを確認します。
  • コードを数回減らして本質的にゼロにして再構築し、単一行または行のペアをコメントアウトして効果を確認します(巨大な組み合わせスペース)、および
  • 壁に向かって走り、頭から先に。
于 2011-11-11T09:46:30.557 に答える
3

TBBの正確な実装がわからないため、正確に何を提供するかはわかりませんが、「何を提供できるか」とあなたが言ったので...

とりわけ、

  • タスクごとに 1 つのシステムコールとコンテキスト スイッチの代わりに、ロックフリーのキューイングとキューイング解除を提供できます。これを実装するのは思ったより難しいです。
  • さらに、キューが空の場合、ワーカー スレッドをブロックすることもできます。これも、思ったより実装が難しいです。
  • 仕事を盗む可能性があります。
  • Windows の完了ポートが機能するのと同じ方法で、LIFO タスクからスレッドへの割り当てを提供できます (キャッシュ効率が向上します)。
  • バグがないかもしれません。これもまた、あなたが思っているよりも実装が難しいものです。
于 2011-11-11T09:36:29.450 に答える