看板 C_and_CPP 關於我們 聯絡資訊
不知道版上有沒有鄉民跟我一樣 再寫MPI 其實我都只寫表面而已 並沒很深入 例如 利用MPI"分配"我所要傳入的"值" 而這"值" 只是我後面程式所需 因值很大 所以利用MPI作分散式運算 最近寫了一個程式後 並加入MPI分配值 實跑後 都有一個很怪現象 for迴圈跑到一個值後 就會停下 整體程式狀態就處在 running 下 為什麼會知道處在running下? 是因為除了觀看我所有CPU使用率外 各CPU每接受一個值 跑完後 都會output一個檔 ( 利用sprintf_s(); 生成該檔 ) 但每當程式接到一個"值"後 就會處在running下 真讓我覺得很奇怪 這邊簡單介紹一下 我的mpi程式 原始程式檔主要分兩個 mpi.cpp & tree.cpp mpi.cpp 主要寫mpi分配我的值 之後再傳入tree.cpp裡做我要做的事情 (利用extern呼叫進入tree.cpp) mpi.cpp for迴圈那 我這邊也大概寫一下 nx = 13 ; ny = 151; for(long a = 0; a < nx*ny; a += 16) // 因為我要用16顆cpu跑,所以+=16 { if(myid == 0) { for(j = 1; j < 16; j++) // j就是代表cpu編號 從第一顆 { iy = (a + j) / nx; //算出iy ix = (a + j) % nx; //算出ix MPI_Send(iy,j); //這邊只是簡寫 前面算出iy & ix後 就算到第j顆cpu MPI_Send(ix,j); } iy = a / nx; //cpu本身也會分配到 iy&ix ix = a % nx; tree(); //進入tree.cpp 做主要的事情 } else { MPI_Recv(iy,j); // 第j顆cpu收到iy&ix值後就進入tree,cpp MPI_Recv(ix,j); tree(); } MPI_Barrier(); //這函式寫在這 主要是等待以上動作都完成了 //也就是說要等待每顆cpu做完一組值(iy&ix) //才會下一步 } 重點來了 我前面所說的for迴圈跑到個一個值後 就會停下 就是 當 a = 160 iy = 12 ix = 0 ~ 12 跑完這組值後 就會停下的噎 再來應當要跑 a = 172 時 就不跑了 真的超奇怪的噎 不知道鄉民有啥看法呢!? 程式記憶體問題!? 還是.....? 但是程式卻還是處在running狀態下阿 == ==" 唉 我已經卡關在這三個禮拜了 Orz... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.64.185.202 ※ 編輯: dick1024 來自: 203.64.185.202 (05/18 22:11) ※ 編輯: dick1024 來自: 203.64.185.202 (05/18 23:12)
fightyin:再最後一個值那邊丟幾個cout找找吧 05/20 16:44
fightyin:通常是最後的值算完沒有匯回主計算的cpu裡面 05/20 16:45
fightyin:或是cpu丟出東西給下一個cpu的時候沒有作接的動作 05/20 16:46
fightyin:變成大家都在丟 沒有cpu接 通常是這樣才會down下來 05/20 16:47
fightyin:我猜是這樣啦 太久沒碰mpi 有點忘記= = 05/20 16:47
pntenlen36:可能是樓上說的原因 Send Recv要對應好 05/23 16:55