Как узнать количество ядер, доступных для MPI(4PY)?
Мотивация
Моя программа на Python создает экземпляры MPI иерархически.
Первый спаун всегда происходит и создает 4 экземпляра. Увеличивать это число не имеет смысла из-за структуры моих вычислений, поэтому я жестко запрограммировал его.
В зависимости от параметров командной строки основной программы каждый из 4 экземпляров затем вызывает внешнее программное обеспечение Python, которое масштабируется почти линейно.
Я называю это внешним программным обеспечением, используя
N=3
child=MPI.COMM_SELF.Spawn(sys.executable,args=[`external.py`],maxprocs=N)
На данный момент я использую N=3
, так что 4 экземпляра первого экземпляра порождают каждый по 3 экземпляра внешней программы, что дает в общей сложности 12 экземпляров, что соответствует количеству ядер на моей рабочей станции.
Однако для переносимости я хотел бы сделать
N_avail = <MPI.N_CORES> #on my workstation: N_avail=12
N = N_avail/MPI.COMM_WORLD.Get_size() #on my workstation: N=12/4=3
так что количество доступных ядер не нужно жестко запрограммировать.
Возможно ли это и есть ли смысл?
Примечания
Я надеялся, что не указание maxprocs поможет, так же как mpirun
без -np
порождает столько экземпляров, сколько доступно ядер. Однако Spawn
по умолчанию принимает значение maxprocs=1
.
Вызов внешней библиотеки блокируется, поэтому я не буду (не буду) вычитать 4 экземпляра из первого спавна из N_avail
.
Я не могу просто использовать multiprocessing.cpu_count()
, так как это даст мне только ядра на текущем узле (в настройках кластера). Я планирую запустить свой код в кластере с помощью планировщика SLURM.
$SLURM_NTASKS
, чтобы выяснить, сколько слотов было выделено. - person Gilles Gouaillardet   schedule 13.11.2017