2012-03-06 105 views
0

我正在做一个使用C和MPI的应用程序,通过矩阵乘法产生一个向量,但是我一直有错误发布readv等错误,并且现有连接被强制关闭远程主机(10054) 下面是代码:一个现有的连接被远程主机强制关闭 - MPI

#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

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的例子,并试着让你的代码看起来更像他们。

+0

谢谢你的回答,我做了你告诉我的,但我没有错误,但答案是不正确的。我删除了MPI_Bcast有条件的myrank,但是在计算值时我使用了...是否正确?我将编辑上面的代码.... – mahmoud 2012-03-06 20:11:10

+0

@mahmoud我不确定你想要完成什么。我的答案解决了您的沟通错误。你的代码中可能有很多其他问题,但我不知道你的目标是什么;这是一个完全不同的问题。 – chrisaycock 2012-03-06 20:22:14

+0

还有一个关于沟通的问题,是否正确地处理了除了根之外的所有处理单元所做的任何计算,还是应该涉及到根? – mahmoud 2012-03-06 20:38:08

相关问题