Как определить, действителен ли коммуникатор MPI? - PullRequest
0 голосов
/ 27 сентября 2018

В моей программе я включил несколько коммуникаторов MPI в структуру данных.К сожалению, иногда деструктор объекта этого типа может вызываться до его инициализации.В моем деструкторе я, конечно, называю MPI_Comm_Free.Но если это вызывается на недействительном коммуникаторе, код вылетает.

Я просматривал стандарт MPI, но не могу найти функцию для проверки работоспособности коммуникатора.Я также предполагаю, что не могу использовать MPI_Comm_set_errhandler, чтобы попытаться поймать бесплатное исключение, потому что нет действительного коммуникатора для установки обработчикаЯ мог бы сохранить значение флага в своем собственном высказывании, если коммуникатор действителен, но я предпочитаю избегать дублирования такой информации о состоянии.Есть ли какой-нибудь встроенный способ, которым я могу безопасно проверить работоспособность коммуникатора?

Вот базовая программа, демонстрирующая мою проблему:

#include <mpi.h>
typedef struct {
  MPI_Comm comm;
} mystruct;


void cleanup(mystruct* a) {
  MPI_Comm_free(&(a->comm));
}

int main(int argc, char* argv[]) {
  MPI_Init(&argc, &argv);
  mystruct a;

  /* Some early exit condition triggers cleanup without
     initialization */
  cleanup(&a);
  MPI_Finalize();
  return 0;
}

1 Ответ

0 голосов
/ 27 сентября 2018

MPI_COMM_NULL - это константа, используемая для недействительных коммуникаторов.Однако вы не можете определить, был ли инициализирован коммуникатор MPI .В C невозможно определить, была ли переменная инициализирована . Нестатические переменные начинаются с неопределенного значения *1013*, чтение которого вызывает неопределенное поведение .

Вы должны инициализироватькоммуникатор с MPI_COMM_NULL самостоятельно.Это имеет смысл, только если невозможно во время инициализации создать настоящий коммуникатор.

Примечание: MPI_Comm_free также устанавливает comm в MPI_COMM_NULL.

...