为什么使用 openMP 计算数组平均值时会得到错误的结果?

问题描述 投票:0回答:1
#include <stdio.h>
#include <omp.h>

#define N 5

int X[N];

int main() {
    int num = 0;
    int moy = 0;

    // Initialize the array (you should populate it as needed)
    for (int i = 0; i < N; i++) {
        X[i] = i * 2; // Example initialization
    }

    // Calculate the average
    #pragma omp parallel for reduction(+:moy)
    for (int i = 0; i < N; i++) {
        moy += X[i] / N;
    }

    // Count elements greater than the average
    #pragma omp parallel for reduction(+:num)
    for (int i = 0; i < N; i++) {
        if (X[i] > moy) {
            num++;
        }
    }

    printf("%d\n", num);

    return 0;
}

如果我为数组的mean、num和元素编写打印语句,我会得到以下输出:
平均(月):2
X 中的元素:0 2 4 6 8
大于平均值的元素数量:3

c loops openmp reduction
1个回答
0
投票

这不是一个 openmp 问题,您将

moy
声明为
int
,然后计算您所做的平均值:

moy += X[i] / N;

你的

X
数组包含
0, 2, 4, 6, 8
N = 5
,当执行除法时,你试图将
double
放入
int
中,这样你的总和就变成了:

0/5 = 0
+
2/5 = 0
+
4/5 = 0
+
6/5 = 1
+
8/5 = 1
=
0+0+0+1+1
=
2

您需要将

moy
X
设为
double
,或者更好的是,将
moy
设为
double
,将
moy
内的所有元素相加,然后执行
moy/N
以获得正确的结果

© www.soinside.com 2019 - 2024. All rights reserved.