4作者dick1024 (生活撐下去)
看板C_and_CPP
標題[閒聊] 有人在寫MPI嘛!?
時間Tue May 18 18:20:12 2010
不知道版上有沒有鄉民跟我一樣 再寫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