Я пытаюсь найти, параллельно с использованием OpenMP, минимальное и максимальное значения в 2-мерном массиве, а также индексы минимального и максимального значений.В своей попытке я использую определяемые пользователем сокращения, однако получаю неожиданные результаты для каждого запуска.
Я попытался проверить значения min и max в циклах for, и кажется, что внутри распараллеленных циклов forминимальное и максимальное значения соответствуют ожидаемым.Однако в конце цикла 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, где size
равно 10000
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;
}
}
}
Ожидаемый результат: min = 0
по индексу (0, 70)
и max = 98
по индексу (0, 20)
.
.фактические результаты отличаются каждый раз, но пример выводится:
The min is -290390323 at index (21850, -9176672)
The max is 32595 at index (0, 0)