0

I have a problem when trying to compile a code in C++. I installed the Intel Parallel Studio XE Cluster Edition 2020 but when i try to compile i have the following error : "mpiicpc: Command not found".

When i run the command icpc -v i get the following result "icc version 19.1.3.304 (gcc version 7.5.0 compatibility)" so i thought my installation was correct.

What i don't understand is that when i just type mpiicpc in the terminal it gives me a list of options that i can include with this command so i don't understand why i have this error during my compilation.

Thank you in advance for you help.

Here is the makefile i use (it comes from lammps and all my colleagues working on same machines as mine are able to compile it without problem so i don't think the problem is in the makefile but who knows)

# intel_cpu_intelmpi = USER-INTEL package, Intel MPI, MKL FFT

SHELL = /bin/sh

# ---------------------------------------------------------------------
# compiler/linker settings
# specify flags and libraries needed for your compiler

CC =        mpiicpc -std=c++11
OPTFLAGS =      -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits \
                -qopt-zmm-usage=high
CCFLAGS =   -qopenmp -qno-offload -ansi-alias -restrict \
                -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) \
                -I$(MKLROOT)/include
SHFLAGS =   -fPIC
DEPFLAGS =  -M

LINK =      mpiicpc -std=c++11
LINKFLAGS = -qopenmp $(OPTFLAGS) -L$(MKLROOT)/lib/intel64/
LIB =           -ltbbmalloc -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core   
SIZE =      size

ARCHIVE =   ar
ARFLAGS =   -rc
SHLIBFLAGS =    -shared

# ---------------------------------------------------------------------
# LAMMPS-specific settings, all OPTIONAL
# specify settings for LAMMPS features you will use
# if you change any -D setting, do full re-compile after "make clean"

# LAMMPS ifdef settings
# see possible settings in Section 3.5 of the manual

LMP_INC =   -DLAMMPS_GZIP

# MPI library
# see discussion in Section 3.4 of the manual
# MPI wrapper compiler/linker can provide this info
# can point to dummy MPI library in src/STUBS as in Makefile.serial
# use -D MPICH and OMPI settings in INC to avoid C++ lib conflicts
# INC = path for mpi.h, MPI compiler settings
# PATH = path for MPI library
# LIB = name of MPI library

MPI_INC =       -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1
MPI_PATH = 
MPI_LIB =

# FFT library
# see discussion in Section 3.5.2 of manual
# can be left blank to use provided KISS FFT library
# INC = -DFFT setting, e.g. -DFFT_FFTW, FFT compiler settings
# PATH = path for FFT library
# LIB = name of FFT library

FFT_INC =       -DFFT_MKL -DFFT_SINGLE
FFT_PATH = 
FFT_LIB =

# JPEG and/or PNG library
# see discussion in Section 3.5.4 of manual
# only needed if -DLAMMPS_JPEG or -DLAMMPS_PNG listed with LMP_INC
# INC = path(s) for jpeglib.h and/or png.h
# PATH = path(s) for JPEG library and/or PNG library
# LIB = name(s) of JPEG library and/or PNG library

JPG_INC =
JPG_PATH =
JPG_LIB =

# ---------------------------------------------------------------------
# build rules and dependencies
# do not edit this section

include Makefile.package.settings
include Makefile.package

EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC)
EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH)
EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB)
EXTRA_CPP_DEPENDS = $(PKG_CPP_DEPENDS)
EXTRA_LINK_DEPENDS = $(PKG_LINK_DEPENDS)

# Path to src files

vpath %.cpp ..
vpath %.h ..

# Link target

$(EXE): main.o $(LMPLIB) $(EXTRA_LINK_DEPENDS)
    $(LINK) $(LINKFLAGS) main.o $(EXTRA_PATH) $(LMPLINK) $(EXTRA_LIB) $(LIB) -o $@
    $(SIZE) $@

# Library targets

$(ARLIB): $(OBJ) $(EXTRA_LINK_DEPENDS)
    @rm -f ../$(ARLIB)
    $(ARCHIVE) $(ARFLAGS) ../$(ARLIB) $(OBJ)
    @rm -f $(ARLIB)
    @ln -s ../$(ARLIB) $(ARLIB)

$(SHLIB): $(OBJ) $(EXTRA_LINK_DEPENDS)
    $(CC) $(CCFLAGS) $(SHFLAGS) $(SHLIBFLAGS) $(EXTRA_PATH) -o ../$(SHLIB) \
        $(OBJ) $(EXTRA_LIB) $(LIB)
    @rm -f $(SHLIB)
    @ln -s ../$(SHLIB) $(SHLIB)

# Compilation rules

%.o:%.cpp
    $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $<

# Individual dependencies

depend : fastdep.exe $(SRC)
    @./fastdep.exe $(EXTRA_INC) -- $^ > .depend || exit 1

fastdep.exe: ../DEPEND/fastdep.c
    cc -O -o $@ $<

sinclude .depend
```

 
  • do you compile via a `Makefile`? an `IDE`? in your terminal, you can `type mpiicpc` and double check this is **not** an alias but a real file. – Gilles Gouaillardet Dec 04 '20 at 00:37
  • I compile using a Makefile. And when i typed `type mpiicpc` it tells me that it's hashed so if i understood correctly, this is not an alias – Daoud El Kadiri Dec 04 '20 at 11:18
  • are you running `make` in the very same terminal where `mpiicpc` is found? are you tweaking `$PATH` in your `Makefile` ? – Gilles Gouaillardet Dec 04 '20 at 11:22
  • Sorry to bring this old question back but i still have the same problem. Yes i run the make in the same terminal where the mpiicpc command seems to work. And when i try to add the `$PATH` in the Makefile it seems to find the mpiicpc command but i have now `catastrophic error: cannot open source file "mpi.h"` – Daoud El Kadiri Jun 23 '21 at 10:31

1 Answers1

0

Looks like you have not initialized Intel MPI Library correctly. There is an initialization script called mpivars.sh that you may source, before compiling or running your application. This script is generally located in a path similar to the one shown below. Adjust the path in the command below and report if you are now able to succeed.

$ source /opt/intel/version/intel64/bin/mpivars.sh
Jeremy Caney
  • 7,102
  • 69
  • 48
  • 77
  • 1
    I already sourced the script as indicated in the Intel OneApi installation guide. this is what i put in my bashrc : `source /opt/intel/oneapi/setvars.sh`. If i didn't source the script i wouldn't be able to use the commands like `mpiicpc` in the terminal. The problem is only while using a makefile – Daoud El Kadiri Jun 24 '21 at 14:03
  • If you manually add the path to the bin folder of Intel MPI Library in your PATH environment variable, then running mpiicpc from anywhere in your system will work! This therefore is no guarantee that setvars.sh was sourced. SInce you confirm that you have sourced correctly, could you please share your Makefile? – Amar-Intel Jun 25 '21 at 15:26
  • I didn't add anything to the path manually. I tried again yesterday after a clean install of Ubuntu, doing nothing else besides installing intel OneApi through the script provided on the intel website and following the starting guide that follows the installation. But still get the same problem. I added the makefile to my initial question as i couldn't do it here – Daoud El Kadiri Jun 26 '21 at 17:44
  • What does the following command return? `ps -p $$` If this returns something apart from sh, then you have to set SHELL accordingly in your makefile. – Amar-Intel Jun 28 '21 at 07:13
  • If i put the above command in the makefile it returns me "sh" if i run the make command from a terminal where i am in sh, and it returns "bash" if i run the make command from a terminal where i am in bash. However i think that the Makefile is using sh because when i tried to add the `source /opt/intel/oneapi/setvars.sh` directly in the makefile, i got the error saying "source : command not found" (and the source command doesn't exist in sh) – Daoud El Kadiri Jun 29 '21 at 08:27
  • The thing is that when i display the $PATH from the makefile there is only : `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin`. So i tried to manually add all the directories to the path from inside the makefile and it solves the error of `mpiicpc : command not found` but i now get `catastrophic error: cannot open source file "mpi.h"`. It seems like when i run the makefile, it doesn't take into account the fact that i sourced the setvars.sh in my terminal before. – Daoud El Kadiri Jun 29 '21 at 08:37