編寫乙個mpi程式,分別採用樹形和蝶形通訊結構計算全域性總和。首先計算通訊域comm_sz的程序數是2的冪的特殊情況,若能夠正確執行,改變該程式使其適用於comm_sz中任意程序數目的值。
#define _crt_secure_no_warnings
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int numall =
100000
;//要求和的數的數目
intceil_log2
(int n)
inttree_add
(int argc,
char
**ar**)
//mpi multi thread
int comm_sz;
int my_rank;
mpi_init
(null
,null);
mpi_comm_size
(mpi_comm_world,
&comm_sz)
;mpi_comm_rank
(mpi_comm_world,
&my_rank)
;//序列求和,用於驗證是否正確
if(my_rank ==0)
cout <<
"求得的和應為: "
<< test_sum << endl;
}//分派數字
int local_n = numall / comm_sz;
//每個執行緒被分配到的數字的數目
if(numall %comm_sz > my_rank) local_n +=1
;int local_init_index = my_rank * local_n;
if(my_rank == numall % comm_sz) local_init_index = my_rank *
(local_n +1)
;if(numall%comm_sz < my_rank) local_init_index =
(numall / comm_sz +1)
*(numall%comm_sz)
+(my_rank - numall % comm_sz)
*local_n;
//對每個執行緒分配的數進行求和
int local_sum =0;
for(
int i =
0; i < local_n; i++
)//cout << my_rank << ": " << local_sum << endl;
mpi_barrier
(mpi_comm_world)
;//將每個執行緒求得的區域性和進行求和
int k =
ceil_log2
(comm_sz)
;for
(int i =
0; i < k; i++
)else
if(my_rank==send_p)
}mpi_barrier
(mpi_comm_world);}
if(my_rank ==
0) cout << local_sum << endl;
mpi_finalize()
;return0;
}
與樹形結構不同的一點是,最後求得的和在每個執行緒中都存在
#define _crt_secure_no_warnings
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int numall =8;
//要求和的數的數目
intceil_log2
(int n)
intmain
(int argc,
char
**ar**)
;//for (int i = 0; i < numall; i++)
//mpi multi thread
int comm_sz;
int my_rank;
mpi_init
(null
,null);
mpi_comm_size
(mpi_comm_world,
&comm_sz)
;mpi_comm_rank
(mpi_comm_world,
&my_rank)
;//序列求和,用於驗證是否正確
if(my_rank ==0)
cout <<
"求得的和應為: "
<< test_sum << endl;
}//分派數字
int local_n = numall / comm_sz;
//每個執行緒被分配到的數字的數目
if(numall %comm_sz > my_rank) local_n +=1
;int local_init_index = my_rank * local_n;
if(my_rank == numall % comm_sz) local_init_index = my_rank *
(local_n +1)
;if(numall%comm_sz < my_rank) local_init_index =
(numall / comm_sz +1)
*(numall%comm_sz)
+(my_rank - numall % comm_sz)
*local_n;
//對每個執行緒分配的數進行求和
int local_sum =0;
for(
int i =
0; i < local_n; i++
)//cout << my_rank << ": " << local_sum << endl;
mpi_barrier
(mpi_comm_world)
;//將每個執行緒求得的區域性和進行求和,蝶形
int k =
ceil_log2
(comm_sz)
;for
(int i =
0; i < k; i++
)else
if(py == my_rank)}}
cout << my_rank <<
": "
<< local_sum << endl;
mpi_barrier
(mpi_comm_world);}
//cout << my_rank << ": " << local_sum << endl;
if(my_rank ==
0) cout << local_sum << endl;
mpi_finalize()
;return0;
}
蝶形結構主要用於分布式系統中,每個程序都希望獲得所有數的和,即每個程序都希望能得到最後的結果。而樹形結構的話只是將部分和集中,最後只有0號程序能獲得所有數字的總和。 MPI計算全域性總和(樹形與蝶形)
編寫乙個mpi程式,分別採用樹形和蝶形通訊結構計算全域性總和。首先計算通訊域comm sz的程序數是2的冪的特殊情況,若能夠正確執行,改變該程式使其適用於comm sz中任意程序數目的值。define crt secure no warnings include include include in...
雲計算 MPI程式設計
mpi是一種平行計算架構,mpich是mpi的一種實現,本集群使用虛擬機器安裝,作業系統是ubuntu14.04,使用三颱機器,使用者名稱都是ubuntu,機器名分別是ub0,ub1,ub2 測試程式 include mpi.h include include double f double dou...
平行計算MPI 二 MPI阻塞通訊
阻塞通訊 訊息傳送方的send需要接收方的recv配合才能完成。mpi對阻塞通訊一些底層函式進行了一些封裝,方便我們呼叫。1.標準通訊模式 mpi send buf,buf size,mpi char,process1,tag,mpi comm world mpi recv buf,buf size...