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++-ish

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 回答