我通常习惯使用OpenMP来并行化任务。但是,当我最近开始处理一个新项目时,我想我可能会给Parallel Patterns Library一个镜头。
问题是我必须将数据存储在列表结构中,这在整个过程中会有不同的大小。我可以使用OpenMP并行化列表,并在每次迭代时创建任务,并尝试使用以下代码完成相同的操作
#include <list>
#include <ppl.h>
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace Concurrency;
void expo(double x){
double r = 1;
for(int i = 0 ; i<1000000 ; ++i){
r *= x;
}
cout << r << " ";
}
int wmain()
{
int begin,end;
list<int> numbers;
for(int i=1; i<11 ; ++i){
numbers.push_back(i);
}
list<int>::iterator lit;
structured_task_group tasks;
begin = GetTickCount();
for(lit=numbers.begin() ; lit!=numbers.end() ; lit++){
int k = *lit;
auto task1 = make_task([&k](){ expo(k); });
tasks.run(task1);
tasks.wait();
}
end = GetTickCount();
printf("elapsed: %d ms",end - begin);
cin.get();
return 0;
}
但是,正如您所看到的,我必须等待for循环中的任务完成,这意味着串行执行。如果我在for循环后放置“tasks.wait()”,我收到一个错误,编译器说运行命令后缺少一个wait命令。
如何解决这个问题?
顺便问一下,你对PPL有什么好的教程吗?我找到了这个页面(http://msdn.microsoft.com/en-us/library/dd492418.aspx),这对我来说似乎不是一个初学者的完美教程。
提前致谢!
答案 0 :(得分:0)
您可以使用以下内容替换structured_task_group
和for()
循环:
parallel_for_each(numbers.begin(), numbers.end(), [](int k){ expo(k); });