在上面一篇文章中,有乙個利用梯形積分求面積的程式, 在程式中,執行緒0用來接受每乙個小小梯形的面積然後在將所有梯形求和,很明顯, 當資料傳到執行緒0時,其他執行緒就停止了工作,這樣造成所有求和都是由執行緒0來進行的。 為了讓盡量多的執行緒進行工作,可以利用歸約的思想:
因為對於大小不一樣的樹形結構來說,編寫乙個最佳的程式是很困難的。所以可以直接利用mpi 的庫函式. mpi_reduce , 在mpi_reduce中,所有的程序都需要通訊,所以稱這樣的通訊函式為集合通訊函式。 mpi_send和mpi_recv為點對點通訊。
//api:
int mpi_reduce(void* input_data_p,void*output_data_p, int count,mpi_datatype datatype,mpi_op operator, int dest_process,mpi_comm comm);
// operator可以有:求最大值 mpi_max 最小值 求累加和 累乘積 邏輯操作
// 求和語句
mpi_reduce(&local_int,&total_int,1,mpi_double,mpi_sum,0,mpi_comm_world);
//另外有時候需要將得到的結果放入所有的執行緒中
mpi_allreduce(void* input_data_p,void*output_data_p, int count,mpi_datatype datatype,mpi_op operator, mpi_comm comm);
//將乙個程序中得資料傳送到所有程序中的廣播函式
mpi_bcast(void* data_p,int count,mpi_datatype datatype, int scr_process,mpi_comm comm);
散射函式:
主要解決的是 a[i] = b[i] + c[i] 時, 給每乙個comm分配資料時並不需要廣播(把所有資料全部分配過去), 而只需要將 向量分塊, local_n = n / comm_sz
mpi_scatter
//乙個讀取並分發向量的函式
void read_vector(double local_a,int local_n,int n,char vec_name,int my_rank,mpi_comm comm)
mpi_scatter(a,local_n,mpi_double,local_a,local_n,mpi_double,0,comm); //
free(a);
} else
}
MapReducer中的多次歸約處理
我們知道,mapreduce 在reducer 可能有人疑惑幾個問題 端進行歸約處理?端進行歸約處理?端可以進行歸約處理,為什麼在reducer端還要處理?進行歸約後,資料量變小了,這樣再通過網路傳輸時,傳輸時間就變短了,減少了整個作業的執行時間。回答第二個問題 因為reducer 進行歸約的類稱為...
ubuntu中的MPI安裝
2.解壓 在安裝包所在目錄下,開啟終端輸入 tar zxvf mpich 3.3.2.tar.gz 3.在解壓出來的檔案目錄下,配置編譯環境 configure prefix home software mpi 安裝位置,注意最好不要在usr下,存在許可權問題,可能出錯 4.編譯 這部分耗時較長 m...
mpi中ssh實現MPI節點間的無密碼訪問
模擬機器有兩台 主機名 centos yuanhe 1.生成私鑰id dsa和公鑰id dsa.pub ssh keygen t rsa 每次系統提示資訊,按回車就行 2.將該金鑰用作認證,進行訪問授權。cp ssh id dsa.pub ssh authorized keys 3.將 ssh下的檔...