MPI_Comm_dup() не работает при отправке MPI_COMM_NULL в качестве аргумента

Где-то я использовал

MPI_Comm_dup(row_comm, &bigger_row_comm);

и я заметил, что это вызвало «фатальную» ошибку, когда row_comm было равно MPI_COMM_NULL. я изменил его с

if (row_comm != MPI_COMM_NULL)
    MPI_Comm_dup(row_comm, &bigger_row_comm);
else
    bigger_row_comm = MPI_COMM_NULL;

Теперь это работает. Я использую MPICH и нашел это в его документации в записи для MPI_Comm_dup:

Распространенной ошибкой является использование нулевого коммуникатора в вызове (это даже не разрешено в MPI_Comm_rank).

Интересно, является ли это поведение стандартным, и я должен ожидать, что другие реализации сделают то же самое. Почему они просто не справились с этим, как я? Можно ожидать, что дубликат MPI_COMM_NULL будет MPI_COMM_NULL.


person apadana    schedule 07.09.2019    source источник


Ответы (1)


стандарт MPI не определяет, что MPI_Comm_dup должен делать при вызове с нулевым коммуникатором (см. раздел 6.4.2). Следовательно, нельзя предполагать, что такой вызов разрешен, тем более что MPI_COMM_NULL определяется как «значение, используемое для недопустимых дескрипторов коммуникатора».

Что бы это ни стоило, OpenMPI 4.0.1 также рассматривает вызов как ошибку.

person rtoijala    schedule 07.09.2019