developer tip

C ++ 11 범위 기반 for 루프와 함께 OpenMP를 사용하십니까?

optionbox 2020. 12. 2. 08:31
반응형

C ++ 11 범위 기반 for 루프와 함께 OpenMP를 사용하십니까?


이 작업에 대한 반대 표시가 있습니까? 아니면 동작이 잘 지정되어 있습니까?

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

OpenMP 사양은 C ++ 98에서만 유효하지만 여기에서는 사용되지 않는 C ++ 11 스레드로 인해 더 많은 비 호환성이있을 수 있다고 생각합니다. 나는 여전히 확신하고 싶었다.


OpenMP 4.0 사양은 며칠 전에 완성되어 여기에 게시 되었습니다 . 병렬 루프는 여전히 표준 형식이어야합니다 (§2.6, p.51).

for (init-expr ; test-expr ; incr-expr ) 구조화 블록

이 표준은 랜덤 액세스 반복기를 제공하는 컨테이너를 모든 표현식에서 사용할 수 있도록 허용합니다. 예 :

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

여전히 C ++ 11 구문 설탕 사용을 고집하고의 각 요소를 처리하는 데 (비교적으로) 많은 시간이 걸리는 stl_container경우 단일 생산자 작업 패턴을 사용할 수 있습니다.

#pragma omp parallel
{
   #pragma omp single
   {
      for (auto x : stl_container)
      {
         #pragma omp task
         {
            // Do something with x, e.g.
            compute(x);
         }
      }
   }
}

태스크는 특정 오버 헤드를 유발하므로 compute(x);완료 하는 데 시간이 거의 걸리지 않으면이 패턴을 사용하는 것은 의미가 없습니다 .


OpenMP 5.0은 99 페이지에 다음 행을 추가하여 많은 범위 기반 for 루프를 만들었습니다.

2.12.1.3 랜덤 액세스 반복기가있는 범위 기반 for 루프는 표준 루프 형식을 갖습니다.

출처 : https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf

참고 URL : https://stackoverflow.com/questions/17848521/using-openmp-with-c11-range-based-for-loops

반응형