远程主机MPI强行关闭现有连接

时间:2012-03-06 19:41:20

标签: c mpi

我使用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 个答案:

答案 0 :(得分:1)

MPI_Bcast()集合函数,这意味着通信器中的每个进程都必须调用它。换句话说,请勿致电MPI_Recv()。所以摆脱你的if(myrank == 0)条件并让所有进程调用:

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

请注意,我上面有vec,而不是&vec;因为vec已经是一个数组,所以它是MPI需要的指针。此外,您的结果将显示在非根进程的vec中;不需要单独的arr数组。

我建议您阅读一些MPI示例,并尝试让您的代码看起来更像它们。