gpt4 book ai didi

python - 如何取消 openmpi 进程的内存限制?

转载 作者:行者123 更新时间:2023-11-30 23:31:17 25 4
gpt4 key购买 nike

我正在运行一个具有 mpirun 和 2 个核心的进程,当我在两个进程之间混合值时,它会被终止。两个进程都使用大约 15% 的机器内存,尽管混合时内存会增加,但仍然应该有足够的内存剩余。因此,我假设用于在进程之间传递消息的内存量存在限制。 如何查明此限制是什么以及如何删除它?

当 mpirun 死掉时我收到的错误消息是这样的:

File "Comm.pyx", line 864, in mpi4py.MPI.Comm.bcast (src/mpi4py.MPI.c:67787)
File "pickled.pxi", line 564, in mpi4py.MPI.PyMPI_bcast (src/mpi4py.MPI.c:31462)
File "pickled.pxi", line 93, in mpi4py.MPI._p_Pickle.alloc (src/mpi4py.MPI.c:26327)
SystemError: Negative size passed to PyBytes_FromStringAndSize

这是导致错误的代码:

sum_updates_j_k = numpy.zeros((self.col.J_total, self.K), dtype=numpy.float64))        
comm.Reduce(self.updates_j_k, sum_updates_j_k, op=MPI.SUM)
sum_updates_j_k = comm.bcast(sum_updates_j_k, root=0)

代码通常可以工作,只会遇到大量数据的问题,这使得我在进程之间交换的矩阵的大小增加

最佳答案

罪魁祸首可能是在PyMPI_bcast()代码中找到的以下几行:

cdef int count = 0
...
if dosend: smsg = pickle.dump(obj, &buf, &count) # <----- (1)
with nogil: CHKERR( MPI_Bcast(&count, 1, MPI_INT, # <----- (2)
root, comm) )
cdef object rmsg = None
if dorecv and dosend: rmsg = smsg
elif dorecv: rmsg = pickle.alloc(&buf, count)
...

这里发生的是,首先使用 pickle.dump()(1) 序列化该对象,然后在 广播 pickle 流的长度>(2).

这里有两个问题,它们都与使用 int 作为长度有关。第一个问题是pickle.dump 内部的整数转换,另一个问题是MPI_INT 用于传输pickle 流的长度。这会将矩阵中的数据量限制为一定大小 - 即导致 pickle 对象不大于 2 GiB(231-1 字节)的大小。任何更大的对象都会导致整数溢出,从而导致 count 中出现负值。

这显然不是 MPI 问题,而是 mpi4py 中的错误(或功能?)。

关于python - 如何取消 openmpi 进程的内存限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20023742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com