max для OMP
От: barmale-y  
Дата: 30.11.09 19:50
Оценка:
Реально ли написать max для openmp?

$ cat test-max.cc 
#include <iostream>

int max(int a, int b){
   return a>b?a:b;
}

main(){
int i;
int data[4];
#pragma omp parallel for shared(data) private(i) reduction(data:max)
for(int i=0; i<4; ++i){
   data[i]=i*i;
}
}


$ c++ -fopenmp test-max.cc -o test-max.eXe
test-max.cc: In function ‘int main()’:
test-max.cc:11: ошибка: expected `+', `*', `-', `&', `^', `|', `&&', or `||' before ‘data’
Re: max для OMP
От: remark Россия http://www.1024cores.net/
Дата: 30.11.09 20:03
Оценка: 2 (1)
Здравствуйте, barmale-y, Вы писали:

Во-первых, в reduction(data:max) вначале идёт операция, а потом список переменных.
reduction поддерживает только очень ограниченный набор операций, для более сложных нужно использовать ручное аггрегирование с помощью критической секции. Что-то в таком духе:

int main()
{
    int max = 0;
    int lmax;
#   pragma omp parallel shared(max) private(lmax)
    {
        lmax = 0;
#       pragma omp for
        for (int i = 0; i < 1000000; ++i)
        {
            int sq = i * i;
            if (sq > lmax)
                lmax = sq;
        }
#       pragma omp critical
        {
            if (lmax > max)
                max = lmax;
        }
    }
}



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.