如何在PPL中并行化任务数量可变的任务

How to parallelize tasks with variable-number-of-tasks in PPL

本文关键字:任务 并行化 PPL      更新时间:2023-10-16

我通常习惯于使用OpenMP来并行化任务。然而,当我最近开始做一个新项目时,我想我可能会尝试一下并行模式库。

问题是,我必须将数据存储在列表结构中,在整个过程中,列表结构的大小会有所不同。我可以用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循环内的任务完成,这意味着要进行串行执行。如果我把"tasks.wait()"放在for循环之后,我会得到一个错误,编译器会说在run命令之后缺少一个wait命令。

我该如何解决这个问题?

顺便问一下,你知道关于PPL的好教程吗?我找到了这个页面(http://msdn.microsoft.com/en-us/library/dd492418.aspx)对于初学者来说,这似乎不是一个完美的教程。

提前感谢!

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

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