我不确定这个问题是否属于这里。但我的代码与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",但它没有工作
答案 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?