使用fp_trap查找PETSc中浮点异常的原因?

时间:2015-01-27 03:59:01

标签: petsc

我不确定这个问题是否属于这里。但我的代码与PETSc有问题,说有一个浮点错误。它类似于以下链接中讨论的问题:

http://lists.mcs.anl.gov/pipermail/petsc-users/2012-November/015858.html https://www.mail-archive.com/petsc-users@mcs.anl.gov/msg22930.html

那些线程中的一些人只是对ust" fp_trap"说。但我应该去哪里?我试着进入gdb和valgrind,然后输入" fp_trap",但它没有工作

1 个答案:

答案 0 :(得分:0)

以下是一段需要调试的代码...此程序打印norm is -nan

static char help[] = "Floating point exception.\n\n";

#include <petscvec.h>

#undef __FUNCT__
#define __FUNCT__ "ShouldTriggerFloatingPointException"
extern PetscErrorCode ShouldTriggerFloatingPointException(){

    PetscErrorCode     ierr;

    PetscFunctionBegin;

    PetscScalar a=0.0;
    PetscScalar b=0.0;
    PetscScalar c=a/b;
    Vec x;

    ierr=VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr);
    ierr= VecSetSizes(x,PETSC_DECIDE,1000);CHKERRQ(ierr);
    ierr=  VecSetFromOptions(x);CHKERRQ(ierr);

    ierr=VecScale(x,c);CHKERRQ(ierr);
    PetscScalar norm;
    ierr=VecNorm(x,NORM_2,&norm);CHKERRQ(ierr);

    PetscPrintf(PETSC_COMM_WORLD,"norm is %g\n",norm);

    PetscFunctionReturn(0); 
}


#undef __FUNCT__
#define __FUNCT__ "main"
int main(int argc,char **argv)
{

    PetscErrorCode ierr;
    PetscInitialize(&argc,&argv,(char*)0,help);
    ierr=ShouldTriggerFloatingPointException();CHKERRQ(ierr);
    ierr = PetscFinalize();
    return 0;
}

以下makefile用于构建可执行文件main https://scicomp.stackexchange.com/questions/905/compiling-and-running-a-hello-world-program-in-petsc

include ${PETSC_DIR}/conf/variables
include ${PETSC_DIR}/conf/rules

main: main.o  chkopts
    -${CLINKER} -o main main.o  ${PETSC_LIB}
    ${RM} main.o

Petsc选项-fp_trap有助于检测此问题的根源:

mpirun -np 2 main -fp_trap

将打印一个警告,其中包含检测到问题的功能名称:

[0]PETSC ERROR: [0] ShouldTriggerFloatingPointException line 14 main.c
[0]PETSC ERROR: ------- Error Message----------
[0]PETSC ERROR: Floating point exception!
[0]PETSC ERROR: trapped floating point error!

因此-fp_trap是petsc程序的一个选项,与调试器无关。

需要使用调试器来查找发生问题的确切行。例如,使用gdb(和petsc configure --with-debugging):

gdb --args  main -fp_trap
(gdb) run

args表示可执行文件之后的参数被传递给可执行文件。它产生:

Program received signal SIGFPE, Arithmetic exception.
0x00000000004011a2 in ShouldTriggerFloatingPointException () at main.c:18
18  PetscScalar c=a/b;

现在检测到该问题了!

有关调试和mpi的更多信息:How do I debug an MPI program?