#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
它用于拆分容器(对吗?),所以在这种情况下它应该是有用的,我不能让它工作,我不明白为什么这只是不起作用使用迭代器以更简单的方式......
答案 0 :(得分:3)
我想使用迭代器,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 = /*...*/;
}
);
答案 1 :(得分: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