关于TBB如何实现Divide-And-Conquer算法的问题
比方说:使用归并排序法,对一个数组进行排序。我试了parallel_for和parellel_reduce都不能满足。
<code>
#include <vector>
#include <algorithm>
#include "tbb/task_scheduler_init.h"
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"
#include "tbb/parallel_reduce.h"
using namespace std;
using namespace tbb;
class Body {
public:
Body(vector<int> *data) {
v = data;
}
Body(Body &b, split) {
v = b.v;
}
static bool compare(const int &a, const int &b) {
return a < b;
}
void operator()(const blocked_range<size_t> &r) {
stable_sort(v->begin() + r.begin(), v->begin() + r.end(), Body::compare);
}
void join(const Body& body) {
}
private:
vector<int> *v;
};
int main() {
task_scheduler_init init;
vector<int> *v = new vector<int>();
int data[100];
for(int i = 100; i >= 0; i--) {
v->push_back(i);
}
cout << "before parallel for:" << endl;
for(int i = 0; i < 100; i++) {
cout << v->at(i) << ",";
}
cout << endl;
Body b(v);
parallel_reduce(blocked_range<size_t>(0,100,10),b);
cout << "after parallel for" << endl;
for(int i = 0; i < 100; i++) {
cout << v->at(i) << ",";
}
cout << endl;
}
</code>
输出结果为:
before parallel for:
100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,
after parallel for
95,96,97,98,99,100,89,90,91,92,93,94,83,84,85,86,87,88,76,77,78,79,80,81,82,70,71,72,73,74,75,64,65,66,67,68,69,58,59,60,61,62,63,51,52,53,54,55,56,57,45,46,47,48,49,50,39,40,41,42,43,44,33,34,35,36,37,38,26,27,28,29,30,31,32,20,21,22,23,24,25,14,15,16,17,18,19,8,9,10,11,12,13,1,2,3,4,5,6,7,
不知道这种在循环处理中要多数据源进行更改的算法,利用什么方法才能实现?