OpenMP and Multithreading: Difference between revisions
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"> | ||
Type count = 0; | |||
Container | Container<Type> a; | ||
#pragma omp parallel for | #pragma omp parallel for | ||
for (int i = 0; i < | for (int i = 0; i < a.size(); ++i) | ||
{ | { | ||
#pragma omp atomic | #pragma omp atomic | ||
count += | 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;
- 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;
- pragma omp parallel private(It)
{
for(It = cont->begin(); It != cont->end(); It++) {
- pragma omp single nowait
foo(It); }
} </source>
- calculating a sum
<source lang="cpp"> Type count = 0; Container<Type> a;
- pragma omp parallel for
for (int i = 0; i < a.size(); ++i)
{
- pragma omp atomic
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>