MPI 分段故障(信号 11)

Posted

技术标签:

【中文标题】MPI 分段故障(信号 11)【英文标题】:MPI Segmentation fault (signal 11) 【发布时间】:2016-01-21 21:19:41 【问题描述】:

我已经尝试了两天多,看看我犯了哪些错误,但我找不到任何东西。我不断收到以下错误:

=您的一个应用程序进程错误终止

= 退出代码:139

= 清理剩余进程

= 您可以忽略以下清理消息

YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)

This typically refers to a problem with your application.

Please see the FAQ page for debugging suggestions

make: *** [run] Error 139

所以问题很明显在MPI_BCAST 和另一个函数中我有MPI_GATHER。 你能帮我找出问题所在吗? 当我编译代码时,我输入以下内容:

/usr/bin/mpicc  -I/usr/include   -L/usr/lib  z.main.c  z.mainMR.c  z.mainWR.c  -o  1dcode -g  -lm

运行:

usr/bin/mpirun -np 2 ./1dcode dat.txt o.out.txt

例如我的代码包含这个函数:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include "functions.h"
#include <mpi.h>
/*...................z.mainMR master function............. */
void MASTER(int argc, char *argv[], int nPROC, int nWRs, int mster)


/*... Define all the variables we going to use in z.mainMR function..*/
double tend, dtfactor, dtout, D, b, dx, dtexpl, dt, time;
int MM, M, maxsteps, nsteps;
FILE *datp, *outp;
/*.....Reading the data file "dat" then saving the data in o.out.....*/
datp = fopen(argv[1],"r"); // Open the file in read mode
outp = fopen(argv[argc-1],"w"); // Open output file in write mode
if(datp != NULL) // If data file is not empty continue

fscanf(datp,"%d %lf %lf %lf %lf %lf",&MM,&tend,&dtfactor,&dtout,&D,&b);    // read the data
fprintf(outp,"data>>>\nMM=%d\ntend=%lf\ndtfactor=%lf\ndtout=%lf\nD=%lf\nb=%lf\n",MM,tend,dtfactor,dtout,D,b);
fclose(datp); // Close the data file
fclose(outp); // Close the output file

else // If the file is empty then print an error message

    printf("There is something wrong. Maybe file is empty.\n");


/*.... Find dx, M, dtexpl, dt and the maxsteps........*/
dx = 1.0/ (double) MM;
M = b * MM;
dtexpl = (dx * dx) / (2.0 * D);
dt = dtfactor * dtexpl;
maxsteps = (int)( tend / dt ) + 1;

/*...Pack integers in iparms array, reals in parms array...*/
int iparms[2] = MM,M;
double parms[4] = dx, dt, D, b; 
MPI_BCAST(iparms,2, MPI_INT,0,MPI_COMM_WORLD);
MPI_BCAST(parms, 4, MPI_DOUBLE,0, MPI_COMM_WORLD);

【问题讨论】:

为什么要否决我的问题?这是我在这个网站上的第一个问题,我真的需要帮助。如果我写了一些错别字或让它看起来一团糟,我深表歉意。 您是如何清楚地推断出问题出在MPI_BCAST 的?除了 C 函数调用实际上拼写为 MPI_Bcast 之外,我认为显示的 MPI 调用没有任何问题。 【参考方案1】:

所以这有一个正式的答案:您将MPI_Bcast 拼写为MPI_BCAST。我会假设这会给你一个链接错误,因为你试图访问一个不存在的函数,但显然它没有。

我的猜测是您的 MPI 实现在同一个头文件中定义了 Fortran 和 C MPI 函数。然后你的程序不小心调用了 Fortran 函数 MPI_BCAST 并且类型没有加起来(MPI_INTEGER (Fortran) 不一定是 MPI_INT (C)),不知何故给了你段错误。

【讨论】:

【参考方案2】:

运行时错误是由于 MPICH 的特定特性和 C 语言的一个特性的不幸结合造成的。

MPICH 在单个库文件中同时提供 C 和 Fortran 接口代码:

000000000007c7a0 W MPI_BCAST
00000000000cd180 W MPI_Bcast
000000000007c7a0 W PMPI_BCAST
00000000000cd180 T PMPI_Bcast
000000000007c7a0 W mpi_bcast
000000000007c7a0 W mpi_bcast_
000000000007c7a0 W mpi_bcast__
000000000007c7a0 W pmpi_bcast
000000000007c7a0 T pmpi_bcast_
000000000007c7a0 W pmpi_bcast__

Fortran 调用以多种别名导出,以便同时支持许多不同的 Fortran 编译器,包括全部大写的 MPI_BCASTMPI_BCAST 本身并未在 mpi.h 中声明,但 ANSI C 允许在没有前面原型声明的情况下调用函数。通过将-std=c99 传递给编译器来启用C99 会导致关于MPI_BCAST 函数的隐式声明的警告。 -Wall 也会导致警告。代码将无法与 Open MPI 链接,后者在 mpicc 未链接的单独库中提供 Fortran 接口。

即使代码可以正确编译和链接,Fortran 函数也希望它们的所有参数都通过引用传递。此外,Fortran MPI 调用采用额外的输出参数,其中返回错误代码。因此分段错误。

为防止以后出现此类错误,请使用-Wall -Werror 进行编译,这样可以尽早发现类似问题。

【讨论】:

以上是关于MPI 分段故障(信号 11)的主要内容,如果未能解决你的问题,请参考以下文章

由于信号,命令失败:分段错误:11

[仅在多个节点上的MPI分段故障

由于信号导致命令失败:分段错误:11 Xcode 8.0

MKMapViewDelegate 命令因信号而失败:分段错误:11

Swift 编译器错误命令因信号而失败:分段错误:11

在 Swift 3 中存档项目并获得“由于信号分段错误 11 导致命令失败”