作者dogs1231992 (河豚)
看板Python
标题[问题] mpi4py矩阵如何有效率的合并?
时间Thu Dec 20 05:16:47 2018
各位前辈们大家好,小弟最近遇到一个问题
我要从一个档案内读取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://webptt.com/cn.aspx?n=bbs/Python/M.1545254209.A.25C.html
1F:推 Solccp: 关键字: MPI_Gather 12/20 08:48
感恩 :)
S大,我後来解决了
一开始我发现Gather回来的结构会是个list,因此我采用
asarray 跟 concatenate
把list切段後拼回来
平行化效率虽然只有50%,但还是快了31倍左右 (应该有不少资源用在上述两个指令中)
而且在执行asarray 跟 concatenate 时,除了rank 0以外的CPU都是闲置状态
才会导致平行化效率降低
2F:→ yoyololicon: 这资料感觉也没很大,你读取是怎麽读的?不应该这麽 12/20 08:51
3F:→ yoyololicon: 久 12/20 08:51
4F:推 sma1033: 我也觉得这资料量没很大,速度慢应赅是其他的问题 12/20 13:13
因为档案是由模拟软体输出的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