我使用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;
};
答案 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示例,并尝试让您的代码看起来更像它们。