Тег MPI_PROC_NULL в MPI_SENDRECV_REPLACE. Это проблема? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть 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 решит проблему?

...