我是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或其他东西接收数据?
感谢您的帮助。
答案 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;
}