일반적으로 작업 병렬화를 위해 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)는 초보자를위한 완벽한 튜토리얼로 보이지 않았습니다.
미리 감사드립니다.
감사합니다! 잘 했어! PPL을 배우기에 좋은 장소를 알고 있습니까? BTW, 내 원래의 문제에서, 나는 공유 가치를 업데이 트해야합니다. 원래 알고리즘은 목록을 살펴보고 함수에 가장 낮은 값을 생성하는 요소를 찾습니다. 그것은 중요한 지역과 같은 것이 필요합니다. PPL로 어떻게 그것을 할 수 있습니까? – aristos
@aristos : PPL을 배우기에 가장 적합한 곳을 모르지만 [Concurrency Runtime]에 대한 모든 텍스트와 예제를 읽었습니다 (http://msdn.microsoft.com/en-us/library/dd504870). .aspx). 두 번째 질문에 대해서는 중간 결과를'concurrent_vector'로 푸시하고'std :: min_element'를 사용하여 끝에 가장 낮은 값을 찾으십시오. – Blastfurnace
parallel_for_each가 작동하지 않는 경우 wait_all()을 사용할 수도 있습니다. –