处理 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
我在 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