У меня есть MPI-код Fortran, который прекрасно работает на современной платформе Linux и на современном Mac. Мой клиент также хочет, чтобы он работал на довольно устаревшем (почти десятилетнем) Mac. На этой машине я собираю gfortran и запускаю дистрибутив MPI, которому уже несколько лет. На этом аппарате происходит сбой при вызове:
call MPI_SENDRECV_REPLACE(tempLR_N, lrsize, MPI_DOUBLE_PRECISION, &
m_neighbors(MPI_RIGHT), m_rank, &
m_neighbors(MPI_LEFT), m_neighbors(MPI_LEFT), &
m_newComm, statmpi, mpierr)
Некоторые процессы, вызывающие этот вызов, являются граничными процессами. Для них аргумент тега приема m_neighbors(MPI_LEFT)
равен MPI_PROC_NULL
, что равно -2 в этой системе. (Кстати, я подтвердил, что m_neighbors(MPI_LEFT)
и MPI_PROC_NULL
оба равны -2 при выполнении.) Этот вызов завершается с ошибкой MPI_ERR_TAG
. Я прочитал в документации, что «Теги должны быть неотрицательными». Я удивлен, что это было бы так, даже если тег был MPI_PROC_NULL
.
Похоже, что должно происходить одно из двух: 1) Более поздние версии MPI не имеют проблем с MPI_PROC_NULL
в качестве тега, но более старые версии могли бы. Или 2) Я нарушаю стандарт, используя MPI_PROC_NULL
, и мне просто повезло, что он работал на двух разных платформах. Может ли кто-нибудь сказать мне, в чем дело?
Кроме того, где у меня есть MPI_PROC_NULL
для тега получения, MPI_ANY_TAG
решит проблему?