0

ここで問題です。1 つのスレッドのみで実行すると完全に機能するコードがあります。しかし、このコードが TBB で呼び出されると、フリーズします (または、完了するのを待つ忍耐力がありません!)。

コードは長すぎますが、次のように想像してください。

class TBB_Test
{
public:
  TBB_Test(void) { /* initialize the stuff */ }

  void operator() (tbb::blocked_range<int> &r) const
  {
    for (int i = r.begin(); i != r.end(); ++i)
    {
      // compute very awesome stuff!
    }
  }
};

したがって、順次実行すると、次のようになります。

TBB_Test() (tbb::blocked_range<int>(0, max_value));

それは機能しますが、一度並行して:

tbb::parallel_for(tbb::blocked_range<int>(0, max_value, grainsize), TBB_Test());

シーケンシャルよりも高速ではなく、フリーズしました。

何がそのようなことを引き起こす可能性がありますか? 2 つのスレッドが同じ場所で読み書きしようとしていますか? 私たちの場合、書き込みは起こらないはずです! また、同じアドレスがおそらく複数のスレッドによって読み取られ、フリーズしないという別の状況もあります!

何か案が?

VStudioでは、少なくとも、デバッグ時にアクティブ化するだけで、デバッガーはあらゆる種類の例外で停止します...長いですが、正しい方法です!

4

1 に答える 1

0

当然、メモリ割り当ての問題でした。

悪い解決策は、メモリが割り当てられている場所でミューテックスを使用することです。これは、X プロセッサが最大まで実行されてしまうため、悪いことです... ほとんどがミューテックスで待機しています。

使用した最後のアプローチは、各スライスに 1 つのメモリ割り当て方式を使用することです。次に、「結合」を使用して、計算後にデータをマージします。このようにして、プロセッサはミューテックスなしで実行されます。ただし、これにより、より多くのメモリが必要になります。ただし、スレッド間に重複がない限り、問題はありません。

それで、教訓が得られました!

于 2012-09-04T14:13:26.877 に答える