我试图比较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);
}
答案 0 :(得分:1)
这里有索引错误。 C是0索引您永远不会初始化A [0],并且您尝试访问A [N],即使该数组仅分配给N-1。那么谁知道A [0]和A [N]中的值是什么 - 它们可能非常大,给你垃圾值。