5

tbb::parallel_forsize の間隔で消費したいデータセットがありますinterval_size。私のファンクターが消費する各間隔は、データセットが均等に分割されていないinterval_size場合は小さくなる可能性がある最後の部分間隔を除いて、 である必要があります。interval_size

TBB を使用してこの方法で静的に分割する方法はありますか? interval_sizeこのテストでは、私のシステムよりも小さいいくつかの間隔が生成されます。

#include <tbb/parallel_for.h>
#include <iostream>

struct body
{
  void operator()(const tbb::blocked_range<size_t> &r) const
  {
    std::cout << "range size: " << r.end() - r.begin() << std::endl;
  }
};

int main()
{
  size_t num_intervals = 4;
  size_t interval_size = 3;

  // consume num_intervals plus a partial interval in total
  size_t n = num_intervals * interval_size + (interval_size - 1);
  tbb::parallel_for(tbb::blocked_range<size_t>(0, n, interval_size),
                    body(),
                    tbb::simple_partitioner());

  return 0;
}

出力:

$ g++ test_parallel_for.cpp -ltbb
$ ./a.out 
range size: 3
range size: 2
range size: 2
range size: 3
range size: 2
range size: 2
4

1 に答える 1

4

この動作の理由は、単純なパーティショナーが次の基準によって範囲を分割するためです。

ceil(粒度/2) <= チャンクサイズ <= 粒度

と一緒に使用する場合tbb::blocked_range(i, j, grainsize)、chunksize は範囲のサイズです。

詳細については、チュートリアルの3.2.5 パーティショナーの概要を確認してください。

TBB で固定サイズのチャンクサイズを取得する簡単な方法はありません (これは OpenMP で簡単に実現できます)。それはTBBのコンセプトに反するからです。TBB はこれらすべてのものを抽象化しようとし、スケジューラーは実行時にスレッドが可能な限り最適に使用されるようにします。

于 2012-09-15T11:10:32.393 に答える