如何在PPL中将任务与可变任务数并行化

时间:2012-01-04 14:57:24

标签: c++ task parallel-processing task-parallel-library

我通常习惯使用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),这对我来说似乎不是一个初学者的完美教程。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容替换structured_task_groupfor()循环:

parallel_for_each(numbers.begin(), numbers.end(), [](int k){ expo(k); });