Python 我的行为很奇怪

Python 我的行为很奇怪,python,mpi,pickle,Python,Mpi,Pickle,尝试使用mpi4py在多个进程中加载pickle。以下是我拥有的大部分时间都运作良好的产品: for ix in range(len(frames)): if comm.rank == 0: frame = frames[ix] logging.debug("{0}: doing stuff, frame {1}".format(comm.rank,frame)) W, nodes = pickle.load(open(os.path.jo

尝试使用mpi4py在多个进程中加载pickle。以下是我拥有的大部分时间都运作良好的产品:

for ix in range(len(frames)):
    if comm.rank == 0:
        frame = frames[ix]
        logging.debug("{0}: doing stuff, frame {1}".format(comm.rank,frame))
        W, nodes = pickle.load(open(os.path.join(args.network_dir, '{0}.pkl'.format(frame))))
        freqs = np.random.normal(0., 5.*np.pi/180., size = len(W))
    else:
        W = None
        nodes = None
        freqs = None

    comm.Barrier()

    W = comm.bcast(W, root = 0)
    nodes = comm.bcast(nodes, root = 0)
    freqs = comm.bcast(freqs, root = 0)

    comm.Barrier()
但它会可靠地卡在广播步骤上。所有进程的freqs必须相同,因此必须由一个进程生成。我可以让每个人自己装泡菜,就像:

for ix in range(len(frames)):
    frame = frames[ix]
    logging.debug("{0}: doing stuff, frame {1}".format(comm.rank,frame))
    W, nodes = pickle.load(open(os.path.join(args.network_dir, '{0}.pkl'.format(frame))))

    if comm.rank == 0:
        freqs = np.random.normal(0., 5.*np.pi/180., size = len(W))
    else:
        freqs = None

    # broadcast and stuff
但是每个人都装了不同的泡菜!那是不应该发生的,对吧?每个进程都应该在ix=0时进入循环,对吗


非常感谢您的帮助。

我不是python专家,但有几点一般性意见。首先,您需要确保每个进程调用广播的次数相同:“for”循环是否保证每个进程上的迭代次数相同?第二,在广播之前或之后,您都不需要障碍物:广播(与所有集体广播一样)确保自动完成所需的任何同步。是的。for循环应该保证每个进程都有相同的迭代,这就是为什么对于第二个选项,每个人都在不同的框架中出现,这确实令人困惑。我会在广播结束后简单地设置一个障碍,看看这是否有帮助。请提供一个更清晰的观察到的行为描述。一个明显的错误是,
在每个级别上不相等。我不是python专家,但有一些一般性的评论。首先,您需要确保每个进程调用广播的次数相同:“for”循环是否保证每个进程上的迭代次数相同?第二,在广播之前或之后,您都不需要障碍物:广播(与所有集体广播一样)确保自动完成所需的任何同步。是的。for循环应该保证每个进程都有相同的迭代,这就是为什么对于第二个选项,每个人都在不同的框架中出现,这确实令人困惑。我会在广播结束后简单地设置一个障碍,看看这是否有帮助。请提供一个更清晰的观察到的行为描述。一个明显的错误是,
在每个秩上不相等。