[問題] mpi4py矩陣如何有效率的合併?
各位前輩們大家好,小弟最近遇到一個問題
我要從一個檔案內讀取10000個分子模擬的快照
每個快照都包含66個原子,其中,每個原子都有7個數值是我想要讀取的
因此矩陣大小會是 [10000,66,7]
由於資料量很大,如果用一個CPU讀取的話要花費約480秒左右
因此我最近改用mpi4py來寫,使用64個CPU讀取,只要7秒左右
最近遇到的問題是,我在程式碼內創造一個Data_properties矩陣
Data_properties = np.zeros((Number_images,Max_number_atoms,7))
然後要求每個CPU各自讀取一個片段 (第一個CPU讀取0-156,第二個CPU讀取157-312...)
在我輸出數值時我發現,64個CPU裡面各自包含一個名為Data_properties的矩陣
並不是共用同一個矩陣,因此總共有64個矩陣
基於上面的讀取指令,每個矩陣都只有一小片段是正確的
(例如:第一個CPU只有0-156是有數值的,其他部分都是0)
目前想到的方法是再用一個矩陣來讀取這64個矩陣,把數值正確的部分提取出來
但是這樣又會增加運算量 (目前更在乎的是後面要處理數據時會有非常龐大的運算需求)
因此想請問是否有比較好的方法來執行上述的過程呢?
使用"from multiprocessing import Pool"模組是否能解決此類問題呢?
還希望有跑過模擬的鄉民們能幫小弟解惑,謝謝 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 45.3.90.45
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1545254209.A.25C.html
推
12/20 08:48,
6年前
, 1F
12/20 08:48, 1F
感恩 :)
S大,我後來解決了
一開始我發現Gather回來的結構會是個list,因此我採用
asarray 跟 concatenate
把list切段後拼回來
平行化效率雖然只有50%,但還是快了31倍左右 (應該有不少資源用在上述兩個指令中)
而且在執行asarray 跟 concatenate 時,除了rank 0以外的CPU都是閒置狀態
才會導致平行化效率降低
→
12/20 08:51,
6年前
, 2F
12/20 08:51, 2F
→
12/20 08:51,
6年前
, 3F
12/20 08:51, 3F
推
12/20 13:13,
6年前
, 4F
12/20 13:13, 4F
因為檔案是由模擬軟體輸出的traj檔
因此我是用ase內建的io來讀取檔案,接著使用ase內建的函數來讀取數值
from ase import io
Total_images = io.read(Input_file,index=slice(None))
Data_properties[i,j,1] = Total_images[i].get_positions()[j][0]
讀檔案大概要花20秒左右,主要是第二行的指令會比較花時間
※ 編輯: dogs1231992 (45.3.84.252), 12/20/2018 22:49:49
※ 編輯: dogs1231992 (45.3.84.252), 12/21/2018 05:15:08
Python 近期熱門文章
PTT數位生活區 即時熱門文章