mpiopenmpiubuntu-20.04mpich

Switch from MPICH to OpenMPI


I have both mpich and openmpi in my Ubuntu 20.04.

$ dpkg -l | grep mpi | grep lib
...
ii  libmpich-dev:amd64                            3.3.2-2build1                         amd64        Development files for MPICH
ii  libmpich12:amd64                              3.3.2-2build1                         amd64        Shared libraries for MPICH
...
ii  libopenmpi-dev:amd64                          4.0.3-0ubuntu1                        amd64        high performance message passing library -- header files
ii  libopenmpi3:amd64                             4.0.3-0ubuntu1                        amd64        high performance message passing library -- shared library
...
ii  openmpi-bin                                   4.0.3-0ubuntu1                        amd64        high performance message passing library -- binaries
ii  openmpi-common                                4.0.3-0ubuntu1                        all          high performance message passing library -- common files
..
$ dpkg -l | grep mpich
...
ii  mpich                                         3.3.2-2build1                         amd64        Implementation of the MPI Message Passing Interface standard

The default (probably because it was installed later) appears to be mpich.

How would I change to openmpi?

I want to make sure that everything that needs to be changed actually is. So far, I am thinking about headers, executable, libraries. I do not know which are all directories, links, etc., that have to change.

For instance, here it is suggested cmake -DMPI_CC_COMPILER=/.../mpicc. And it was mentioned in comments that it worked. But:

  1. I am not sure it actually fixes all headers, etc.

  2. I need a method that:

    2.1. Works for all users in the system

    2.2. Does not require those macros

    2.3. Works also for other compilation methods other than cmake

As for 2.3, I tried now to configure petsc

$ ./configure --with-cc=mpicc --with-fc=mpif90 -with-cxx=mpicxx --with- make-np=10 --with-shared-libraries --download-f2cblaslapack --download-mumps --download-scalapack --with-debugging=0 COPTFLAGS="-O -O3 -march=native -mtune=native" FOPTF LAGS="-O -O3 -march=native -mtune=native" CXXOPTFLAGS="-O -O3 -march=native -mtune=native"

and I got

Your libraries are from MPICH but it appears your mpiexec is from OpenMPI

Can this be fixed with update-alternatives?

I found this, which makes me think it can, but in my system it is not correctly configured:

$ type mpiexec
mpiexec is hashed (/usr/bin/mpiexec)
$ ll /usr/bin/mpiexec
lrwxrwxrwx 1 root root 25 Jan 21 11:11 /usr/bin/mpiexec -> /etc/alternatives/mpiexec
$ ll /etc/alternatives/mpiexec
lrwxrwxrwx 1 root root 24 Jan 21 11:11 /etc/alternatives/mpiexec -> /usr/bin/mpiexec.openmpi
$ ll /usr/bin/mpiexec.openmpi
lrwxrwxrwx 1 root root 7 Apr 15  2020 /usr/bin/mpiexec.openmpi -> orterun

$ type mpirun
mpirun is /usr/bin/mpirun
$ ll /usr/bin/mpirun
lrwxrwxrwx 1 root root 24 Jan 21 11:11 /usr/bin/mpirun -> /etc/alternatives/mpirun
$ ll /etc/alternatives/mpirun
lrwxrwxrwx 1 root root 23 Jan 21 11:11 /etc/alternatives/mpirun -> /usr/bin/mpirun.openmpi
$ ll /usr/bin/mpirun.openmpi
lrwxrwxrwx 1 root root 7 Apr 15  2020 /usr/bin/mpirun.openmpi -> orterun

$ type mpicc
mpicc is hashed (/usr/bin/mpicc)
$ ll /usr/bin/mpicc
lrwxrwxrwx 1 root root 21 Feb 25 18:54 /usr/bin/mpicc -> /etc/alternatives/mpi
$ ll /etc/alternatives/mpi
lrwxrwxrwx 1 root root 20 Feb 25 18:54 /etc/alternatives/mpi -> /usr/bin/mpicc.mpich

Related

  1. Replace MPICH Installation by OpenMPI
  2. CMake : Selecting mpich over openmpi
  3. https://unix.stackexchange.com/questions/413099/flip-between-openmpi-and-mpich-as-default-using-linux-terminal
  4. Difference between mpi and mpich2 folder?
  5. CMake : Selecting mpich over openmpi
  6. Switch from MPICH to OpenMPI
  7. This? https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=896189
  8. This? https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=912437
  9. https://unix.stackexchange.com/questions/81992/better-way-to-add-alternative-using-update-alternatives
  10. https://askubuntu.com/questions/964600/how-to-add-slave-to-existing-update-alternatives-link-group

Solution

  • It seems all alternatives, except for one (link group mpi), were already set for openmpi

    $ update-alternatives --get-selections | grep mpi
    h5pcc                          auto     /usr/bin/h5pcc.openmpi
    mpi                            auto     /usr/bin/mpicc.mpich
    mpi-x86_64-linux-gnu           auto     /usr/lib/x86_64-linux-gnu/openmpi/include
    mpirun                         auto     /usr/bin/mpirun.openmpi
    

    To set link group mpi properly (and avoiding error-prone individual link operations)

    sudo apt-get install --reinstall openmpi-bin
    

    (the package owning mpicc.openmpi). This apparently fixed everything. So far it is working fine.


    "Historical" note: I had found that (strangely) mpicc.openmpi was not in update-alternatives, as opposed to the other 3 link groups

    $ update-alternatives --list mpirun
    /usr/bin/mpirun.mpich
    /usr/bin/mpirun.openmpi
    $ update-alternatives --list h5pcc
    /usr/bin/h5pcc.mpich
    /usr/bin/h5pcc.openmpi
    $ update-alternatives --list mpi-x86_64-linux-gnu
    /usr/include/x86_64-linux-gnu/mpich
    /usr/lib/x86_64-linux-gnu/openmpi/include
    $ update-alternatives --list mpi
    /usr/bin/mpicc.mpich
    

    even if it was installed in my system

    $ ll /usr/bin/mpicc*
    lrwxrwxrwx 1 root root  21 Feb 25 18:54 /usr/bin/mpicc -> /etc/alternatives/mpi
    -rwxr-xr-x 1 root root 11K Mar 22  2020 /usr/bin/mpicc.mpich
    lrwxrwxrwx 1 root root  12 Apr 15  2020 /usr/bin/mpicc.openmpi -> opal_wrapper
    

    Why would it not be in the first place? I still don't know.

    I decided to go with the reinstall, since handling the link group manually might have been a mess

    $ update-alternatives --query mpi
    Name: mpi
    Link: /usr/bin/mpicc
    Slaves:
     mpiCC /usr/bin/mpiCC
     mpiCC.1.gz /usr/share/man/man1/mpiCC.1.gz
     mpic++ /usr/bin/mpic++
     mpic++.1.gz /usr/share/man/man1/mpic++.1.gz
     mpicc.1.gz /usr/share/man/man1/mpicc.1.gz
     mpicxx /usr/bin/mpicxx
     mpicxx.1.gz /usr/share/man/man1/mpicxx.1.gz
     mpif77 /usr/bin/mpif77
     mpif77.1.gz /usr/share/man/man1/mpif77.1.gz
     mpif90 /usr/bin/mpif90
     mpif90.1.gz /usr/share/man/man1/mpif90.1.gz
     mpifort /usr/bin/mpifort
     mpifort.1.gz /usr/share/man/man1/mpifort.1.gz
    Status: auto
    Best: /usr/bin/mpicc.mpich
    Value: /usr/bin/mpicc.mpich
    
    Alternative: /usr/bin/mpicc.mpich
    Priority: 40
    Slaves:
     mpiCC /usr/bin/mpicxx.mpich
     mpiCC.1.gz /usr/share/man/man1/mpicxx.mpich.1.gz
     mpic++ /usr/bin/mpicxx.mpich
     mpic++.1.gz /usr/share/man/man1/mpicxx.mpich.1.gz
     mpicc.1.gz /usr/share/man/man1/mpicc.mpich.1.gz
     mpicxx /usr/bin/mpicxx.mpich
     mpicxx.1.gz /usr/share/man/man1/mpicxx.mpich.1.gz
     mpif77 /usr/bin/mpifort.mpich
     mpif77.1.gz /usr/share/man/man1/mpif77.mpich.1.gz
     mpif90 /usr/bin/mpifort.mpich
     mpif90.1.gz /usr/share/man/man1/mpif90.mpich.1.gz
     mpifort /usr/bin/mpifort.mpich
     mpifort.1.gz /usr/share/man/man1/mpifort.mpich.1.gz