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

标签 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);
}

最佳答案

此处存在索引错误。 C 是 0 索引的 您从未初始化 A[0],并且尝试访问 A[N],即使数组仅分配给 N-1。所以谁知道 A[0] 和 A[N] 中的值是什么 - 它们可能非常大,给你垃圾值。

关于c - 如何让openmp在子程序中正确运行(c语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48773005/

相关文章:

c - 分隔字符中的两个值并将它们分配给变量

c++ - 如何确定使用 "task"的循环是否被并行化?

c - 使用 openmp c 优化 N-queen

c - "hello world"使用 OpenMP 和 MPI 混合的 C 程序

c - 将数组放在堆上而不是堆栈上,是否可以消除段错误的可能性?

c - 将 STDOUT 和 STDERR 重定向到文件 ">&"

c++ - 必须在赋值中赋值

c - 以正确的顺序读取内存需要一些帮助

c - OpenMP - 在并行 for 循环中调用外部函数

c++ - omp_get_max_threads() 在并行区域返回 1,但它应该是 8