2012-01-04 4 views
0

일반적으로 작업 병렬화를 위해 OpenMP를 사용하는 데 익숙합니다. 그러나 필자는 최근에 새로운 프로젝트를 시작할 때 Parallel Patterns Library에 한 발짝을 쏟을 수 있다고 생각했습니다.PPL에서 변수 개수 작업으로 작업을 병렬화하는 방법

문제는 프로세스 전체에서 다양한 크기를 갖는 목록 구조에 데이터를 저장해야한다는 것입니다. 보시다시피 나는 내 작업의 완료를 기다려야한다, 나는 각각의 반복과 함께 작업을 만드는 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-loop는 직렬 실행을 의미합니다. for-loop 뒤에 "tasks.wait()"를 배치하면 오류가 발생하고 컴파일러에서 실행 명령 후 wait 명령이 누락되었다고 말합니다.

이 문제를 해결하려면 어떻게해야합니까?

그건 그렇고, PPL에 대한 좋은 지침서를 아십니까? 이 페이지 (http://msdn.microsoft.com/en-us/library/dd492418.aspx)는 초보자를위한 완벽한 튜토리얼로 보이지 않았습니다.

미리 감사드립니다.

답변

0

다음과 같은 사용하여 structured_task_groupfor() 루프를 대체 할 수

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

감사합니다! 잘 했어! PPL을 배우기에 좋은 장소를 알고 있습니까? BTW, 내 원래의 문제에서, 나는 공유 가치를 업데이 트해야합니다. 원래 알고리즘은 목록을 살펴보고 함수에 가장 낮은 값을 생성하는 요소를 찾습니다. 그것은 중요한 지역과 같은 것이 필요합니다. PPL로 어떻게 그것을 할 수 있습니까? – aristos

+0

@aristos : PPL을 배우기에 가장 적합한 곳을 모르지만 [Concurrency Runtime]에 대한 모든 텍스트와 예제를 읽었습니다 (http://msdn.microsoft.com/en-us/library/dd504870). .aspx). 두 번째 질문에 대해서는 중간 결과를'concurrent_vector'로 푸시하고'std :: min_element'를 사용하여 끝에 가장 낮은 값을 찾으십시오. – Blastfurnace

+0

parallel_for_each가 작동하지 않는 경우 wait_all()을 사용할 수도 있습니다. –

관련 문제