0
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for.h>
#include <random>

#define N 1000000

int main()
{
    tbb::concurrent_vector<u_int32_t> v(N);

    std::mt19937 mt;
    std::uniform_int_distribution<u_int32_t> dist(0,499);

    tbb::parallel_for( tbb::blocked_range<tbb::concurrent_vector<u_int32_t>>(v.begin(),v.end()),[&]{return dist(mt);});

    return(0);

}

これが機能しない理由がわかりません。このためのインターフェイスにparallel_forは、コンテナーの開始点、エンドポイント、およびループの各反復で実行する必要があるステップのサイズが含まれている必要があることを理解しています。引数は実行される関数です。

tbb::blocked_rangeではコンテナを分割するために使用されているので(そうですか?)、この場合に役立つはずです. ..

4

2 に答える 2

4

イテレータ、v.begin() および v.end() または tbb::blocked_range を使用したいのですが、定数の使用を避けて、再利用可能なコンポーネントでこれを実装し、より C++ 風にしようとしています。

TBB にはparallel_for_each、反復子ベースのループ用の関数テンプレートがあります。

#include "tbb/parallel_for_each.h"

tbb::parallel_for_each(v.begin(), v.end(),
  [&](u_int32_t& e) {
    e = /*...*/; 
  }
);
于 2013-06-22T13:58:28.980 に答える
1

あなたが本当に欲しいのは次のようです:

tbb::parallel_for( tbb::blocked_range<tbb::concurrent_vector<u_int32_t>::iterator>(v.begin(),v.end()),[&](tbb::blocked_range<tbb::concurrent_vector<u_int32_t>::iterator>&){return dist(mt);});

たぶん、typedefあちこちで必要です:D

int main() {
    typedef tbb::concurrent_vector<u_int32_t> vector;
    vector v(N);

    std::mt19937 mt;
    std::uniform_int_distribution<u_int32_t> dist(0,499);

    typedef tbb::blocked_range<vector::iterator> range;
    tbb::parallel_for( range(v.begin(),v.end()),[&](range& r){for(auto& i: r) { i = dist(mt); } });

    return(0);
}

かなり良いです:D

于 2013-06-22T13:51:18.703 に答える