netcdf-c icon indicating copy to clipboard operation
netcdf-c copied to clipboard

Test failure with new Intel compilers

Open cross85 opened this issue 2 years ago • 14 comments

I'm building the 4.9.2 version with new intel compiler icx. Specifically in nczarr_test in the run_ncgen4.sh test But if I use the icc compiler, it works ok. Is it any known bug or still not completely compatible with the new compilers?

I did a very simple build: export CC=icc ./configure --prefix=$path_netcdf/netcdf --disable-shared --with-pic --enable-largefile --disable-filter-testing --disable-dap --disable-netcdf4

cross85 avatar May 23 '23 17:05 cross85

We do not typically test against the Intel compilers; I'll take a look at icx and see if I can determine what is going on.

WardF avatar May 23 '23 22:05 WardF

`############################## Install NETCDF-C Library ############################

cd $WRF_FOLDER/Downloads tar -xzvf v4.9.2.tar.gz cd netcdf-c-4.9.2/

these variables need to be set for the NetCDF-C install to work

export CPPFLAGS=-I$DIR/grib2/include export LDFLAGS=-L$DIR/grib2/lib export LIBS="-lhdf5_hl -lhdf5 -lz -lcurl -lgfortran -lgcc -lm -ldl -lpnetcdf"

autoreconf -i

CC=$MPICC FC=$MPIFC CXX=$MPICXX F90=$MPIF90 F77=$MPIF77 CFLAGS=$CFLAGS ./configure --prefix=$DIR/NETCDF --disable-dap --enable-netcdf-4 --enable-netcdf4 --enable-shared --enable-pnetcdf --enable-cdf5 --enable-parallel-tests | tee netcdf.configure.log

make -j $CPU_HALF_EVEN 2>&1 | tee netcdf.make.log make -j $CPU_HALF_EVEN install 2>&1 | tee make.install.log | tee netcdf.makeinstall.log

other libraries below need these variables to be set

export PATH=$DIR/NETCDF/bin:$PATH export NETCDF=$DIR/NETCDF

echo " "`

This works for GNU but not intel

@WardF

HathewayWill avatar Jun 16 '23 00:06 HathewayWill

`############################## Install NETCDF-C Library ############################

cd $WRF_FOLDER/Downloads tar -xzvf v4.9.2.tar.gz cd netcdf-c-4.9.2/

these variables need to be set for the NetCDF-C install to work

export CPPFLAGS=-I$DIR/grib2/include export LDFLAGS=-L$DIR/grib2/lib export LIBS="-lhdf5_hl -lhdf5 -lz -lcurl -lgfortran -lgcc -lm -ldl -lpnetcdf"

autoreconf -i

CC=$MPICC FC=$MPIFC CXX=$MPICXX F90=$MPIF90 F77=$MPIF77 CFLAGS=$CFLAGS ./configure --prefix=$DIR/NETCDF --disable-dap --enable-netcdf-4 --enable-netcdf4 --enable-shared --enable-pnetcdf --enable-cdf5 --enable-parallel-tests | tee netcdf.configure.log

make -j $CPU_HALF_EVEN 2>&1 | tee netcdf.make.log make -j $CPU_HALF_EVEN install 2>&1 | tee make.install.log | tee netcdf.makeinstall.log

other libraries below need these variables to be set

export PATH=$DIR/NETCDF/bin:$PATH export NETCDF=$DIR/NETCDF

echo " "`

This works for GNU but not intel

@WardF

config.log netcdf.configure.log

HathewayWill avatar Jun 16 '23 01:06 HathewayWill

@WardF @cross85 @edwardhartnett

So I found a solution for NETCDF-C(4.9.2) annd NETCDF-Fortran (4.6.0)

  cd $WRF_FOLDER/Downloads
  tar -xzvf v4.9.2.tar.gz
  cd netcdf-c-4.9.2/
  autoreconf -i -f 2>&1 | tee autoreconf.log

  # these variables need to be set for the NetCDF-C install to work
  export CPPFLAGS=-I$DIR/grib2/include
  export LDFLAGS=-L$DIR/grib2/lib
  export LIBS="-lhdf5_hl -lhdf5 -lz -lcurl -lgcc -lm -ldl -lpnetcdf"

  CC=$MPICC FC=$MPIFC CXX=$MPICXX F90=$MPIF90 F77=$MPIF77 CFLAGS=$CFLAGS  ./configure --prefix=$DIR/NETCDF --disable-dap --enable-netcdf-4 --enable-netcdf4 --enable-shared --enable-pnetcdf --enable-cdf5 --enable-parallel-tests 2>&1 | tee configure.log
  automake -a -f 2>&1 | tee automake.log
  make -j $CPU_HALF_EVEN 2>&1 | tee make.log
  make -j $CPU_HALF_EVEN install 2>&1 | tee make.install.log

  # other libraries below need these variables to be set
  export PATH=$DIR/NETCDF/bin:$PATH
  export NETCDF=$DIR/NETCDF

  echo " "
  ############################## NetCDF-Fortran library ############################

  cd $WRF_FOLDER/Downloads
  tar -xvzf v4.6.0.tar.gz
  cd netcdf-fortran-4.6.0/
  autoreconf -i -f 2>&1 | tee autoreconf.log

  # these variables need to be set for the NetCDF-Fortran install to work
  export LD_LIBRARY_PATH=$DIR/NETCDF/lib:$LD_LIBRARY_PATH
  export CPPFLAGS="-I$DIR/NETCDF/include -I$DIR/grib2/include"
  export LDFLAGS="-L$DIR/NETCDF/lib -L$DIR/grib2/lib"
  export LIBS="-lnetcdf -lpnetcdf -lcurl -lhdf5_hl -lhdf5 -lz -lm -ldl"
  CC=$MPICC FC=$MPIFC CXX=$MPICXX F90=$MPIF90 F77=$MPIF77 CFLAGS=$CFLAGS  ./configure --prefix=$DIR/NETCDF --enable-netcdf-4 --enable-netcdf4 --enable-parallel-tests --enable-hdf5 2>&1 | tee configure.log
  automake -a -f 2>&1 | tee automake.log
  make -j $CPU_HALF_EVEN 2>&1 | tee make.log
  make  -j $CPU_HALF_EVEN install 2>&1 | tee make.install.log


  echo " "
  export CC=icx
  export CXX=icpx
  export FC=ifx
  export F77=ifx
  export F90=ifx
  export MPIFC='mpiifort -fc=ifx'
  export MPIF77='mpiifort -fc=ifx'
  export MPIF90='mpiifort -fc=ifx'
  export MPICC='mpiicc -cc=icx'
  export MPICXX='mpiicpc -cxx=icpx'
  export CFLAGS="-fPIC -fPIE -O3 -Wno-implicit-function-declaration -Wno-absolute-value -Wno-incompatible-function-pointer-types -Wno-unknown-warning-option -Wno-unused-command-line-argument "
  export FFLAGS="-m64"
  export FCFLAGS="-m64"

Relevant Log Files: NETCDF-C make.log config.log automake.log configure.log autoreconf.log make.install.log

NETCDF-Fortran: make.log config.log automake.log configure.log autoreconf.log make.install.log

Hope This helps.

HathewayWill avatar Jul 02 '23 02:07 HathewayWill

Building with icx seems to work, but 'make check' runs into failures with infinities and NaNs. From tst_netcdf4.log:

*** Testing NaN
*** creating NaN test file tst_nans.nc...ok.
*** Tests successful!
6,7c6,7
<               fvar:_FillValue = nanf ;
<               fvar:att = -inff, nanf, inff ;
---
>               fvar:_FillValue = NaNf ;
>               fvar:att = -Infinityf, NaNf, Infinityf ;
9,10c9,10
<               dvar:_FillValue = nan ;
<               dvar:att = -inf, nan, inf ;
---
>               dvar:_FillValue = NaN ;
>               dvar:att = -Infinity, NaN, Infinity ;
13c13
<  fvar = -inf, _, _ ;
---
>  fvar = -Infinityf, _, Infinityf ;
15c15
<  dvar = -inf, _, _ ;
---
>  dvar = -Infinity, _, Infinity ;
FAIL tst_netcdf4.sh (exit status: 1)

Intel(R) oneAPI DPC++/C++ Compiler 2023.2.3 (2023.2.3.20231204) netcdf-c at tag v4.9.2

MicroTed avatar Mar 05 '24 19:03 MicroTed

So this error will take some thought of how to approach, as it appears to reflect a compiler-specific representation rather than an error in the code. Thank you for the updated report!

WardF avatar Mar 05 '24 19:03 WardF

I was wrong. The decision to print "Infinity" or "NaN" is made by the code in ncdump in the function pr_att_algs (and probably elsewhere in ncdump). The relevant code looks roughly like this:

if(isnan(ff))
    printf("NaN");
else if(isinf(ff))
   printf("Infinity");

So my current hypothesis is that isnan() and isinf() are not working right so the print in ncdump defaults to (roughly)

printf("%lf",ff);

Again, a simple program could test this.

It looks like printf() for icx is handling NaN and Infinity in a different way than other compilers. That is:

for icx: printf("%f",(float)nan) produces "nanf" for e.g. gcc: printf("%f",(float)nan) produces "NaNf"

You easily create a program to test this. There is probably something somewhere in the C language standard about this. I suspect that icx is wrong.

DennisHeimbigner avatar Mar 05 '24 20:03 DennisHeimbigner

Building with icx seems to work, but 'make check' runs into failures with infinities and NaNs. From tst_netcdf4.log:

*** Testing NaN
*** creating NaN test file tst_nans.nc...ok.
*** Tests successful!
6,7c6,7
<               fvar:_FillValue = nanf ;
<               fvar:att = -inff, nanf, inff ;
---
>               fvar:_FillValue = NaNf ;
>               fvar:att = -Infinityf, NaNf, Infinityf ;
9,10c9,10
<               dvar:_FillValue = nan ;
<               dvar:att = -inf, nan, inf ;
---
>               dvar:_FillValue = NaN ;
>               dvar:att = -Infinity, NaN, Infinity ;
13c13
<  fvar = -inf, _, _ ;
---
>  fvar = -Infinityf, _, Infinityf ;
15c15
<  dvar = -inf, _, _ ;
---
>  dvar = -Infinity, _, Infinity ;
FAIL tst_netcdf4.sh (exit status: 1)

Intel(R) oneAPI DPC++/C++ Compiler 2023.2.3 (2023.2.3.20231204) netcdf-c at tag v4.9.2

I've just tried -fhonor-infinities compiler flag and I've passed all the tests. I'm not 100% sure if it's a great solution. I'm using version 2024.1.0. This flag has following description: "Specify that floating-point optimizations are not allowed that assume arguments and results are not +-inf."

baneta avatar Apr 16 '24 20:04 baneta

Did you try the test program I suggested to see what isinf() and isnan() are doing?

DennisHeimbigner avatar Apr 16 '24 21:04 DennisHeimbigner

Thank you for the efforts. I've encountered this issue in make check just now. We're porting into a new machine. Currently, it seems -fhonor-infinities as suggested by @baneta passes the tests. I wonder about the implications for this. I'm no expert, but looking forward to its resolution.

acgvar avatar Apr 17 '24 04:04 acgvar

Building with icx seems to work, but 'make check' runs into failures with infinities and NaNs. From tst_netcdf4.log:

*** Testing NaN
*** creating NaN test file tst_nans.nc...ok.
*** Tests successful!
6,7c6,7
<               fvar:_FillValue = nanf ;
<               fvar:att = -inff, nanf, inff ;
---
>               fvar:_FillValue = NaNf ;
>               fvar:att = -Infinityf, NaNf, Infinityf ;
9,10c9,10
<               dvar:_FillValue = nan ;
<               dvar:att = -inf, nan, inf ;
---
>               dvar:_FillValue = NaN ;
>               dvar:att = -Infinity, NaN, Infinity ;
13c13
<  fvar = -inf, _, _ ;
---
>  fvar = -Infinityf, _, Infinityf ;
15c15
<  dvar = -inf, _, _ ;
---
>  dvar = -Infinity, _, Infinity ;
FAIL tst_netcdf4.sh (exit status: 1)

Intel(R) oneAPI DPC++/C++ Compiler 2023.2.3 (2023.2.3.20231204) netcdf-c at tag v4.9.2

I've just tried -fhonor-infinities compiler flag and I've passed all the tests. I'm not 100% sure if it's a great solution. I'm using version 2024.1.0. This flag has following description: "Specify that floating-point optimizations are not allowed that assume arguments and results are not +-inf."

seems more like a bandaid then a fix for the issue. Because it is supressing a warning right?

HathewayWill avatar Apr 17 '24 14:04 HathewayWill

The failure being reported in the test appears to be a difference in infinity representation; thanks for reporting the flag -fhonor-inifinities; I'll need to dig more into this to see what's going on and the extent to which this is a potential issue vs. (my original assumption) a difference in compilers.

WardF avatar Apr 18 '24 20:04 WardF

After reading this: https://github.com/abseil/abseil-cpp/issues/1451 I was able to pass all "make check" tests by using the flag -fp-model=precise I hope this also helps.

Maduvi avatar May 10 '24 12:05 Maduvi

Thank you all; @Maduvi I appreciate the reference, I will see about adding a compiler check and setting the flag appropriately in our CMakeLists.txt file!

WardF avatar May 10 '24 16:05 WardF