Skip to content

Commit

Permalink
Compiles and runs, but ends up in segmentation fault; static linking …
Browse files Browse the repository at this point in the history
…for mkl has to be fixed
  • Loading branch information
spollok committed Jan 30, 2025
1 parent f495f5e commit abb7fab
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 77 deletions.
97 changes: 64 additions & 33 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,47 +8,78 @@ CPP = icx
USE_CUDA = 1
USE_CVODE = 0
USE_MATLAB = 1
COMPILE_MICROMAG = 1
USE_MICROMAG = 1

CVODE_ROOT= /usr/local/sundials-4.1.0/instdir
CVODE_ROOT = /usr/local/sundials-4.1.0/instdir
# MATLAB_INCLUDE = /usr/local/MATLAB/R2023b/extern/include # Linux
MATLAB_INCLUDE = "C:\Program Files\MATLAB\R2023b\extern\include" # Win
MKL_ROOT = ${CONDA_PREFIX} # Linux - mkl
# MKL_ROOT = "C:\Program Files (x86)\Intel\oneAPI\mkl\latest" # Win - mkl (oneapi)
# MKL_ROOT = ${CONDA_PREFIX}/Library # Win - mkl (conda)

ifeq (${FC}, ifort)
ifeq (${FC}, ifx)
ifeq ($(OS),Windows_NT)
FFLAGS = /O3 /fpp /real-size:64 /assume:nocc_omp /Qopenmp \
/fpe:0 /fp:source /libs:static /DUSE_CVODE=${USE_CVODE} \
/DUSE_CUDA=${USE_CUDA} /DUSE_MATLAB=${USE_MATLAB}
FFLAGS = /O3 /fpp /real-size:64 /Qopenmp /assume:nocc_omp \
/fpe:0 /fp:source /nologo /libs:static /DUSE_CVODE=${USE_CVODE} \
/DUSE_MATLAB=${USE_MATLAB} /DUSE_MICROMAG=${USE_MICROMAG}

LIB_SUFFIX = .lib
else
FFLAGS = -O3 -fpp -real-size 64 -assume nocc_omp -qopenmp \
-fpe0 -fp-model=source -fpic -DUSE_CVODE=${USE_CVODE} \
-DUSE_CUDA=${USE_CUDA} -DUSE_MATLAB=${USE_MATLAB}
-fpe0 -fp-model=source -fpic -nologo -DUSE_CVODE=${USE_CVODE} \
-DUSE_MATLAB=${USE_MATLAB} -DUSE_MICROMAG=${USE_MICROMAG}

LIB_SUFFIX = .a
endif
else ifeq (${FC}, gfortran)
FFLAGS = -O3 -fdefault-real-8 -fopenmp -ffree-line-length-512 -cpp -fPIC -DUSE_CVODE=${USE_CVODE}
USE_CUDA = 0
COMPILE_MICROMAG= 0
FFLAGS = -O3 -fdefault-real-8 -fopenmp -ffree-line-length-512 -cpp -fPIC \
-DUSE_CVODE=${USE_CVODE} -DUSE_MICROMAG=0 -DUSE_CVODE=${USE_CVODE}
endif

ifeq ($(USE_CUDA),0)
COMPILE_CUDA =
NUM_INT_PATH = source/NumericalIntegration/NumericalIntegration
TILE_DEMAG_TENSOR_PATH = source/TileDemagTensor/TileDemagTensor
DEMAG_FIELD_PATH = source/DemagField/DemagField
MICROMAG_PATH = source/MagTenseMicroMag
FORTRAN_CUDA_PATH = source/MagTenseFortranCuda/cuda
STANDALONE_PATH = source/MagTense_StandAlone/MagTense_StandAlone
FORCEINTEGRATOR_PATH = source/MagneticForceIntegrator/MagneticForceIntegrator

ifeq ($(USE_MICROMAG),0)
MICROMAG =
ifeq ($(OS),Windows_NT)
CP_LIB = cp ${DEMAG_FIELD_PATH}/libDemagField${LIB_SUFFIX} .
else
CP_LIB = cp ${NUM_INT_PATH}/libNumericalIntegration${LIB_SUFFIX} .
CP_LIB += && cp ${TILE_DEMAG_TENSOR_PATH}/libTileDemagTensor${LIB_SUFFIX} .
CP_LIB += && cp ${DEMAG_FIELD_PATH}/libDemagField${LIB_SUFFIX} .
endif
else
COMPILE_CUDA = cuda
MICROMAG = micromagnetism
ifeq ($(OS),Windows_NT)
LIB_OPT = -llibMagTenseMicroMag
CP_LIB = cp ${MICROMAG_PATH}/libMagTenseMicroMag${LIB_SUFFIX} .

else
LIB_OPT += -lMagTenseMicroMag
CP_LIB = cp ${NUM_INT_PATH}/libNumericalIntegration${LIB_SUFFIX} .
CP_LIB += && cp ${TILE_DEMAG_TENSOR_PATH}/libTileDemagTensor${LIB_SUFFIX} .
CP_LIB += && cp ${DEMAG_FIELD_PATH}/libDemagField${LIB_SUFFIX} .
CP_LIB += && cp ${MICROMAG_PATH}/libMagTenseMicroMag${LIB_SUFFIX} .
endif
endif

ifeq ($(USE_MATLAB),0)
FORCEINTEGRATOR =
else
FORCEINTEGRATOR = forceintegrator
CP_LIB += && cp ${FORCEINTEGRATOR_PATH}/libMagneticForceIntegrator${LIB_SUFFIX} .
endif

ifeq ($(COMPILE_MICROMAG),0)
MICROMAG =
ifeq ($(USE_CUDA),0)
COMPILE_CUDA =
else
MICROMAG = micromagnetism
COMPILE_CUDA = cuda
CP_LIB += && cp ${FORTRAN_CUDA_PATH}/libCuda${LIB_SUFFIX} .
endif
#=======================================================================
# Targets
Expand All @@ -58,30 +89,30 @@ endif
all: magnetostatic ${MICROMAG} ${COMPILE_CUDA} ${FORCEINTEGRATOR} # standalone

magnetostatic:
cd source/NumericalIntegration/NumericalIntegration && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE)
cd source/TileDemagTensor/TileDemagTensor && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE)
cd source/DemagField/DemagField && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE)
cd ${NUM_INT_PATH} && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE)
cd ${TILE_DEMAG_TENSOR_PATH} && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE)
cd ${DEMAG_FIELD_PATH} && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE)

micromagnetism:
cd source/MagTenseMicroMag && $(MAKE) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) MKL_ROOT=$(MKL_ROOT)
cd ${MICROMAG_PATH} && $(MAKE) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE)

cuda:
cd source/MagTenseFortranCuda/cuda && $(MAKE) CPP=$(CPP)
cd ${FORTRAN_CUDA_PATH} && $(MAKE) CPP=$(CPP)

forceintegrator:
cd source/MagneticForceIntegrator/MagneticForceIntegrator && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" MATLAB_INCLUDE=$(MATLAB_INCLUDE)
cd $(FORCEINTEGRATOR_PATH) && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" MATLAB_INCLUDE=$(MATLAB_INCLUDE)

standalone:
cd source/MagTense_StandAlone/MagTense_StandAlone && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)"
cd $(STANDALONE_PATH) && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)"
mkdir build
cp source/MagTense_StandAlone/MagTense_StandAlone/MagTense.x build/MagTense.x
cp $(STANDALONE_PATH)/MagTense.x build/MagTense.x

clean:
cd source/NumericalIntegration/NumericalIntegration && make clean
cd source/TileDemagTensor/TileDemagTensor && make clean
cd source/DemagField/DemagField && make clean
cd source/MagTenseMicroMag && make clean
cd source/MagTenseFortranCuda/cuda && make clean
cd source/MagTense_StandAlone/MagTense_StandAlone && make clean
cd source/MagneticForceIntegrator/MagneticForceIntegrator && make clean
rm -r build/
cd ${NUM_INT_PATH} && make clean
cd ${TILE_DEMAG_TENSOR_PATH} && make clean
cd ${DEMAG_FIELD_PATH} && make clean
cd ${MICROMAG_PATH} && make clean
cd ${FORTRAN_CUDA_PATH} && make clean
cd $(STANDALONE_PATH) && make clean
cd $(FORCEINTEGRATOR_PATH) && make clean
rm *${LIB_SUFFIX}
32 changes: 10 additions & 22 deletions matlab/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ If you want to compile MagTense with a Visual Studio project file for Windows, [

[ Linux ] `/usr/local/sundials-4.1.0/instdir`

A guide for custom installation of sundials-4.1.0 from this repository can be found [here].(#install-cvode-from-sundials-4.1.0)
A guide for custom installation of sundials-4.1.0 from this repository can be found [here](#install-cvode-from-sundials-4.1.0).

**Note:** Shared libraries for Fortran modules are not distributed in conda package of [sundials](https://anaconda.org/conda-forge/sundials). CVODE has to be built beforehand locally when linked dynamically. During runtime, path has to be added to LD_LIBRARY_PATH on Linux.

### Compilation

Prepare your terminal, so that ifort compiler can be found:
Prepare your terminal, so that ifx compiler can be found:

- [ Windows]

Expand All @@ -60,12 +60,12 @@ Set flags and paths in [Makefile](https://github.com/cmt-dtu-energy/MagTense/blo

```bash
cd path/to/MagTense/
make USE_CUDA=1 USE_CVODE=1 USE_MATLAB=1 CVODE_ROOT=/usr/local/sundials-4.1.0/instdir MATLAB_INCLUDE=/usr/local/MATLAB/R2021b/extern/include MKL_ROOT=/opt/intel/oneapi/mkl/latest
make USE_CUDA=1 USE_CVODE=1 USE_MATLAB=1 CVODE_ROOT=/usr/local/sundials-4.1.0/instdir MATLAB_INCLUDE=/usr/local/MATLAB/R2023b/extern/include MKL_ROOT=/opt/intel/oneapi/mkl/latest
```

## Building MEX-files

Prepare your terminal, so that ifort compiler can be found:
Prepare your terminal, so that `ifx` compiler can be found:

- [ Windows]

Expand All @@ -81,27 +81,16 @@ Prepare your terminal, so that ifort compiler can be found:
. /opt/intel/oneapi/setvars.sh
```

For static linking of MKL, the file `mex_FORTRAN_glnxa64.xml` located in `/home/<user>/.matlab/R2021b/` has to be adjusted as follows:

```bash
LINKLIBS="[...] -Wl,--start-group"
CMDLINE2="$LDF $LDFLAGS $LDTYPE $LINKOPTIM $LINKEXPORTVER $OBJS $FLIBS $LINKLIBS -Wl,--end-group -o $EXE"
```

The reason for that is that Matlab recognizes `-Wl,--end-group` as `Error: Illegal use of reserved keyword "end".`, when running the build script.


Start Matlab via command line and run build script:

```bash
cd path/to/MagTense/matlab
/usr/local/MATLAB/R2021b/bin/matlab -nodisplay -nosplash -nodesktop
run('buildMagTenseMEX.m')
/usr/local/MATLAB/R2023b/bin/matlab -nodisplay -nosplash -nodesktop
run('matlab/buildMagTenseMEX.m')
```

## Runtime

Prepare your terminal, so that ifort compiler and required libraries can be found:
Prepare your terminal, so that `ifx` compiler and required libraries can be found:

- [ Linux ]

Expand All @@ -110,14 +99,13 @@ Prepare your terminal, so that ifort compiler and required libraries can be foun
export LD_LIBRARY_PATH=<path_to_CVODE_libs>:<path_to_CUDA_libs>:$LD_LIBRARY_PATH
```

When MKL is statically linked, having [Runtime for Intel® Fortran Compiler](https://anaconda.org/intel/intel-fortran-rt) is sufficient and no installation of `ifort` or `mkl` is required.
When MKL is statically linked, having [Runtime for Intel® Fortran Compiler](https://anaconda.org/intel/intel-fortran-rt) is sufficient and no installation of `ifx` or `mkl` is required.

- Test with standard problem #3

```bash
cd path/to/MagTense/matlab/
/usr/local/MATLAB/R2021b/bin/matlab -nodisplay -nosplash -nodesktop
run('examples/Micromagnetism/mumag_micromag_Std_problem_3/Standard_problem_3.m')
/usr/local/MATLAB/R2023b/bin/matlab -nodisplay -nosplash -nodesktop
run('matlab/examples/Micromagnetism/mumag_micromag_Std_problem_3/Standard_problem_3.m')
```

## Install CVODE from sundials-4.1.0
Expand Down
23 changes: 12 additions & 11 deletions matlab/buildMagTenseMEX.m
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE)

arguments
USE_RELEASE {mustBeNumericOrLogical} = true;
USE_CUDA {mustBeNumericOrLogical} = true;
USE_CUDA {mustBeNumericOrLogical} = false;
USE_CVODE {mustBeNumericOrLogical} = true;
end

Expand All @@ -29,10 +29,10 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE)
else
VS_STUDIO = false;
MKL_STATIC = false;
compiler_root = '/opt/intel/oneapi/compiler/latest';
mkl_root = '/opt/intel/oneapi/mkl/latest';
mkl_lib = '/opt/intel/oneapi/mkl/latest/lib/intel64';
cuda_root = '/usr/local/cuda-12.3/lib64/';
compiler_root = '/home/spol/miniconda3/envs/magtense-env-py12';
mkl_root = '/home/spol/miniconda3/envs/magtense-env-py12';
mkl_lib = '/home/spol/miniconda3/envs/magtense-env-py12/lib';
cuda_root = '/home/spol/miniconda3/envs/magtense-env-py12/lib';
cvode_include = '/usr/local/sundials-4.1.0/instdir/fortran';
cvode_lib = '/usr/local/sundials-4.1.0/instdir/lib';
mex_suffix = 'a';
Expand Down Expand Up @@ -62,8 +62,9 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE)

if (USE_CVODE)
CVODE_include = join(['-I' cvode_include], '');
CVODE = ['-L' cvode_lib ' -lsundials_nvecserial -lsundials_sunmatrixdense -lsundials_sunlinsoldense' ...
' -lsundials_fnvecserial_mod -lsundials_cvode -lsundials_fsunnonlinsolfixedpoint_mod'];
CVODE = ['LINKLIBS="$LINKLIBS ' cvode_lib '/libsundials_nvecserial.a ' cvode_lib '/libsundials_sunmatrixdense.a ' ...
cvode_lib '/libsundials_sunlinsoldense.a ' cvode_lib '/libsundials_fnvecserial_mod.a ' ...
cvode_lib '/libsundials_cvode.a ' cvode_lib '/libsundials_fsunnonlinsolfixedpoint_mod.a"'];
else
CVODE_include = '';
CVODE = '';
Expand All @@ -82,7 +83,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE)

if (ispc)
DEFINES = '-R2018a';
FFLAGS = 'COMPFLAGS="$COMPFLAGS /free /O3 /fpp /real-size:64 /Qopenmp /assume:nocc_omp /fpe:0 /fp:source"';
FFLAGS = 'COMPFLAGS="$COMPFLAGS /free /O3 /fpp /real-size:64 /Qopenmp /assume:nocc_omp /fpe:0 /fp:source /nologo"';
if (USE_CUDA)
FFLAGS = [FFLAGS(1:(end-1)) ' /libs:static"'];
end
Expand All @@ -98,7 +99,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE)
MKL = ['-L' mkl_lib ' -lmkl_rt -lmkl_blas95_lp64'];
end
else
DEFINES = ['FC="' compiler_root '/bin/ifort" DEFINES="-DMATLAB_DEFAULT_RELEASE=R2018a"'];
DEFINES = ['FC="' compiler_root '/bin/ifx" DEFINES="-DMATLAB_DEFAULT_RELEASE=R2018a"'];
INCLUDE = ['INCLUDE="$INCLUDE -I' mkl_root '/include -I' NumericalIntegration_path ' -I' DemagField_path ...
' -I' TileDemagTensor_path ' -I' MagTenseMicroMag_path ' -I' ForceIntegrator_path ' -I' mkl_root];
LIBS = ['-L' MagTenseMicroMag_path ' -lMagTenseMicroMag -L' DemagField_path ' -lDemagField -L' ...
Expand All @@ -110,7 +111,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE)
'/libmkl_core.a ' mkl_lib '/libmkl_blas95_lp64.a ' mkl_lib '/libmkl_intel_lp64.a"'];
INCLUDE = [INCLUDE '/include/intel64/lp64 '];
else
MKL = ['-L' mkl_root '/lib/intel64 -lmkl_rt -lpthread -lm -ldl '];
MKL = ['-L' mkl_lib ' -lmkl_rt -lpthread -lm -ldl '];
if (USE_CUDA)
INCLUDE = [INCLUDE '/include/intel64/lp64 '];
MKL = [MKL '-lmkl_blas95_lp64'];
Expand All @@ -121,7 +122,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE)
end
end
INCLUDE = [INCLUDE CVODE_include '"'];
FFLAGS = [FFLAGS '-O3 -fpp -real-size 64 -qopenmp -assume nocc_omp -fpe0 -fp-model=source -fpic -diag-disable 10006"'];
FFLAGS = [FFLAGS '-O3 -fpp -real-size 64 -qopenmp -assume nocc_omp -fpe0 -fp-model=source -fpic -nologo -diag-disable 10006"'];
end

%%------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ For MacOS ARM architectures, currently only magnetostatics with the `gfortran` c
conda create -y -n magtense-env
conda activate magtense-env
conda config --env --add channels conda-forge
conda install -y python
conda config --env --add channels nvidia/label/cuda-12.6.3
conda config --env --add channels https://software.repos.intel.com/python/conda/
conda install -y python
conda install -y numpy matplotlib meson charset-normalizer ncurses git notebook h5py tqdm
```

Expand Down
11 changes: 1 addition & 10 deletions python/src/magtense/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,6 @@ ifeq ($(USE_MKL),0)
MKL =
endif

ifeq (${USE_CVODE},0)
CVODE =
CVODE_OPT =
else
CVODE = -L${CVODE_ROOT}/lib -lsundials_nvecserial -lsundials_sunmatrixdense \
-lsundials_sunlinsoldense -lsundials_fnvecserial_mod -lsundials_cvode \
-lsundials_fsunnonlinsolfixedpoint_mod
CVODE_OPT = -I${CVODE_ROOT}/fortran
endif

ifeq ($(USE_MICROMAG),0)
MICROMAG =
Expand Down Expand Up @@ -191,7 +182,7 @@ clean_build:
${CLEAN_FOLDER}

magnetostatic:
cd ${NUM_INT_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}' CVODE_OPT=${CVODE_OPT} USE_MATLAB=0
cd ${NUM_INT_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}' USE_CVODE=${USE_CVODE} CVODE_ROOT=${CVODE_ROOT} USE_MATLAB=0
cd ${TILE_DEMAG_TENSOR_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}'
cd ${DEMAG_FIELD_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}' USE_MATLAB=0

Expand Down

0 comments on commit abb7fab

Please sign in to comment.