我正在尝试通过执行
使用带有mpi的h5py打开hdf5文件print("Opening...")
f = h5py.File(file_path, "r", driver='mpio', comm=MPI.COMM_WORLD)
print("Done")
出于某种原因,此行在我的项目中执行时会阻塞。 我尝试创建一个小的可重现的示例但没有成功,因为这行在这些示例中应该正常工作。
因此,我的代码库中有一些我无法追踪的内容,导致上述行被阻止。
问题:导致h5py.File
阻止的原因是什么?
注意:CPU达到100%所以mpi似乎在等待某事......
注意2:从我的代码库添加了一些根本没有帮助的代码:
在if之前打开文件,在if just blocks ...
之内from mpi4py import MPI
import h5py
from DataProviderH5PYPool import init_pool, new_worker
import Settings
rank = MPI.COMM_WORLD.Get_rank()
task = [
"main",
"h5py_worker"
]
task = task[rank] if rank < len(task)-1 else task[-1]
print("Starting new process: {} with rank {}".format(task,rank))
def init():
# works
print(h5py.File(Settings.h5py.training[0], "r", driver='mpio', comm=MPI.COMM_WORLD)["0"][0])
if task == "main":
# blocks
# print(h5py.File(Settings.h5py.training[0], "r", driver='mpio', comm=MPI.COMM_WORLD)["0"][0])
init_pool(n=MPI.COMM_WORLD.Get_size()-1)
return True
elif task == "h5py_worker":
# works too but results in
# RuntimeError: Can't decrement id ref count (Can't close file, there are objects still open
# print(h5py.File(Settings.h5py.training[0], "r", driver='mpio', comm=MPI.COMM_WORLD)["0"][0])
new_worker()
return False
else:
raise RuntimeError("Unsupported task '{}'".format(task))
代码通过
执行mpiexec -n 2 python Test.py
or
mpiexec.mpich -n 2 python Test.py
安装了两个并尝试了它们但得到了相同的结果......
答案 0 :(得分:1)
我的猜测是公开调用是集体的,因此需要被通信器中的所有进程调用,并且因为您指定COMM_WORLD这意味着每个人。如果您只调用一个子集,那么它将阻止。
我并非100%清楚您想要做什么 - 您是否只想在主要任务上打开文件?这意味着只有主要任务才能实际写入文件,因此工作人员需要使用MPI发送他们想要写入的任何数据。
如果是这样,你可以只在main上调用open,但是使用通信器COMM_SELF,这意味着它不会等待所有其他等级调用open。
此致
大卫