Существующее соединение было принудительно закрыто удаленным хостом - MPI - PullRequest
0 голосов
/ 06 марта 2012

Я делаю приложение, использующее C и MPI, которое делает вектор с умножением матрицы, но у меня продолжают появляться ошибки, такие как Ошибка отправки readv, и Существующее соединение было принудительно закрыто удаленным хостом (10054). Вот код:

#include "stdio.h"
#include "mpi.h"

#define W 5
#define H 5

void make_matrix(int[]);
void make_vector(int []);

void main(int argc, char* argv[])
{

  int myrank,size,k;
  int matrix[H*W];
  int vec[W];
  int res[W];
  static int col_count = 0;

  MPI_Init(&argc,&argv);
  MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
  MPI_Comm_rank(MPI_COMM_WORLD,&size);

  MPI_Bcast(vec,W,MPI_INT,0,MPI_COMM_WORLD);

  if(myrank != 0)
  {
    for(k=0; k<W; k++)
    {
      vec[k]+= matrix[k*W+col_count];
    }
    col_count++;
    printf("%d ",vec[col_count]);
  }

  MPI_Finalize();
}

void make_matrix(int a[])
{
  int i;
  for(i=0; i<H*W; i+=1)
  {
    a[i] = i;
  }
};

void make_vector(int v[])
{
  int i;
  for(i=0; i<H; i++)
    v[i] = i*2;
};

1 Ответ

1 голос
/ 06 марта 2012

MPI_Bcast() - это коллективная функция, которая означает, что каждый процесс в коммуникаторе должен вызывать ее. Другими словами, не звоните MPI_Recv(). Так что избавьтесь от условного if(myrank == 0) и вызовите все процессы:

MPI_Bcast(vec,W,MPI_INT,0,MPI_COMM_WORLD);

Обратите внимание, что у меня vec выше, а не &vec; поскольку vec уже является массивом, это указатель, который нужен MPI. Кроме того, ваш результат появится в vec для процессов без полномочий root; нет необходимости в отдельном массиве arr.

Я рекомендую вам прочитать некоторые примеры MPI и попытаться сделать ваш код более похожим на них.

...