gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:12:14 24 4
gpt4 key购买 nike

我需要在我的项目中使用 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_Comm_f2c() 之前调用了 MPI_Init()

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

<小时/>

腮腺炎_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

最佳答案

问题可能隐藏在链接中。我发现引发错误的实际调用位于您要链接的库中。

简而言之:您可能链接到 MPI 的多个副本。一种已初始化,一种未初始化。后者由您的库调用并引发错误。

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

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

如果您有机会修改外部库 (mumps) 的源代码,并在崩溃的行之前调用 MPI_Initialized(int*),您应该会发现它返回 false,甚至尽管您调用了MPI_Init()。这暗示库和您的二进制文件链接到 MPI 发行版的不同副本。

就我而言(在将头撞到墙上两天之后),这甚至是 MPI 的不同动态链接版本的问题。我很幸运能够控制该库的编译,因此可以修改它链接的 MPI 版本。

关于c - MUMPS - 在调用 MPI_INIT 之前调用 MPI_Comm_f2c() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31687583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com