c - 现有连接被远程主机强制关闭 - MPI

标签 c mpi

我使用 C 和 MPI 编写一个通过矩阵乘法生成 vector 的应用程序,但我一直遇到错误,例如 Error posts readv 和 An现有连接被远程主机强制关闭 (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;
};

最佳答案

MPI_Bcast() 是一个集体函数,这意味着通信器中的每个进程都必须调用它。换句话说,不要调用 MPI_Recv()。因此,摆脱 if(myrank == 0) 条件并让所有进程调用:

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

请注意,我上面有 vec,而不是 &vec;由于 vec 已经是一个数组,因此它是 MPI 需要的指针。此外,您的结果将出现在非 root 进程的 vec 中;不需要单独的 arr 数组。

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

关于c - 现有连接被远程主机强制关闭 - MPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9590672/

相关文章:

金融中的计算几何算法?

c - 如何设置 gcc 以使用文件扩展名(.c 或 .cpp)来确定正确的编译器/链接器?

c++ - 从有符号字符转换为无符号字符然后再转换回来?

c++ - 选择并行化方案要考虑什么?

c - MPI_Allgather 产生不一致的结果

c - printf的原型(prototype)和实现

c - 我陷入链表的无限循环

c++ - 为什么我的 MPI 应用程序会触发断点?

c++ - BSP 和 MPI 有什么区别?

java - MPI Recv 数据损坏