我需要在我的项目中使用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()
。
您知道吗,如何解决这个问题?
/*
* 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
答案 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版本。