Ошибка ошибки сегментации из-за MPI_comm_size - PullRequest
0 голосов
/ 30 июня 2018

У меня есть код Fortran, который предназначен для работы с коммуникатором по умолчанию MPI_COMM_WORLD, но я собираюсь запустить его только с несколькими процессорами. У меня есть другой код, который использует MPI_comm_split, чтобы получить другой коммуникатор MyComm. Это целое число, и я получил 3, когда напечатал его значение. Теперь я вызываю функцию C в своем коде на Фортране, чтобы получить ранг и размер, соответствующие MyComm. Но здесь я сталкиваюсь с несколькими проблемами.

  1. В Фортране, когда я печатал MyComm, его значение было 3, но когда я печатаю его внутри функции C, оно становится 17278324. Я также напечатал значение MPI_COMM_WORLD, оно было около 1140850688. Я не знаю, что означают эти значения и почему изменилось значение MyComm?

  2. Мой код работает правильно и создает исполняемый файл, но когда я выполнил его, я получил ошибку ошибки сегментации. Я использовал gdb для отладки своего кода, и процесс завершился в следующей строке

Программа завершена с сигналом 11, ошибка сегментации.

#0  0x00007fe5e8f6248c in PMPI_Comm_size (comm=0x107a574, size=0x13c4ba0) at pcomm_size.c:62
62      *size = ompi_comm_size((ompi_communicator_t*)comm);

Я заметил, что MPI_comm_rank дает ранг, соответствующий MyComm, но проблема только с MPI_comm_size. Не было такой проблемы с MPI_COMM_WORLD. Поэтому я не могу понять, что является причиной этого. Я проверил свои данные, но я не получил никакой подсказки. Вот мой код C,

#include <stdio.h>
#include "utils_sub_names.h"
#include <mpi.h>
#define MAX_MSGTAG 1000
int flag_msgtag=0;
MPI_Request mpi_msgtags[MAX_MSGTAG];

char *ibuff;
int ipos,nbuff;

MPI_Comm MyComm;
 void par_init_fortran (MPI_Fint *MyComm_r,MPI_Fint*machnum,MPI_Fint *machsize)
{
 MPI_Fint comm_in
 comm_in=*MyComm_r;
 MyComm=MPI_Comm_f2c(comm_in);
 printf("my comm is %d \n",MyComm);

  MPI_Comm_rank(MyComm,machnum);
  printf("my machnum is %d \n ", machnum);
  MPI_Comm_rank(MyComm,machsize);
  printf("my machnum is %d \n ", machsize);
}

Edit:

Я хочу объявить MyComm глобальным коммуникатором для всех функций, перечисленных в моем C-коде. Но я не знаю, почему мой коммуникатор все еще не работает. Обратите внимание, что подпрограммы MPI инициализируются и завершаются только на Фортране, и мне не нужно их снова инициализировать в C Я использую следующий код Fortran.

     implicit none
      include 'mpif.h'
      integer :: MyColor, MyCOMM, MyError, MyKey, Nnodes
      integer :: MyRank, pelast
      CALL mpi_init (MyError)
      CALL mpi_comm_size (MPI_COMM_WORLD, Nnodes, MyError)
      CALL mpi_comm_rank (MPI_COMM_WORLD, MyRank, MyError)
      MyColor=1
      MyKey=0 

   CALL mpi_comm_split (MPI_COMM_WORLD, MyColor, MyKey, MyComm,MyError)
   CALL ramcpl (MyComm)
   CALL mpi_barrier (MPI_COMM_WORLD, MyError)
   CALL MCTWorld_clean ()
   CALL mpi_finalize (MyError)

моя подпрограмма ramcpl находится в другом месте

subroutine ramcpl (MyComm_r)
implicit none
integer :: MyComm_r, ierr
.
.
.
CALL par_init_fortran (MyComm_r, my_mpi_num,nmachs);
End Subroutine ramcpl

Командная строка и вывод,

    mpirun -np 4 ./ramcplM ramcpl.in

       Model Coupling: 

[localhost:31472] *** Process received signal ***
[localhost:31473] *** Process received signal ***
[localhost:31472] Signal: Segmentation fault (11)
[localhost:31472] Signal code: Address not mapped (1)
[localhost:31472] Failing at address: (nil)
[localhost:31473] Signal: Segmentation fault (11)
[localhost:31473] Signal code: Address not mapped (1)
[localhost:31473] Failing at address: (nil)
[localhost:31472] [ 0] /lib64/libpthread.so.0() [0x3120c0f7e0]
[localhost:31472] [ 1] ./ramcplM(par_init_fortran_+0x122) [0x842db2]
[localhost:31472] [ 2] ./ramcplM(__rams_MOD_rams_cpl+0x7a0) [0x8428c0]
[localhost:31472] [ 3] ./ramcplM(MAIN__+0xea6) [0x461086]
[localhost:31472] [ 4] ./ramcplM(main+0x2a) [0xc3eefa]
[localhost:31472] [ 5] /lib64/libc.so.6(__libc_start_main+0xfd) [0x312081ed1d]
[localhost:31472] [ 6] ./ramcplM() [0x45e2d9]
[localhost:31472] *** End of error message ***
[localhost:31473] [ 0] /lib64/libpthread.so.0() [0x3120c0f7e0]
[localhost:31473] [ 1] ./ramcplM(par_init_fortran_+0x122) [0x842db2]
[localhost:31473] [ 2] ./ramcplM(__rammain_MOD_ramcpl+0x7a0) [0x8428c0]
[localhost:31473] [ 3] ./ramcplM(MAIN__+0xea6) [0x461086]
[localhost:31473] [ 4] ./ramcplM(main+0x2a) [0xc3eefa]
[localhost:31473] [ 5] /lib64/libc.so.6(__libc_start_main+0xfd) [0x312081ed1d]
[localhost:31473] [ 6] ./ramcplM() [0x45e2d9]
[localhost:31473] *** End of error message ***

1 Ответ

0 голосов
/ 30 июня 2018

Дескрипторы в Fortran и C НЕ совместимы. Используйте MPI_Comm_f2c https://linux.die.net/man/3/mpi_comm_f2c и связанные с ним функции преобразования. Передайте его между C и Fortran как целое число, а не как MPI_Comm.

...