无法从tbb环绕parallel_for

时间:2013-06-22 13:26:57

标签: c++ concurrency tbb

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

2 个答案:

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