Почему команда mpiexec в файле python, записывающем параллельно с использованием h5py, использует больше, чем указанное количество ядер?

У меня есть приведенный ниже файл с именем demo2.py. Скопировано из: параллельная запись в разные группы с помощью h5py и http://docs.h5py.org/en/stable/mpi.html.

from mpi4py import MPI
import h5py

rank = MPI.COMM_WORLD.rank
size = MPI.COMM_WORLD.size

f = h5py.File('parallel_test.hdf5', 'w', driver='mpio', comm=MPI.COMM_WORLD)

dsets = []
for i in range(size):
    dsets.append(f.create_dataset('test{0}'.format(i), (1,), dtype='i'))

dsets[rank][:] = rank

f.close()

Я запускаю его, используя: mpiexec -n 2 python3 demo2.py в командной строке. Когда я проверяю используемые ядра с помощью htop, я ясно вижу, что используется более 2 ядер. У меня три вопроса:

  1. Почему и как это происходит?
  2. Как я могу строго ограничить количество используемых ядер?
  3. Как часть кода выполняется только один раз, а остальная часть распространяется? Или я неправильно понял это? Не могли бы вы объяснить поток программы, а также распределение ресурсов между процессами?

Большое спасибо, любая помощь очень ценится!


person PSK    schedule 28.07.2020    source источник
comment
задача MPI может иметь несколько потоков и, следовательно, (пытаться) использовать больше ядер, чем задачи MPI. Как правило, вы можете привязать каждую задачу MPI к одному ядру через командную строку (и если задача запускает другие потоки, они в конечном итоге разделят время).   -  person Gilles Gouaillardet    schedule 28.07.2020
comment
Спасибо за комментарий @GillesGouaillardet. Не могли бы вы сказать мне, какая часть моего кода создает эти потоки? Означает ли это в данном примере, что использование -n 2 не имеет преимуществ перед -n 1? mpiexec -n 2 python3 demo2.py --bind-to hwthread, кажется, делает то, что я хотел бы, но что именно это означает?   -  person PSK    schedule 28.07.2020
comment
если вы хотите ограничить задачу MPI одним ядром, то mpirun --bind-to core .... обратите внимание, что поведение по умолчанию недавнего Open MPI заключается в привязке к ядру по умолчанию при выполнении двух задач MPI. Open MPI порождает как минимум 2 вспомогательных потока для каждой задачи MPI, но они не должны потреблять много ресурсов, за исключением, возможно, запуска и финализации. поэтому с точки зрения производительности 2 задачи (по одному ядру в каждой) имеют больший потенциал для повышения производительности, чем 1 задача.   -  person Gilles Gouaillardet    schedule 28.07.2020
comment
Я использую MPICH, а не Open MPI. Это отвечает на два моих вопроса, но я до сих пор не совсем понимаю ход программы. В частности, весь этот код выполняется -n раз? Если да, то каким образом один и тот же файл f создается только один раз и используется во всех запусках этой программы? Не могли бы вы написать немного о потоке и совместном использовании ресурсов в этом конкретном примере, включая создание вспомогательных потоков, и ваши предыдущие два комментария в качестве ответа, чтобы я мог его принять? Некоторые ресурсы, чтобы понять это лучше, также были бы очень полезны. Спасибо!   -  person PSK    schedule 29.07.2020