我正在尝试比较 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);
}
最佳答案
此处存在索引错误。 C 是 0 索引的 您从未初始化 A[0],并且尝试访问 A[N],即使数组仅分配给 N-1。所以谁知道 A[0] 和 A[N] 中的值是什么 - 它们可能非常大,给你垃圾值。
关于c - 如何让openmp在子程序中正确运行(c语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48773005/