2016-08-27 3 views
-1

OpenMP를 사용하여 for 루프를 병렬 처리하려고합니다 (이전에 std :: threads를 사용하여 직접 수행했지만 그 솔루션은 다소 못 생겼습니다). 각 반복마다. 그러나OpenMP : for-loop에서 다른 조건 가능

#pragma omp parallel for 
for(int i = 0; i < someVector.size(); i++) 
{ 
. . . 
if(something) 
    someVector.push_back(v); 
} 

, 작동하지 않습니다 는 여기에 내가 무엇을 의미하는지의 예입니다. 루프는 초기 someVector.size() 값까지 계속됩니다. OpenMP에서 이러한 구성을 병렬화하는 방법이 있습니까?

+0

'something'은'i'에 의존합니까? – Barmar

+0

아니요, 아무 관련이 없습니다. –

+0

그러면 전역 데이터를 사용하는 경우 병렬화 할 수 없을 것입니다. – Barmar

답변

0

OpenMP #pragma omp for은 for 루프의 조건을 인식합니다. 0부터 최대까지 숫자를 반복하여 처음부터 최대 값을 평가 한 다음 작업을 여러 스레드로 나눕니다. 루프 실행 중에 최대 값이 변경되면 효과가 없습니다.

다른 스레드가 사용하는 동안 std::vector을 수정하는 것은 확실히 안전하지 않습니다. 성장할 때 벡터가 저장된 데이터를 이동 한 후에 해제 된 메모리에 액세스하기 때문에 충돌이 발생할 수 있으므로 정의되지 않은 동작이 발생합니다.

std::vector을 스레드로부터 안전한 대기열로 바꿀 수 있습니다. 그런 다음 다중 작업자를 병렬로 사용하여 자유롭게 값을 입력하고 밀어 넣을 수 있습니다.

2

이 코드는 부적합합니다. for 문은 사양에 의해 #pragma omp parallel for (의 섹션 2.6)으로 주석을 달 수있는 루프가 아닌 정규형을 갖습니다.

문제는 조건부 표현식에 있습니다. 조건부 표현식의 형식이 i relational-op expr 인 경우 expr은 루프 불변식이어야하며이 제약 조건은 코드에서 충족되지 않습니다.