Я пытаюсь создать редукционную переменную внутри осиротевшей подпрограммы в C. Я понимаю, что мне нужно передать переменную по указателю в подпрограмму, чтобы убедиться, что она обрабатывается как общая (она является общей в охватывающей параллельной области),Однако, когда я пытаюсь скомпилировать компилятор, мне не нравится тот факт, что переменная является указателем (я думаю), и жалуется, что у него нет типа сокращения для указателей, т.е. с помощью компилятора cray я получаю эту ошибку:
CC-1642 craycc: ERROR File = main.c, Line = 33
The OpenMP reduction clause does not accept pointer or reference types.
#pragma omp for reduction(+:sum)
При использовании этого примера кода:
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
int myroutine(double *, double *, int);
int main(void){
double a[100];
double sum;
int i;
int n = 100;
for(i=0;i<n;i++){
a[i]=3.2;
}
#pragma omp parallel shared(a,n,sum)
{
myroutine(a, &sum, n);
}
printf("sum = %lf\n",sum);
return 0;
}
int myroutine(double *a, double *sum, int n){
int i;
#pragma omp for reduction(+:sum)
for(i=0;i<n;i++){
*sum += a[i];
}
return 0;
}
Нужно ли выполнять копирование из переданной по указателю переменной в локальную переменную?Или есть другой способ добиться этого?