2017-03-15 3 views
0

OpenMP를 사용하여 멀티 스레드를 적용하고 싶습니다. 여기에 제가 작성한 간단한 코드가 있습니다.OpenMP double for loop

vector<Vector3f> a; 
int i, j; 
for (i = 0; i<10; i++) 
{ 
    Vector3f b; 
#pragma omp parallel for private(j) 

    for (j = 0; j < 3; j++) 
    { 
     b[j] = j; 
    } 
    a.push_back(b); 
} 

for (i = 0; i < 10; i++) 
{ 
    cout << a[i] << endl; 
} 

나는 작품 사장님로 변경하려면 :의 #pragma 라인이 삭제 될 때

parallel for1 
{ 
    for2 
} 

또는

for1 
{ 
    parallel for2 
} 

코드가 작동합니다. 하지만 그것을 사용하면 작동하지 않습니다. 뭐가 문제 야?

///////// 추가

는 사실은 내가 더블 루프 질문에 대한 더 복잡한 예에 OpenMP를 사용합니다.

여기에도 MP를 적용하지 않으면 잘 작동합니다. 하지만 적용 할 때 벡터 push_back 줄에서 오류가 발생합니다.

vector<Class> B; 
for 1 
{ 
    #pragma omp parallel for private(j) 
    parallel for j 
    { 
     Class A; 
     B.push_back(A); // error!!!!!!! 
    } 
} 

B.push_back (A) 행을 지우면 MP를 적용해도 잘 작동합니다.

정확한 오류 메시지를 찾을 수 없지만 벡터에 대한 예외 오류가있는 것 같습니다. 디버그는 스레드로부터 안전하지 않습니다

void _Reallocate(size_type _Count) 
    { // move to array of exactly _Count elements 
    pointer _Ptr = this->_Getal().allocate(_Count); 

    _TRY_BEGIN 
    _Umove(this->_Myfirst, this->_Mylast, _Ptr); 
+1

오류 메시지를 추가하십시오. 또한 C++을 사용하면서 C89 스타일의 변수를 선언하는 이유는 무엇입니까? –

+0

[mcve]를 만드십시오. 전체 코드가 수 마이크로 초 정도 걸리기 때문에 예제의 병렬 처리에 대해 논의하는 것은 실제로 유용하지 않습니다. 병렬화가 실제로 필요한 부분을 제시 할 수 있다면 훨씬 더 생산적 일 것입니다. – Zulan

+0

줄을 추가했습니다! – Wooni

답변

1

std::vector::push_back에서 중지, 당신은 여러 스레드에서 경쟁 조건에 대한 어떠한 보호없이 그것을 호출 할 수 없습니다.

대신 크기가 이미 맞도록 벡터를 준비한 다음 operator[]을 통해 요소를 삽입하십시오.

또는 당신이 위험 지역으로 삽입을 보호 할 수 있습니다 :

#pragma omp critical 
B.push_back(A); 

한 번에 하나의 스레드가 오류를 수정하지만 코드가 느려지 며 삽입을 할 것입니다 이런 식으로.

일반적으로 병렬화에 올바른 방법으로 접근하지는 않겠지 만 더 명확하고보다 대표적인 문제 설명 없이는 더 나은 조언을 줄 수있는 방법이 없습니다.

+0

감사합니다. 이 작품. 또한 언급했듯이 병렬 처리로 완벽하게 작동하지 않습니다. 더 많은 것을 공부해야합니다 .. – Wooni

+0

답이 원래 문제를 해결 한 경우 체크 표시를 클릭하여 허용 된 것으로 표시하십시오. 병렬 속도 향상에 대한 후속 질문은 [mcve]를 작성하고 관찰 된 성능과 사용하는 컴파일러 및 시스템을 설명하십시오. – Zulan