我是MPI的新手。我的程序計算從1到100的總和,但拋出一個錯誤,我不明白爲什麼。 我正在學習MPI_Reduce和MPI_Bcast,所以我儘量使用它們。 這是我的程序。詢問MPI_Reduce和MPI_Bcast的mppi
// 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。它是正確的嗎?根據this,函數MPI_Reduce(const void * sendbuf,void * recvbuf,int count,MPI_Datatype datatype,MPI_Op op,int root,MPI_Comm comm)具有recvbuf。但我不清楚它是否會從sendbuf或其他東西接收數據?
感謝您的幫助。
的可能的複製[MPI \ _Reduce不能按預期(https://stackoverflow.com/questions/13666002/mpi-reduce-doesnt-work-as-expected) – Zulan