Using OpenMP with C++11 range-based for loops?

前端 未结 2 1968
一整个雨季
一整个雨季 2020-12-13 23:43

Is there any counter-indication to doing this ? Or is the behavior well specified?

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

相关标签:
2条回答
  • 2020-12-14 00:14

    OpenMP 5.0 adds the following line on page 99, which makes a lot of range-based for loops OK !

    2.12.1.3 A range-based for loop with random access iterator has a canonical loop form.

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

    0 讨论(0)
  • 2020-12-14 00:15

    The OpenMP 4.0 specification was finalised and published several days ago here. It still mandates that parallel loops should be in the canonical form (§2.6, p.51):

    for (init-expr; test-expr; incr-expr) structured-block

    The standard allows for containers that provide random-access iterators to be used in all of the expressions, e.g.:

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

    If you still insist on using the C++11 syntactic sugar, and if it takes a (comparatively) lot of time to process each element of stl_container, then you could use the single-producer tasking pattern:

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

    Tasking induces certain overhead so it would make no sense to use this pattern if compute(x); takes very little time to complete.

    0 讨论(0)
提交回复
热议问题