Как распараллелить задачи с переменным числом задач в PPL - PullRequest
0 голосов
/ 04 января 2012

Обычно я использую 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, которая подразумевает последовательное выполнение.Если я помещаю «tasks.wait ()» после цикла for, я получаю сообщение об ошибке, и компилятор говорит, что после команды run отсутствует команда ожидания.

Как обойти эту проблему?

Кстати, знаете ли вы какой-нибудь хороший учебник по PPL?Я нашел эту страницу (http://msdn.microsoft.com/en-us/library/dd492418.aspx), которая не казалась мне идеальным учебником для начинающих.

Заранее спасибо!

1 Ответ

0 голосов
/ 04 января 2012

Вы можете заменить петли structured_task_group и for() следующим:

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