如何在子程序中正确运行openmp(c语言)

时间:2018-02-13 18:09:09

标签: c openmp

我试图比较openmp减少总和与数组的正常序列求和之间的差异。但我只从我的子程序" fast_sum"得到了垃圾编号,而serial_sum中的结果是正确的。我不知道为什么......我可以使用gcc-7 -fopenmp成功编译我的代码。请帮帮我,谢谢你!

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <omp.h>
#include <sys/time.h>
#define NUM_THREADS 8

//////// serial /////////
double serial_sum(double *A, int N){
double sum=0.0;
int i;
for(i=1;i<=N;++i)
    sum += A[i];

return(sum);
}

double fast_sum(double *A, int N){
double sum=0.0;
int i;
#pragma omp parallell for reduction(+:sum) num_threads(NUM_THREADS)
for (i =1; i<=N; ++i)
    sum += A[i];

return(sum);
}  

int main(void)
{
int N = 256;
double sum1, sum2, sum3;
double *A;
int i, h;

A = (double*)malloc(N * sizeof(double));

for( i = 1; i<=N;++i){
    A[i] = i;
}

/* initialization A[N] */

sum1 = serial_sum(A,N);
printf("normal_sum is %f\n", sum1);
sum2 = fast_sum(A,N);
printf("fast_sum is %f\n", sum2);

free(A);
}

1 个答案:

答案 0 :(得分:1)

这里有索引错误。 C是0索引您永远不会初始化A [0],并且您尝试访问A [N],即使该数组仅分配给N-1。那么谁知道A [0]和A [N]中的值是什么 - 它们可能非常大,给你垃圾值。