亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

安裝OpenMPI來配合C語言程序進行并行計算

2020-05-23 14:13:17
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了安裝OpenMPI來配合C語言程序進行并行計算的例子,MPI的全稱是Message Passing Interface即標準消息傳遞界面,可以用于并行計算,需要的朋友可以參考下

安裝OPENMPI

由于是實驗,也不進行多機的配置了,只在虛擬機里安裝吧。多個機器的配置可以參考此文

最簡單的方法,apt安裝

 

 
  1. sudo apt-get install libcr-dev mpich2 mpich2-doc 

測試

hello.c

 

 
  1. /* C Example */ 
  2. #include <mpi.h> 
  3. #include <stdio.h> 
  4.  
  5. int main (int argc, char* argv[]) 
  6. int rank, size; 
  7.  
  8. MPI_Init (&argc, &argv); /* starts MPI */ 
  9. MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */ 
  10. MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */ 
  11. printf( "Hello world from process %d of %d/n", rank, size ); 
  12. MPI_Finalize(); 
  13. return 0; 

編譯運行及顯示結果

 

 
  1. mpicc mpi_hello.c -o hello 
  2. mpirun -np 2 ./hello 
  3. Hello world from process 0 of 2 
  4. Hello world from process 1 of 2 

正常出現結果表明沒有問題,

看下openmpi的版本

 

 
  1. mpirun --version 

 

 
  1. mpirun (Open MPI) 1.6.5 
  2. Report bugs to http://www.open-mpi.org/community/help/ 

MPI計算矩陣乘法

通過opemMPI加速矩陣乘法運算。采用主從模式,0號是master,其他是child(或者叫worker,as you wish)。

基本思路

兩個矩陣A,B進行乘法運算,則A的行 i 乘以B的列 j 得出的數是新矩陣(i,j)坐標的數值。A(MN) B(NK)最后矩陣是M*K的,實驗中M=N=K=1000,我也就沒有明確區分MNK,全部用MATRIX_SIZE定義的。

最簡單的思路就是每個worker分配(MATRIX_SIZE/(numprocess-1))個,然后如果有余下的,就分給余數對應的worker。比如MATRIX_SIZE=10,numprocess=4 則實際的worker有3個,每個人分3行,最后的一行給id是1的??梢院芎唵蔚睦醚h類分配。最后Master收集所有的結果,并按照順序組裝起來就行。

每個worker的工作就是接收來自master的一行,和B矩陣運算,得出新一行的結果,然后發送回master

代碼

多加了很多注釋來解釋,函數的說明下一節解釋下。

 

 
  1. #include <mpi.h> 
  2. #include <stdio.h> 
  3. #define MATRIX_SIZE 10 
  4. #define FROM_MASTER 1 //這里的類型可以區分消息的種類,以便區分worker發送來的結果 
  5. #define FROM_CHILD 2  
  6. #define MASTER 0 
  7. MPI_Status status; 
  8. int myid,numprocess; 
  9. //最終保存的結果 
  10. int ans [MATRIX_SIZE*MATRIX_SIZE]; 
  11. int A[MATRIX_SIZE*MATRIX_SIZE],B[MATRIX_SIZE*MATRIX_SIZE]; 
  12. //讀取文件,注意讀取文件要放在master里,不然會讀兩遍,出現錯誤 
  13. void readFile(){ 
  14. FILE* fina,*finb; 
  15. fina=fopen("a.txt","r"); 
  16. int i; 
  17. for (i = 0; i < MATRIX_SIZE*MATRIX_SIZE ; ++i) 
  18. fscanf(fina,"%d ",&A[i]); 
  19. fclose(fina); 
  20. finb=fopen("b.txt","r"); 
  21. for(i=0;i<MATRIX_SIZE*MATRIX_SIZE;i++) 
  22. fscanf(finb,"%d ",&B[i]); 
  23. fclose(finb); 
  24. printf("read file ok/n"); 
  25. int master(){ 
  26. int workid,dest,i,j; 
  27. printf("numprocess %d/n",numprocess ); 
  28. //給每個worker發送B矩陣過去 
  29. for(i=0;i<numprocess-1;i++){ 
  30. //send B matrix 
  31. MPI_Send(&B,MATRIX_SIZE*MATRIX_SIZE,MPI_INT,i+1,FROM_MASTER,MPI_COMM_WORLD); 
  32. //開始給每個worker分配任務,取模即可 
  33. for (i = 0; i < MATRIX_SIZE; i++) 
  34. //attention: num of workers is numprocess-1 
  35. workid=i%(numprocess-1)+1; 
  36. //send single line in A 
  37. MPI_Send(&A[i*MATRIX_SIZE],MATRIX_SIZE,MPI_INT,workid,FROM_MASTER,MPI_COMM_WORLD); 
  38.  
  39. //等待從worker發送來的數據 
  40. int tempLine[MATRIX_SIZE]; 
  41. for (i = 0; i < MATRIX_SIZE*MATRIX_SIZE; i++) 
  42. ans[i]=0; 
  43. for (i = 0; i < MATRIX_SIZE; ++i) 
  44. int myprocess=i%(numprocess-1)+1; 
  45. printf("Master is waiting %d/n",myprocess); 
  46. //receive every line from every process 
  47. MPI_Recv(&tempLine,MATRIX_SIZE,MPI_INT,myprocess,FROM_CHILD,MPI_COMM_WORLD,&status); 
  48. //發送過來的都是計算好了的一行的數據,直接組裝到ans里就行 
  49. for(j=0;j<MATRIX_SIZE;j++){ 
  50. ans[MATRIX_SIZE*i+j]=tempLine[j]; 
  51. printf("Master gets %d/n",i); 
  52.  
  53. for(i=0;i<MATRIX_SIZE*MATRIX_SIZE;i++){ 
  54. printf("%d ",ans[i] ); 
  55. if(i%MATRIX_SIZE==(MATRIX_SIZE-1))printf("/n"); 
  56. printf("The Master is out/n"); 
  57.  
  58. int worker(){ 
  59. int mA[MATRIX_SIZE],mB[MATRIX_SIZE*MATRIX_SIZE],mC[MATRIX_SIZE]; 
  60. int i,j,bi; 
  61. MPI_Recv(&mB,MATRIX_SIZE*MATRIX_SIZE,MPI_INT,MASTER,FROM_MASTER,MPI_COMM_WORLD,&status); 
  62. //接收來自master的A的行 
  63. for(i=0;i<MATRIX_SIZE/(numprocess-1);i++){ 
  64. MPI_Recv(&mA,MATRIX_SIZE,MPI_INT,MASTER,FROM_MASTER,MPI_COMM_WORLD,&status); 
  65. //矩陣乘法,A 的一行和B矩陣相乘 
  66. for(bi=0;bi<MATRIX_SIZE;bi++){ 
  67. mC[bi]=0; 
  68. for(j=0;j<MATRIX_SIZE;j++){ 
  69. mC[bi]+=mA[j]*mB[bi*MATRIX_SIZE+j]; 
  70. MPI_Send(&mC,MATRIX_SIZE,MPI_INT,MASTER,FROM_CHILD,MPI_COMM_WORLD); 
  71. //如果處于余數范圍內,則需要多計算一行 
  72. if(MATRIX_SIZE%(numprocess-1)!=0){ 
  73. if (myid<=(MATRIX_SIZE%(numprocess-1))) 
  74. MPI_Recv(&mA,MATRIX_SIZE,MPI_INT,MASTER,FROM_MASTER,MPI_COMM_WORLD,&status); 
  75. for(bi=0;bi<MATRIX_SIZE;bi++){ 
  76. mC[bi]=0; 
  77. for(j=0;j<MATRIX_SIZE;j++){ 
  78. mC[bi]+=mA[j]*mB[bi*MATRIX_SIZE+j]; 
  79. MPI_Send(&mC,MATRIX_SIZE,MPI_INT,MASTER,FROM_CHILD,MPI_COMM_WORLD); 
  80. printf("The worker %d is out/n",myid); 
  81. int main(int argc, char **argv) 
  82. MPI_Init (&argc, &argv);  
  83. MPI_Comm_rank(MPI_COMM_WORLD,&myid); 
  84. MPI_Comm_size(MPI_COMM_WORLD,&numprocess); 
  85.  
  86. if(myid==MASTER){ 
  87. readFile(); 
  88. master(); 
  89. if(myid>MASTER){ 
  90. worker(); 
  91.  
  92. MPI_Finalize(); 
  93. return 0; 

OPENMPI簡單函數介紹

針對實驗用到的幾個函數進行說明。

MPI為程序員提供一個并行環境庫,程序員通過調用MPI的庫程序來達到程序員所要達到的并行目的,可以只使用其中的6個最基本的函數就能編寫一個完整的MPI程序去求解很多問題。這6個基本函數,包括啟動和結束MPI環境,識別進程以及發送和接收消息:

理論上說,MPI所有的通信功能可以用它的六個基本的調用來實現:

MPI_INIT 啟動MPI環境

MPI_COMM_SIZE 確定進程數

MPI_COMM_RANK 確定自己的進程標識符

MPI_SEND 發送一條消息

MPI_RECV 接收一條消息

MPI_FINALIZE 結束MPI環境

初始化和結束

MPI初始化:通過MPI_Init函數進入MPI環境并完成所有的初始化工作。

 

 
  1. int MPI_Init( int *argc, char * * * argv ) 

MPI結束:通過MPI_Finalize函數從MPI環境中退出。

 

 
  1. int MPI_Finalize(void

獲取進程的編號

調用MPI_Comm_rank函數獲得當前進程在指定通信域中的編號,將自身與其他程序區分。

 

 
  1. int MPI_Comm_rank(MPI_Comm comm, int *rank) 

獲取指定通信域的進程數

調用MPI_Comm_size函數獲取指定通信域的進程個數,確定自身完成任務比例。

 

 
  1. int MPI_Comm_size(MPI_Comm comm, int *size) 

MPI消息

一個消息好比一封信

消息的內容的內容即信的內容,在MPI中成為消息緩沖(Message Buffer)

消息的接收發送者即信的地址,在MPI中成為消息封裝(Message Envelop)

MPI中,消息緩沖由三元組<起始地址,數據個數,數據類型>標識

消息信封由三元組<源/目標進程,消息標簽,通信域>標識

消息發送

MPI_Send函數用于發送一個消息到目標進程。

 

 
  1. int MPI_Send(void *buf, int count, MPI_Datatype dataytpe, int dest, int tag, MPI_Comm comm) 

buf是要發送數據的指針,比如一個A數組,可以直接&A,count則是數據長度,datatype都要改成MPI的type。dest就是worker的id了。tag則可以通過不同的type來區分消息類型,比如是master發送的還是worker發送的。

消息接收

MPI_Recv函數用于從指定進程接收一個消息

 

  1. int MPI_Recv(void *buf, int count, MPI_Datatype datatyepe,int source, int tag, MPI_Comm comm, MPI_Status *status) 

編譯和執行

生成執行文件data

 

 
  1. mpicc -o programname programname.c 

一個MPI并行程序由若干個并發進程組成,這些進程可以相同也可以不同。MPI只支持靜態進程創建,即:每個進程在執行前必須在MPI環境中登記,且它們必須一起啟動。通常啟動可執行的MPI程序是通過命令行來實現的。啟動方法由具體實現確定。例如在MPICH實現中通過下列命令行可同時在獨立的機器上啟動相同的可執行程序:

 

 
  1. mpirun –np N programname 

其中N是同時運行的進程的個數,programname是可執行的MPI程序的程序名。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久999| 欧美激情一区二区三区高清视频| 久久成人一区二区| 久久全国免费视频| 亚洲人成伊人成综合网久久久| 国产精品影片在线观看| 国产精品69久久久久| 538国产精品一区二区在线| 亚洲第一页自拍| 国产精品视频免费在线观看| 亚洲电影成人av99爱色| 久久久免费高清电视剧观看| 成人午夜激情网| 久久亚洲精品小早川怜子66| 亚洲美女动态图120秒| 欧美整片在线观看| 成人国产精品日本在线| 欧美中文在线免费| 欧美日韩中文在线观看| 最近2019中文字幕一页二页| 91a在线视频| 国产视频精品va久久久久久| 久久人人爽人人爽爽久久| 国产精品久久久久久久久久| 亚洲图片欧洲图片av| 国产福利视频一区| 欧美电影在线播放| 色悠悠久久久久| 夜夜嗨av一区二区三区免费区| 黄色精品一区二区| 亚洲性无码av在线| 九九热这里只有在线精品视| 国产中文日韩欧美| 亚洲欧美成人一区二区在线电影| 在线亚洲午夜片av大片| 91在线播放国产| 91麻豆国产语对白在线观看| 欧美大片在线看免费观看| 日韩av在线一区| 国产欧美一区二区三区在线| 欧美久久精品一级黑人c片| 91精品久久久久久久久久久久久久| 色综合久久天天综线观看| 日韩高清电影好看的电视剧电影| 国内精品久久久久久中文字幕| 538国产精品一区二区在线| 亚洲人成欧美中文字幕| 欧美日韩精品在线| 国产成人自拍视频在线观看| 日韩美女激情视频| 国产成人精品最新| 日韩亚洲一区二区| 91欧美视频网站| 国产精品女人久久久久久| 韩国精品久久久999| 国产精品久久久久久久午夜| 久久成人这里只有精品| 欧美黄色片在线观看| 国产精品日韩在线| 欧美性资源免费| 日韩欧美精品网站| 国产精品久久久久久久久久久久| 日韩美女免费线视频| 成人在线视频福利| 国产aaa精品| 久久国产色av| 中文字幕精品在线视频| 国产精品老女人精品视频| 国产成人啪精品视频免费网| 欧美精品第一页在线播放| 精品亚洲一区二区三区四区五区| 亚洲影影院av| 久久精品中文字幕电影| 在线播放精品一区二区三区| 性视频1819p久久| 91精品国产自产在线观看永久| 成人欧美一区二区三区在线湿哒哒| 91精品国产成人www| 伊人精品在线观看| 精品久久久免费| 欧美片一区二区三区| 国内精品中文字幕| 欧美日韩午夜视频在线观看| 亚洲va码欧洲m码| 最近的2019中文字幕免费一页| 91精品国产综合久久香蕉922| 国产精品ⅴa在线观看h| 欧美日韩国产丝袜另类| 亚洲欧美日韩天堂一区二区| 欧美电影免费观看高清| 欧美激情免费看| 欧美中文在线观看国产| 91网站免费看| 欧美亚洲午夜视频在线观看| 日本高清+成人网在线观看| 亚洲高清色综合| 精品无人区太爽高潮在线播放| 久久亚洲成人精品| 欧美午夜视频在线观看| 日韩av综合中文字幕| 亚洲精品福利免费在线观看| 欧美电影院免费观看| 国产在线观看不卡| 茄子视频成人在线| 69av在线视频| 播播国产欧美激情| 在线亚洲欧美视频| 国产精品久久在线观看| 2023亚洲男人天堂| 国外色69视频在线观看| 久久69精品久久久久久国产越南| 亚洲一区免费网站| 亚洲成人av资源网| 欧美亚洲一区在线| 亚洲欧美日韩直播| 91亚洲精品久久久久久久久久久久| 亚洲午夜久久久久久久| 日韩国产精品亚洲а∨天堂免| 国产91色在线播放| 亚洲一区免费网站| 国产成人精品久久二区二区| 国产精品欧美久久久| 色偷偷9999www| 日韩中文字幕在线精品| 欧美成人精品影院| 九九九久久国产免费| 久久久精品视频成人| 日韩美女免费观看| 77777亚洲午夜久久多人| 欧美日韩国产一中文字不卡| 狠狠干狠狠久久| 日韩视频精品在线| 亚洲欧洲在线免费| 大伊人狠狠躁夜夜躁av一区| 91精品国产综合久久男男| 欧洲中文字幕国产精品| 国产精品日韩专区| 欧美国产第二页| 97视频人免费观看| 国产精品777| 在线一区二区日韩| 黄色一区二区在线观看| 精品久久久精品| 国产69精品久久久久久| 国产精品999999| 亚洲三级黄色在线观看| 97在线免费观看视频| 久久亚洲综合国产精品99麻豆精品福利| 久久久久国产精品一区| 国产偷国产偷亚洲清高网站| 热久久美女精品天天吊色| 久久久久久久久久久91| 欧美另类第一页| 亚洲精品按摩视频| 久久影院资源网| 91精品国产777在线观看| 精品免费在线观看| 九九精品视频在线| 国产精品日韩专区| 热99在线视频| 亚洲国产精品久久| 不卡av在线播放| 亚洲国产精彩中文乱码av| 亚洲欧美成人精品|