国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > 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的。可以很簡單的利用循環類分配。最后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程序的程序名。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
中文字幕网站视频在线| 亚洲wwwwww| 免费a级人成a大片在线观看| jizz国产| 午夜视频99| 国产婷婷视频在线| 国产精品被窝福利一区| 国产福利视频在线| av男人的天堂网| 国产男女无套在线播放| 国产福利视频在线| 日本动漫理论片在线观看网站| 狠狠色丁香婷婷| 精品a在线观看| av在线free| 天堂资源最新版在线视频观看免费网 | 在线国产1区| 黄色av免费在线| 国产成人天天5g影院| 日本不卡视频一区二区| 国产激情自拍| 麻豆精品不卡国产免费看| 国产精品入口免费麻豆| 亚洲人成影院在线| 69视频在线| 国产在线资源| 亚洲国产aⅴ精品| 国产精品178页| 黄色av免费看| 蜜桃av在线免费观看| 国产精品被窝福利一区| 国产免费av网站| 开心婷婷激情| 欧美性猛交xxxx免费看久久| 在线视频观看你懂的| 国产精品白浆流出视频| 国产秀色在线www免费观看| 九色福利视频| 激情丁香婷婷| 国产中文在线视频| 九九在线观看免费视频| 永久免费不卡在线观看黄网站| 国产香蕉视频在线观看| 国产精品一品| 国产人成网在线播放va免费| 尤物在线网址| 国产三级做爰在线观看| 日本最新在线视频| 国产丝袜在线播放| 国产精品yjizz视频网一二区| 中文字幕在线影院| 国产女主播在线| 91在线视频免费看| 在线视频中文字幕第一页| 国产精品爱久久久久久久小说| 国产网站av| 国产激情在线视频| av大片在线播放| www.九九热.com| 久热中文字幕| 国产精品入口麻豆免费| 中文视频在线| 超碰免费在线播放| 国产精品18久久久久久久久久| 国产青青草在线| 伊人网站在线| 九九精品九九| 精品国产免费观看一区| www在线播放| 国产深夜视频在线观看| 一本大道久久a久久精品| 亚洲日本久久久午夜精品| 麻豆精品免费视频入口| 国产成人亚洲精品播放器下载| 思思99精品视频在线观看| 二人午夜免费观看在线视频| 国产高清自拍视频在线观看| 人人干在线视频| 国产精品日日爱| 国产男女无套在线播放| 伊人网在线视频| 国产性色视频| 国产剧情在线一区| 天天插天天射| 精品视频麻豆入口| 国产一区二区三区美女秒播| 精品偷拍激情视频在线观看| 国产午夜精品久久久久免费视| 午夜在线网站| 中文字幕av在线| 国产香蕉尹人视频在线| 国产中文在线| 九色福利视频| 黄色毛片在线看| 久久国产综合视频| 欧洲有码在线视频| 四虎a级欧美在线观看| 在线天堂视频| 在线播放黄色网址| 在线免费看黄av| av中文资源在线| 天堂网中文在线| a视频免费看| 激情在线视频播放| 尤物视频在线看| 国产一级片在线播放| 国产小视频在线播放| 国产网红在线观看| 国产精品视频白浆合集| 国产成人亚洲精品播放器下载| 国产精品18久久久久久久久久| 国产精品理人伦一区二区三区| 国产成人va亚洲电影| 99在线播放| 激情丁香久久| 国产精品区一区二| 国产精品被窝福利一区| 精品国内一区二区三区免费视频| 国产高清在线观看| 亚洲伊人网在线观看| www.九九热.com| 中文字幕在线影视资源| 18av在线播放| 久久精品最新免费国产成人| 国产一级在线观看| 欧美午夜电影一区二区三区| 日本中文字幕在线播放| 2018中文字幕在线观看| 欧美黑人乱大交| 国产精彩视频在线观看免费蜜芽| 伊人影院蕉久影院在线播放| 四虎成人精品在永久在线观看| 尤物视频在线免费观看| 亚洲成人在线播放| 国产深夜视频在线观看| jlzzjlzz欧美| 在线中文资源天堂| 国产亚洲精品一区二区在线观看| 精品麻豆一区二区三区| 丁香视频免费观看| 日韩国产成人| 在线午夜影院| 国产无遮挡又黄又爽免费网站| 香蕉视频网站在线播放| 国产网站免费观看| 国产原创在线播放| 亚洲欧美精品日韩欧美| 国产成人va亚洲电影| 五月婷婷在线视频| 黄色毛片在线观看| 欧美高清xxxx性| 亚洲最新永久观看在线| 国产xxxx做受性欧美88| 国产黄色免费看| 国产羞羞视频在线播放| 狠狠狠综合7777久夜色撩人| 欧美色欧美亚洲另类二区精品| 亚洲www色| www.91在线播放| 狂野欧美性猛交xxxx乱大交| jizz在线免费观看| 在线视频福利| 亚洲欧美自拍另类| 免费观看久久久久| 国产女人在线观看| 1区不卡电影| 18 激情视频在线| 精品麻豆视频| 亚洲久草视频| 青青草免费观看免费视频在线| 欧美卡一卡二| 五月天丁香在线| 777电影在线观看| 亚洲伊人网在线观看| 亚洲第一成年免费网站| 久久国产综合视频| 精品中文字幕不卡在线视频| 国产在线一区二区视频| 国产亚洲精品久久久久久青梅| 国产黄色免费看| 四虎国产精品永久| 尤物视频网站在线观看| 国产二区三区四区| 日本视频一二三区中文字幕| 九九在线观看免费视频| 国产人成网在线播放va免费| 亚洲精品一区中文字幕电影| 久久99亚洲网美利坚合众国| 国产一区二区影视| 亚洲人成影院在线| 91福利在线免费| 亚洲精品在线播放视频| 国产在线www| 四虎中文字幕| 国产精品被窝福利一区| 日本不卡1区2区3区| 精品国产免费第一区二区| 狠狠操五月天| 亚洲第一区视频| 国产黄色片中文字幕|