2013-07-25 2 views
41

이렇게하기위한 반대 표시가 있습니까? 아니면 행동이 잘 지정되어 있습니까?C++에서 OpenMP 사용 11 범위 기반 for 루프?

#pragma omp parallel for 
for(auto x : stl_container) 
{ 
    ... 
} 

은 OpenMP의 사양은 C++ 98 만 유효한 것 같다하지만 난 여기에 사용되지 않는 C++ 11 스레드로 인해 더 호환성,있을 수 있습니다 생각 때문입니다. 나는 아직도 확신하고 싶었다.

+0

+ 좋은 질문입니다. 그것도 알고 싶습니다. – lulyon

답변

28

OpenMP 4.0 사양은 며칠 전 here으로 확정되고 발표되었습니다.

for (INIT-EXPR;시험 EXPR;증분-EXPR)구성 블록 : 아직 평행 루프 (§2.6, P.51) 정규형이어야 것을 의무화

0 :

이 표준은 임의 접근 반복자는 모든 표현식에 사용되는 제공하는 용기, 예를 들어 수 있습니다 여전히 C++ 11 문법 설탕을 사용하여 주장하고 stl_container의 각 요소를 처리하는 데 시간이 (비교적)이 많이 걸리는 경우, 다음 패턴을 태스킹 단일 생산을 사용할 수있는 경우

#pragma omp parallel for 
for (it = v.begin(); it < v.end(); it++) 
{ 
    ... 
} 

:

compute(x);를 완료하는 데 약간의 시간이 걸린다면 아무 의미가이 패턴을 사용하지 수 있도록 할 수 있도록
#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     for (auto x : stl_container) 
     { 
     #pragma omp task 
     { 
      // Do something with x, e.g. 
      compute(x); 
     } 
     } 
    } 
} 

는 태스킹 특정 오버 헤드를 유도한다.

+0

필자는 반복자가 지금까지는 갈 길이 멀다고 생각하지만, gcc로 컴파일하기를 원하면! =와 <를 사용해야한다. 그렇지 않으면 "유효하지 않은 제어 조건문"오류가 발생한다. 그건 그렇고, 왜 그런지 알아? – DarioP

+0

이 웹 사이트에 따르면 : http://www.cplusplus.com/reference/iterator/RandomAccessIterator/ 그것은 작동해야합니다 ... –

+0

그 웹 사이트에서 그들은주기 전에 어떤 pragma를 두지 않습니다. 컴파일을 시도해보십시오. – DarioP