处理 mpi4py 函数调用的 "mutex-like" 锁的正确方法是什么?

What is the correct way to handle a "mutex-like" lock for a mpi4py function call?

我在 python 中有一个函数调用,它使用非线程安全的包方法(包写入三个同名的临时文件)。由于需要传递到此方法的数据很大并且我有很多输入集,因此我使用 MPI4PY 库从分布式的角度来处理这个问题,这样每个等级在任何给定时间处理不同的输入数据组。我的问题是,当通过 MPI 映射对该函数的调用时,有时多个等级会尝试同时访问该函数调用,从而导致线程争用情况,其中数据被一次对该函数的两次调用覆盖(然后导致错误的脚本)。

由于包方法是非线程安全的,我的问题是如何对函数执行互斥锁样式,以便一次只允许一个 MPI 等级在函数内部工作:

例如:

def mpi_call(args):
   comm = MPI.COMM_WORLD
   # Need to mutex lock here
   non_threadsafe_method(args)
   # Need to unlock here
   return true

我这里试过使用Barrier()方法,但是这会导致程序死锁,因为真正进入该方法的rank数量有限(并非所有rank都进入调用包方法的函数) .

我想知道处理此类函数的互斥式锁的最佳方法。

谢谢!

尝试文件系统锁。您的冲突必须发生在进程之间而不是线程之间(长话短说)。使用 fasteners 库,您的代码将如下所示:

import fasteners

def mpi_call(args):
    comm = MPI.COMM_WORLD
    # Need to mutex lock here
    with fasteners.InterProcessLock('/tmp/tmp_lock_file'):
        non_threadsafe_method(args)
    # Need to unlock here
    return true

在此处查看更多信息:https://fasteners.readthedocs.io/en/latest/examples.html#interprocess-locks