在mpi mpich中询问MPI_Reduce和MPI_Bcast

时间:2017-11-11 05:41:37

标签: c parallel-processing mpi parallels mpich

我是MPI新手。我的程序计算从1到100的总和但抛出错误,我不明白为什么。 我正在学习MPI_Reduce和MPI_Bcast,所以我尝试尽可能多地使用它们。 这是我的计划。

// include something


int main (int argc, char * argv[])
{
    int rank, size, root = 0;
    int i,j,k,S[100],n=100,p, sum;

    MPI_Init( &argc, &argv ); 
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
    MPI_Comm_size( MPI_COMM_WORLD, &size );

    //get n
    if(rank==root){
        n=100;
    }
    //send data to all process
    MPI_Bcast( &n, n, MPI_INT,root, MPI_COMM_WORLD );

    p=n/rank;
    while(p>0){
        for(i=1;i<p;i++){
            for(k=0;k<rank;k++){
                S[k]=i+i*rank;
            }
        }
        p=p/2;
    }
    //get data from all process
    MPI_Reduce( S, &sum, n, MPI_INT, MPI_SUM, root, MPI_COMM_WORLD );

    if(rank==root){
        printf("Gia tri cua S trong root: %d", sum);
    }

    MPI_Finalize();
    return 0;
}

这是我的错误:

job aborted:
[ranks] message

[0] process exited without calling finalize

[1-4] terminated

---- error analysis -----

[0] on DESKTOP-GFD7NIE
mpi.exe ended prematurely and may have crashed. exit code 0xc0000094

---- error analysis -----

我也有一些不清楚MPI的事情,我希望你能帮助我弄明白:
1)如果我有这样的代码:

//include something
int main(){
    MPI_Init( &argc, &argv ); 
    int rank, size, root = 0;
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
    MPI_Comm_size( MPI_COMM_WORLD, &size );
    //code 1
    if(rank==0){ 
    //code 2
    }
}

这意味着每个进程都将执行代码1,只有0级执行代码2.它是否正确?

2)根据this,函数MPI_Reduce(const void * sendbuf,void * recvbuf,int count,MPI_Datatype数据类型,MPI_Op op,int root,MPI_Comm comm)具有recvbuf。但是我不明白它,变量是否会从sendbuf或其他东西接收数据?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我修改了你的程序来计算0到9之间的总和(45)。 用mpic ++编译它并在开始时使用2个进程运行它,在注释中使用“cout”以更好地理解哪个等级正在做什么。

localsum是每个等级的总和,它为每个等级提供一个整数。

globalsum在主进程中给出一个整数。

#include <iostream>
using namespace std;

int main (int argc, char * argv[])
{
int rank, size, root = 0;
int j,k,S[10],n=10,p;

MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );

//get n
if(!rank){
    n=10;
}
//send data to all process
MPI_Bcast( &n, n, MPI_INT,root, MPI_COMM_WORLD );

int localsum = 0, globalsum = 0 ;
for (int i = rank; i < n; i += size ) {
    S[i] = i;
    localsum += S[i];
    // cout << rank << " " << S[i] <<  endl;
}

// cout << localsum << endl;

//get data from all process
MPI_Reduce( &localsum, &globalsum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD );

if(!rank){
    cout << "Globalsum: " << globalsum << endl;
}

MPI_Finalize();
return 0;
}