OpenMP and Multithreading: Difference between revisions

From LPTMS Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 26: Line 26:


* calculating a sum
* calculating a sum
<source lang="cpp">
<source lang="cpp">
int count = 0;
Type count = 0;
Container cont;
Container<Type> a;
#pragma omp parallel for
#pragma omp parallel for
for (int i = 0; i < cont.size(); ++i)
for (int i = 0; i < a.size(); ++i)
   {
   {
#pragma omp atomic
#pragma omp atomic
     count += cont[i];
     count += a[i];
   }
   }
</source>
or better
<source lang="cpp">
Type count = 0;
Container<Type> a;
#pragma omp parallel for reduction(+,count)
for (int i = 0; i < a.size(); ++i)
    count += a[i];
</source>
</source>

Revision as of 15:22, 7 April 2011

simple parallelization

  • brute force loop parallelization with direct access to elements using [] (for instance with int[], vectors<T>, valarray<T>...)

<source lang="cpp"> Container cont;

  1. pragma omp parallel for

for(int i=0; i < cont.size(); i++)

  foo(cont[i]);

</source>


  • with stl iterators on containers, provided foo() does independent processes:

<source lang="cpp"> Container cont; Container::iterator It;

  1. pragma omp parallel private(It)

{

   for(It = cont->begin(); It != cont->end(); It++)
   {
  1. pragma omp single nowait
    foo(It);
   }

} </source>

  • calculating a sum

<source lang="cpp"> Type count = 0; Container<Type> a;

  1. pragma omp parallel for

for (int i = 0; i < a.size(); ++i)

 {
  1. pragma omp atomic
   count += a[i];
 }

</source> or better <source lang="cpp"> Type count = 0; Container<Type> a;

  1. pragma omp parallel for reduction(+,count)

for (int i = 0; i < a.size(); ++i)

   count += a[i];

</source>