Реально ли написать 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’
Здравствуйте, 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;
}
}
}