Skip to content

Problem loading from-source build on Cray machine: libStgDomain.so undefined MPI symbols not found in MPI library #739

@aproeme

Description

@aproeme

Hello,

Error description

I've built Underworld2 from source on a Cray machine (ARCHER2), but importing fails with an undefined MPI symbol (mpi_pack_):

(uw2pyenv)> python -m "import underworld"
[...rest of stack trace...]
ImportError: /mnt/lustre/a2fs-work2/work/z19/shared/underworld2/uw2pyenv/lib/python3.10/site-packages/underworld/lib/libStgDomain.so: undefined symbol: mpi_pack_

I can see that libStgDomain.so is linked to the correct MPI library (Cray MPICH):

> ldd /mnt/lustre/a2fs-work2/work/z19/shared/underworld2/uw2pyenv/lib/python3.10/site-packages/underworld/lib/libStGermain.so 
[...various libs...]
libmpi_gnu_91.so.12 => /opt/cray/pe/lib64/libmpi_gnu_91.so.12 (0x00007f366b200000)
[...various libs...]

This MPI library contains the symbol definition for MPI_Pack:

> nm -a /opt/cray/pe/lib64/libmpi_gnu_91.so.12 | grep -w MPI_Pack
0000000000721e00 W MPI_Pack

but not for for mpi_pack_:

> nm -a /opt/cray/pe/lib64/libmpi_gnu_91.so.12 | grep -w mpi_pack_
>

I think the issue is therefore a case mismatch in the symbol names. Would you be able to advise why libStGermain.so expects mpi_pack_ (all lowercase) rather than MPI_Pack, wether I've overlooked anything and how I might fix this?

Build procedure

My build procedure for Underworld2 was as follows:

Load relevant modules:

module load PrgEnv-gnu
module load petsc
module load cray-hdf5-parallel
module load cray-python

Create virtual environment (based off of cray-python, which provides mpi4py linked to the Cray MPICH library):

python -m venv --system-site-packages ./uw2pyenv
source ./uw2pyenv/bin/activate

Install h5py using the guidance provided for MPI-parallel h5py (note the Cray compiler wrapper cc links to the Cray MPICH library):

CC=cc HDF5_MPI="ON" pip install --no-binary=h5py h5py

Set compilers to be the Cray compiler wrappers:

export MPICC=cc
export MPICXX=CC
export MPIF90=ftn

Make sure cmake can find the LibXml2 and PETSc installs provided by the modules:

export PKG_CONFIG_PATH=$PETSC_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=$LIBXML2_DIR/lib/pkgconfig:$PKG_CONFIG_PATH

Then in src/underworld/libUnderworld/CMakeLists.txt change

pkg_check_modules(PETSc PETSc) 

to

pkg_check_modules(PETSc petsc)

Since the pkconfig file in our PETSc install is called petsc.pc not PETSc.pc <--- possibly related to the lowercase/uppercase symbol issue?

Finally pip install, with output shown:

(uw2pyenv)> pip install .

Processing /mnt/lustre/a2fs-work2/work/z19/shared/underworld2/underworld2-2.17.0
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
[...etc...]
Successfully built underworld
Installing collected packages: underworld
Successfully installed underworld-2.17.0

The attempted import of underworld in a python session fails as described above.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions