MPI_Scatter root выход из процесса с сигналом (6) - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь прочитать изображение (.ras) и отправляю часть изображения каждому процессу. Но каждый раз, когда я получаю

Основное задание завершается нормально, но 1 процесс возвращает ненулевой код завершения. По указанию пользователя задание было прервано. mpirun заметил, что процесс ранга 0 с PID 0 на узле эскандараны завершился по сигналу 6 (прервано).

Вот мой код:


typedef struct {
  struct rasterfile file;  ///< Entête image Sun Raster
  unsigned char rouge[256],vert[256],bleu[256];  ///< Palette de couleur
  unsigned char *data;    ///< Pointeur vers l'image
} Raster;

int main(int argc, char *argv[]) {
  Raster r;
  int    w, h, lh;  /* nombre de lignes et de colonnes de l'image */
  /* Variables liees au traitement de l'image */
  int    filtre;        /* numero du filtre */
  int    nbiter;        /* nombre d'iterations */
  /* Variables liees au chronometrage */
  double debut, fin;
  /* Variables de boucle */
  int   i,j;
  /* Nombres de processus */
  int p, my_rank, tag = 0, root = 0;
  MPI_Status status;
  if (argc != 4) {
    fprintf( stderr, usage, argv[0]);
    return 1;
  }      
  /* Saisie des paramètres */
  filtre = atoi(argv[2]);
  nbiter = atoi(argv[3]);

  /* Initialisation */
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  MPI_Comm_size(MPI_COMM_WORLD, &p);

  /* Lecture du fichier Raster */
  if (my_rank == root) {
    lire_rasterfile( argv[1], &r);
    h = r.file.ras_height;
    w = r.file.ras_width;
    lh = (h/p) + 2;
  }
  MPI_Bcast(&w, 1, MPI_INT, root, MPI_COMM_WORLD);
  MPI_Bcast(&lh, 1, MPI_INT, root, MPI_COMM_WORLD);
  int shift = 0;
  if (my_rank == 0 || my_rank == p-1) {
    lh--;
    shift = w;
  }
  unsigned char *bandlette = (unsigned char *) malloc(w * lh * sizeof(unsigned char));
  MPI_Scatter(r.data, w*h, MPI_UNSIGNED_CHAR, bandlette + shift, w*lh, MPI_UNSIGNED_CHAR, root, MPI_COMM_WORLD);

  printf("my rank is %i\n", my_rank);

  free(bandlette);
  free(r.data);
  MPI_Finalize();

  return 0;
} ```

1 Ответ

1 голос
/ 29 февраля 2020

Проблема в том, что вторым аргументом MPI_Scatter является размер данных, которые вы хотите отправить каждому процессу, а не общий размер send_buffer. Так что в этом случае это будет w * h / p .

...