2013-10-30 3 views
1

통과 "공유"포인터 :OpenMP의 작업 내가 다음 코드의 OpenMP의 작업 프라그 마를 사용하고자하는

std::vector<Class*> myVectorClass; 
#pragma omp parallel 
{ 
    #pragma omp single nowait 
    { 
     for (std::list<Class*>::iterator it = myClass.begin(); it != myClass.end();) { 
      #pragma omp task firstprivate(it) 
       (*it)->function(t, myVectorClass)) 
      ++it; 
     } 
    } 
    #pragma omp taskwait 
} 

문제, 또는 그 중 하나는 myVectorClass이 포인터가 개체에 있다는 것이다 . 따라서이 벡터를 공유로 설정할 수는 없습니다. myVectorClass는 함수에 의해 수정됩니다. 이전 코드가 손상되었습니다. 그렇다면 for 루프 pragma를 사용하지 않고 이전 코드를 수정하는 방법을 알려주시겠습니까?

감사

+0

'기능()'은 무엇입니까? 그것은'myVectorClass'를 어떻게 수정합니까? – kangshiyin

+0

function()이 여기에 표시하는 것은 상당히 복잡하지만 myVectorClass에 요소를 추가합니다. – smc

+0

답변으로 질문이 해결되면 답변 옆에있는 체크 표시를 클릭하여 동의하십시오. 제목에 "해결 됨"을 편집하지 마십시오. – Mysticial

답변

1

myVectorClass는 포인터의 벡터이다. 현재 코드에서는 공유로 설정합니다. 코드가 깨 졌으므로 myVectorClass 길이를 function()으로 변경한다고 가정합니다. 그러나 std::vector은 스레드로부터 안전하지 않으므로 여러 스레드에서 길이를 수정하면 데이터 구조가 충돌합니다.

정확히 function()의 역할에 따라 간단한 해결책이 있습니다. 기본 아이디어는 스레드 당 하나의 스레드 로컬 벡터를 사용하여 function()의 결과를 먼저 수집 한 다음이 벡터를 병합/병합하여 단일 스레드로 만드는 것입니다.

여기에 표시된 코드는 좋은 예입니다.

C++ OpenMP Parallel For Loop - Alternatives to std::vector

std::vector<int> vec; 
#pragma omp parallel 
{ 
    std::vector<int> vec_private; 
    #pragma omp for nowait //fill vec_private in parallel 
    for(int i=0; i<100; i++) { 
     vec_private.push_back(i); 
    } 
    #pragma omp critical 
    vec.insert(vec.end(), vec_private.begin(), vec_private.end()); 
} 
+0

감사합니다. 작동합니다. 그러나 iterators 다른 문제가 있습니다. 나는 새로운 지위를 쓸 것이다. – smc