MUMPS - 在调用MPI_INIT之前调用MPI_Comm_f2c()函数

时间:2015-07-28 08:36:27

标签: c fortran mpi

我需要在我的项目中使用MUMPS。我想用解决方程的简单例子来测试安装(下面)。问题是,这个代码在我的个人电脑上正常工作,但每次我尝试在我的工作电脑上运行时,它都会给我这个错误:

*** The MPI_Comm_f2c() function was called before MPI_INIT was invoked.
*** This is disallowed by the MPI standard.
*** Your MPI job will now abort.
[espreso-ws:3263] Local abort before MPI_INIT completed successfully; not able to aggregate error messages, and not able to guarantee that all other processes were killed!

我试图寻找可能的解决方案,但我发现只有这些问题:

error: The MPI_Send() function was called before MPI_INIT was invoked

http://www.open-mpi.org/community/lists/users/2012/05/19262.php

他们都没有提供任何解决方案。

所以现在,我对此非常困惑,我真的不知道,我该怎么做。当然在MPI_Init()之前调用了MPI_Comm_f2c()

您知道吗,如何解决这个问题?

mumps_solve.c

/*
 *  file c_example.c
 *  This file is part of MUMPS 4.10.0
 *  To run: aprun -n 2 ./dsimpletest < input_simpletest_real
 */
/* Example program using the C interface to the
 * double real arithmetic version of MUMPS, dmumps_c.
 * We solve the system A x = RHS
 */
#include <stdio.h>
#include <string.h>
#include <mpi.h>
#include <dmumps_c.h>
#define JOB_INIT -1
#define JOB_END -2
#define USE_COMM_WORLD -987654

int main(int argc, char ** argv)
{
  DMUMPS_STRUC_C id;
  int n = 2;
  int nz = 4;
  int irn[] = {1,1,2,2};
  int jcn[] = {1,2,1,2};
  double a[4];
  double rhs[2];

  int myid, ierr;
  ierr = MPI_Init(&argc, &argv);
  ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);

  /* Define A and rhs */
  rhs[0]=5.0;rhs[1]=2.0;
  a[0]=3.0;a[1]=2.0;a[2]=1.0;a[3]=4.0;

  /* Initialize a MUMPS instance. Use MPI_COMM_WORLD */
  id.job=JOB_INIT;id.par=1; id.sym=0;id.comm_fortran=USE_COMM_WORLD;

  dmumps_c(&id); // here the program crashes

  /* Define the problem on the host */
  if (myid == 0) {
    id.n = n; id.nz =nz; id.irn=irn; id.jcn=jcn;
    id.a = a; id.rhs = rhs;
  }
#define ICNTL(I) icntl[(I)-1] /* macro s.t. indices match documentation */
/* No outputs */
  id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0;
/* Call the MUMPS package. */
  id.job=6;
  dmumps_c(&id);
  id.job=JOB_END; dmumps_c(&id); /* Terminate instance */
  if (myid == 0) {
    printf("Solution is : (%8.2f  %8.2f)\n", rhs[0],rhs[1]);
  }
  ierr = MPI_Finalize();
  return 0;
}

生成文件

.DEFAULT_GOAL=all

BINARIES=mumps_solve

.PHONY=all
all: mumps_solve

mumps_solve: mumps_solve.o
        mpicc mumps_solve.o -o mumps_solve -ldmumps

mumps_solve.o: mumps_solve.c
        mpicc -c mumps_solve.c -o mumps_solve.o

.PHONY=clean
clean:
        rm -f ${BINARIES} *.o

1 个答案:

答案 0 :(得分:0)

问题可能隐藏在链接中。我看到引发错误的实际调用是在您链接的库中。

简而言之:您可能与多个MPI副本相关联。一个是初始化的,一个不是。后者由您的库调用并引发错误。

简而言之:再次编译外部库和您自己的代码,验证所有编译都是由mpicc完全相同的物理副本完成的。

可以根据MPI发行版的不同副本编译和链接库,而不是链接主库的副本。如果是这种情况,则有多个全局变量副本,用于跟踪MPI的初始化状态。您对MPI_Init()的调用通过调用Makefile中的mpicc(位于which mpicc)转到您链接的MPI副本。如果您在MPI_Initialized(int*)之后致电MPI_Init(),您会发现它返回true。

如果您有机会修改外部库(mumps)的来源,并在崩溃的行之前调用MPI_Initialized(int*),您应该会发现它返回false,即使您调用了{{1} }。这是一个暗示库和您的二进制文件链接到您的MPI发行版的不同副本。

在我的情况下(在我的头撞墙后两天),甚至是MPI的动态链接版本的问题。我很幸运能够控制库的编译,因此可以修改它链接的MPI版本。