使用mpi4py拆分forloop

2021-10-17 18:13:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试并行处理一个代码,它读入一些点并将其附加到现有数组中。你知道吗

from mpi4py import MPI
import time

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

perrank = len(z)//size
for ind in range(rank*perrank, (rank+1)*perrank):
    filename ='test_%03d.dat'%(ind+1)
    infile = open(filename,'r')
    #print('index = ',ind)
    for line in infile:
        x1,y1,zz1,pot1 = line.split(' ')
        u1 = np.append(u1,float(pot1))
    infile.close()

if rank == 0:
    v = (46,75)
    u = np.zeros(v, dtype='float64')
else:
    u = None

comm.Barrier()
comm.Reduce(u1, u, op=MPI.SUM, root=0)

这里,每个文件中有75组u1值,总共有46个文件。因此,当所有文件被读入程序并且数据被聚合时,u的形状将是(75,46)。问题是,列的顺序非常重要,必须遵循文件读入的顺序,即u的第0列应该包含文件1中的数据,而u的第一列应该包含文件2中的数据等等。。。你知道吗

目前,当我在一个处理器上运行上述代码时,输出与预期一样,但是,当我增加处理器的数量时,它会给出可疑的结果。我假设这是由于列的顺序与文件的顺序不匹配(可能是reduce函数的问题),或者可能是for循环本身的错误。你知道吗

我只是想知道是否有人会对如何修复上面的代码给出我想要的结果有什么建议。非常感谢。你知道吗