[問題] mpi4py矩陣如何有效率的合併?

看板Python作者 (河豚)時間6年前 (2018/12/20 05:16), 6年前編輯推噓2(202)
留言4則, 3人參與, 6年前最新討論串1/1
各位前輩們大家好,小弟最近遇到一個問題 我要從一個檔案內讀取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
關鍵字: MPI_Gather
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
文章代碼(AID): #1S6hL19S (Python)
文章代碼(AID): #1S6hL19S (Python)