Найти минимальное значение в 2d массиве с MPI - PullRequest
0 голосов
/ 09 апреля 2020

Недавно начали изучать технологию MPI. Задача - найти минимальное значение в матрице. Ищите себе распараллеливание для более быстрой работы. Но я не могу думать о том, как сделать параллельную версию из последовательной версии программы, которую я прошу о помощи

#include <stdio.h>
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int rows, cols, min, value, n;
int done = 0, numprocs, rank, i, j;
srand(time(NULL));
double startwtime = 0.0, endwtime; 
int namelen; 
char processor_name[MPI_MAX_PROCESSOR_NAME]; 
MPI_Init(&argc,&argv); 
MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 
MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
MPI_Get_processor_name(processor_name,&namelen); 
    while (!done) { 
    if (rank == 0) { 
        printf("Enter the height/width of the matrix\n");
        scanf("%d",&rows);
        scanf("%d",&cols);
        startwtime = MPI_Wtime(); 
    }
    if (rows == 0 || cols == 0) {
        done = 1; 
    } else { 
        int **arr = (int **) malloc(rows * sizeof(int*));    //creating 2d array
            for (i = 0; i < rows; i++) {
                arr[i] = (int *) malloc(cols * sizeof(int));
        }
        for (i = 0; i < rows; i++) {         //Array filling
            for (j = 0; j < cols; j++) {
                arr[i][j] = rand();
            }
        }
        for (i = 0; i < rows; i++) {      // output of the array to the screen for clarity
            for (j = 0; j < cols; j++) {
                printf("%d\n",arr[i][j]);
            }
        }
        min = arr[0][0];                                      
        for (i = 0; i < rows; i++) {                              //find min value
            for (j = 0; j < cols; j++) {                          //
                if(min > arr[i][j]){min = arr[i][j];}         //need to parallize
            }
        }    
        if (rank == 0) { 
            endwtime = MPI_Wtime();
            printf("min = %d\n", min); 
            printf("wall clock time = %f\n", endwtime-startwtime); 
            fflush( stdout ); 
            for(i = 0; i < rows; i++) {
                    free(arr[i]);
            }
            free(arr);
        }
    }
}
MPI_Finalize();
return 0;
}

Извините за плохой английский, я надеюсь на вашу помощь

UPD: добавлена ​​похожая функция, но программа выдает мусор. Мне кажется, что это связано с созданием массива на основе указателей. И скорее всего я неправильно использовал функции

        MPI_Scatter (&arr[0][0], rows*cols/numprocs, MPI_INT, &arr[rows][cols], rows*cols/numprocs, MPI_INT, 0, MPI_COMM_WORLD);    
        min = arr[0][0];
        for (i = 0; i < rows; i++) {
            for (j = 0; j < cols; j++) {
                min = arr[i][j];
            }
        }   
        MPI_Reduce(&min, &value, rows*cols/numprocs, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD); 
...