Kompilacja programu MPI

0

Poniżej przedstawię kod. Kompilowałem komendą "mpicc -o suma suma.c" i wszystko przebiegło bez zastrzeżeń. Chciałem odpalić komendą "mpirun -n 8 ./suma" i jest informacja o błędzie segmentacji, ewentualnie nic się nie wyświetla. Powiem szczerze, nie widzę w nigdzie błędów, więc wie ktoś może jak pomóc z tą kompilacją? Pracuję na Linux Mint Cinnamon.

#include <mpi.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define SIZE 6

// suma wierszów w tablicy, dekompozycja wierszowa

int main (int argc, char** argv)
{
  double tab[SIZE]; // wektor wyników
  double privRes[SIZE]; // wyniki wątków
  double matrix [SIZE][SIZE]; // tablica

  // wypełnianie tablicy i wektora danymi

  int n = 1;
  for (int i = 0; i < SIZE; i++)
  {
    for (int j = 0; i < SIZE; j++)
    {
	matrix[i][j] = n;
	n++;
    }
    tab[i] = 0;
  }

  int rank, size = SIZE;

  MPI_Init (&argc, &argv); // inicjalizacja mechanizmu MPI
  MPI_Comm_rank (MPI_COMM_WORLD, &rank); // pobieranie id procesu
  MPI_Comm_size (MPI_COMM_WORLD, &size); // pobranie liczby procesów

  if (rank == 0) // jeśli proces jest zerowy
  {
    printf("Macierz: \n");
    for (int i = 0; i < SIZE; i++)
	for (int j = 0; j < SIZE; j++)
	  printf("%f ", matrix[i][j]);
    printf("\n");
  }
  MPI_Barrier(MPI_COMM_WORLD);

  printf("\nZgłasza się proces nr: %d \n", rank);

  double row[SIZE]; // wiersze
  // wprowadzanie wiersza macierzy do wiersza w "row" zgodnie z id procesu
  MPI_Scatter(matrix, size, MPI_DOUBLE, row, size, MPI_DOUBLE, 0, MPI_COMM_WORLD);

  MPI_Reduce(&privRes, &tab, size, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

  MPI_Barrier(MPI_COMM_WORLD);

  if (rank == 0)
  {
    printf("\nResults in rows:\n");
    for (int i = 0; i < SIZE; i++)
	printf("%f ", tab[i]);
  }

  MPI_Finalize(); // zakończenie procedur MPI
  return (0);
}

0

Skoro size oznacza u Ciebie liczbę workerów, a SIZE to maksymalny rozmiar macierzy, to wołając MPI_Scatter możesz w przypadku size=8 i SIZE=6 próbować odczytywać pamięć poza przydzielonym blokiem.

Poza tym - gdb Twym przyjacielem jest.

0

W porządku, tu akurat racja. Odpaliłem jednak dla sześciu procesów i pojawia się następujący komunikat:

 --------------------------------------------------------------------------
mpiexec noticed that process rank 0 with PID 0 on node mm-GE62-6QF exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------
Makefile:32: recipe for target 'run' failed
make: *** [run] Error 139

W czym może leżeć problem? Co do debuggera, mógłbym prosić o jakiś link, jak go poprawnie użytkować?

0

Odnośnie gdb, ależ proszę:

A w czym może być problem - pewnie MPI_Scather albo MPI_Reduce została użyta niewłaściwie. Znajdź sobie dokumentację do MPI, poczytaj, co one robią, to pewnie znajdziesz błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1