【问题标题】:Issues with Valgrind when running Petsc运行 Petsc 时 Valgrind 的问题
【发布时间】:2017-12-27 08:27:47
【问题描述】:

我从 valgrind 收到以下错误。

==30996== Conditional jump or move depends on uninitialised value(s)
==30996==    at 0x12B28904: ??? (in /usr/lib64/libmlx4-rdmav2.so)
==30996==    by 0xE12CF9A: ibv_open_device (in /usr/lib64/libibverbs.so.1.0.0)
==30996==    by 0xAAFA03B: btl_openib_component_init (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0xAAF0832: mca_btl_base_select (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0xAAF0160: mca_bml_r2_component_init (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0xAAEE95D: mca_bml_base_init (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0xABE96D9: mca_pml_ob1_component_init (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0xABE75A8: mca_pml_base_select (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0xAA98BD3: ompi_mpi_init (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0xAAB87EC: PMPI_Init_thread (in /sw/arcts/centos7/openmpi/1.10.2-gcc-4.8.5/lib/libmpi.so.12.0.2)
==30996==    by 0x5D4664: PetscInitialize.part.3 (in /scratch/kfid_flux/ykmizu/ROMLSS/bin/ks_main.x)
==30996==    by 0x49B5B4: main (in /scratch/kfid_flux/ykmizu/ROMLSS/bin/ks_main.x)
==30996== 

而且这个错误会一遍又一遍地重复。我不明白为什么 PetscInitialize 会给我带来困难。这是我在初始化整数和双精度等之后在 main.c 文件中调用的第一件事。

PetscInitialize(&argc, &argv, NULL, NULL);
SlepcInitialize(&argc, &argv, NULL, NULL);
PetscViewerPushFormat(PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_ASCII_MATLAB);

这些只是错误的错误吗?任何帮助将不胜感激。对此有些绝望。谢谢你。

【问题讨论】:

    标签: valgrind petsc


    【解决方案1】:

    有讨论here

    您似乎使用了在 valgrind 下嘈杂的 Open MPI。您可以尝试编译两个版本的 PETSc(因此有两个不同的 PETS_ARCH):一个使用系统中优化的 MPI,另一个使用 MPICH 和配置选项 --download-mpich 构建。

    为了调试,你可以选择用mpich编译的PETSC_ARCH。对于性能评估,您可以选择另一个使用您平台的优化 MPI 编译的 PETSC_ARCH。

    另外,如果您想同时使用 PETSc 和 SLEPc,您可以选择 PetscInitialize 或 SlepcInitialize 来启动它们的环境。重复两次是没有意义的。

    希望对你有帮助。

    【讨论】:

    • 我如何有两种不同的构建,一种用于 mpich,另一种用于 open-mpi?我安装了 mpich,这迫使我取消链接 open-mpi。一旦我这样做了,我就尝试制作,然后我的程序找不到 mpi.h。我试图重新链接 mpich 以使我的程序再次运行,但它找不到 mpi.h。如果一次只能链接两个 open-mpi 和 mpich 中的一个,我该如何构建两个不同的两个不同版本?
    • 抱歉迟到了。您是否尝试使用配置选项--download-mpich 进行安装?或者你自己安装了 mpich。在我看来,最安全的方法是直接使用这个选项。
    • 对于两个版本的构建,您可以将 PETSc 配置为相同的 PETSC_DIR,但不同的 PETSC_ARCH。例如,对于 openmpi 版本:./confugre PETSC_DIR=yourdir PETSC_ARCH=arch-linux-openmpi --with-mpi-dir=your_openmpi_dir ... 对于 mpich 版本:./confugre PETSC_DIR=yourdir PETSC_ARCH=arch-linux-mpich - -download-mpich...,您可以通过切换环境变量PETSC_ARCH链接两个不同版本的mpi并重新编译您的代码。
    • 感谢您的帮助。对此,我真的非常感激!我意识到 Homebrew 使用了我一直在使用的 open-mpi。我使用 mpich 从头开始​​安装了一个完全独立的 petsc 版本。我在上面运行了 valgrind,它肯定比使用 open-mpi petsc 噪音小,但是当我使用 valgrind 时,我仍然收到 PetscInitialize/SlepcInitialize 错误。它让我现在调试起来容易多了,但我仍然想知道为什么我会从 valgrind 得到这些内存错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多