GCC = gfortran oneAPI = ifx # These flags will be looped over to generate different datasets FLAGS := O0 O1 O2 O3 Ofast # Also specify a default (note the conditional assignment operation, ?=) OPTFLAGS ?= O3 # For the parallel runs, use all available processors NPROC := $(shell nproc) MAGENTA := \033[1;35m RESET := \033[0m S_START:= 100 S_END := 300 S_STEP := 100 L_END := 800 L_STEP := 500 all: @mkdir -p bin/ @echo "$(MAGENTA)Compiling serial and parallel binaries with $(OPTFLAGS)$(RESET)" $(GCC) matrixproduct.f90 -o bin/$(GCC).serial.out -$(OPTFLAGS) -fexternal-blas -lopenblas -march=native $(oneAPI) matrixproduct.f90 -o bin/$(oneAPI).serial.out -qmkl=sequential -$(OPTFLAGS) -heap-arrays -xHost $(GCC) matrixproduct.f90 -o bin/$(GCC).parallel.out -$(OPTFLAGS) -fexternal-blas -lopenblas -march=native -fopenmp $(oneAPI) matrixproduct.f90 -o bin/$(oneAPI).parallel.out -qmkl=parallel -$(OPTFLAGS) -heap-arrays -xHost -fopenmp tests: clean @mkdir -p results/ @for opt in $(FLAGS); do \ $(MAKE) all OPTFLAGS=$$opt; \ echo "$(MAGENTA)Running serial runs with $$opt$(RESET)"; \ $(MAKE) serial OPTFLAGS=$$opt; \ echo "$(MAGENTA)Running parallel runs with $$opt$(RESET)"; \ $(MAKE) parallel OPTFLAGS=$$opt; \ done serial: ./bin/gfortran.serial.out ./bin/ifx.serial.out export OMP_NUM_THREADS=1 && \ export MKL_NUM_THREADS=1 && \ ./bin/$(GCC).serial.out $(S_START) $(S_END) $(S_STEP) yes | tee results/$(GCC)_short_serial_$(OPTFLAGS).out; \ ./bin/$(oneAPI).serial.out $(S_START) $(S_END) $(S_STEP) yes | tee results/$(oneAPI)_short_serial_$(OPTFLAGS).out; \ ./bin/$(GCC).serial.out $(S_END) $(L_END) $(L_STEP) no | tee results/$(GCC)_long_serial_$(OPTFLAGS).out; \ ./bin/$(oneAPI).serial.out $(S_END) $(L_END) $(L_STEP) no | tee results/$(oneAPI)_long_serial_$(OPTFLAGS).out; parallel: ./bin/gfortran.parallel.out ./bin/ifx.parallel.out export OMP_NUM_THREADS=${NPROC} && \ export MKL_NUM_THREADS=${NPROC} && \ ./bin/$(GCC).parallel.out $(S_START) $(S_END) $(S_STEP) yes | tee results/$(GCC)_short_parallel_$(OPTFLAGS)_$(NPROC).out; \ ./bin/$(oneAPI).parallel.out $(S_START) $(S_END) $(S_STEP) yes | tee results/$(oneAPI)_short_parallel_$(OPTFLAGS)_$(NPROC).out; \ ./bin/$(GCC).parallel.out $(S_END) $(L_END) $(L_STEP) no | tee results/$(GCC)_long_parallel_$(OPTFLAGS)_$(NPROC).out; \ ./bin/$(oneAPI).parallel.out $(S_END) $(L_END) $(L_STEP) no | tee results/$(oneAPI)_long_parallel_$(OPTFLAGS)_$(NPROC).out; plots: gnuplot -p plots.gnu clean: @echo "$(MAGENTA)Cleaning bin/ and results/$(RESET)" @rm -rf bin/ @rm -rf results/