用户定义的减少不会返回每次运行的预期结果

问题描述 投票:1回答:1

我试图找到并行使用OpenMP,2d数组中的最小值和最大值以及最小值和最大值的索引。在我的尝试中,我使用用户定义的缩减,但是每次运行都会得到意想不到的结果。

我已经尝试检查for循环中min和max的值,看起来在并行for循环中,min和max值是预期的。但是,在运行结束时,min和max包含完全wacko值。

我的减少定义

typedef struct {
    int value;
    int index_i;
    int index_j;
} Point;

#pragma omp declare reduction(minimum : Point : \
    omp_out = omp_in.value < omp_out.value ? omp_in : omp_out) \
    initializer(omp_priv = {INT_MAX, 0, 0})
#pragma omp declare reduction(maximum : Point : \
    omp_out = omp_in.value > omp_out.value ? omp_in : omp_out) \
    initializer(omp_priv = {0, 0, 0})

初始化2d阵列,其中size10000

for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
        matrix[i][j] = rand()%99;
    }
}

并行循环:

int i, j, total=0;
Point min, max;

#pragma omp parallel for reduction (+:total) reduction(minimum : min) reduction(maximum : max) private(j)
    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            total += matrix[i][j];

            if (matrix[i][j] < min.value) {
                min.value = matrix[i][j];
                min.index_i = i;
                min.index_j = j;
            }


            if (matrix[i][j] > max.value) {
                max.value = matrix[i][j];
                max.index_i = i;
                max.index_j = j;
            }
        }
    }

预期的结果是qazxsw poi指数qazxsw poi和qazxsw poi指数min = 0

每次实际结果都不同,但输出示例如下:

(0, 70)
c openmp reduction
1个回答
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.