У меня есть код forall с распределенными итераторами в Chapel, и я пытаюсь запустить его в кластере.
Код отлично работает при использовании канала UDP.
Теперь я пытаюсь использовать портативный MPI в качестве внутреннего слоя - безуспешно.
Вот моя конфигурация:
export CHPL_TASKS=qthreads
export CHPL_COMM=gasnet
export CHPL_COMM_SUBSTRATE=mpi
export CHPL_LAUNCHER=gasnetrun_mpi
только с этой конфигурацией использовался только один узел. Глядя на документацию Gasnet, я добавил:
export GASNET_NODEFILE="$(pwd)"/nodes
export MPIRUN_CMD='mpirun -np %N -machinefile %H %C'
(эти детали отсутствуют в официальной документации).
Хорошо, теперь я могу запускать код Chapel с помощью MPI. НО:
1) Каждый узел имеет 32 ядра. Если я ставлю hello6 -nl x
, x ‹ 33, то все процессы выполняются первой локалью.
1.1) Я хотел бы запустить hello6 -nl 4
, чтобы каждый узел здоровался с локали x, адрес x.address.
2) Похоже, что Chapel использует $OAR_NODEFILE
(может быть, и другой) для создания вектора Locales, потому что этот OAR_NODEFILE
имеет по одной записи на ядро для каждого узла.
3) Однако, даже если я вручную изменю как $GASNET_NODEFILE
, так и $OAR_NODEFILE
, вектор локали по-прежнему будет содержать одну запись на ядро для каждого узла ЦП.
4) В кластере, к которому у меня есть доступ, я запускаю mpi-коды следующим образом: mpirun -machinefile $OAR_NODEFILE ~/program
. Однако для GASNET требуется синтаксис последней экспортированной переменной.
Может ли кто-нибудь помочь мне настроить среду выполнения для выполнения моего кода в нескольких локалях?
С наилучшими пожеланиями,
Тьяго Карнейро.