all: vector-mem.O0 vector-mem.O1 vector-mem.O2 vector-mem.O3  \
     vector-avx vector-avx2 vector-avx512vl


vector-mem.O0: vector-mem.cc
	g++ -fPIC -O0 -o vector-mem.O0 vector-mem.cc
vector-mem.O1: vector-mem.cc
	g++ -fPIC -O1 -o vector-mem.O1 vector-mem.cc
vector-mem.O2: vector-mem.cc
	g++ -fPIC -O2 -o vector-mem.O2 vector-mem.cc
vector-mem.O3: vector-mem.cc
	g++ -fPIC -O3 -o vector-mem.O3 vector-mem.cc

vector-avx: vector-mem.cc
	g++ -fPIC -mavx -fopt-info-vec -O3 -o vector-avx vector-mem.cc

vector-avx2: vector-mem.cc
	g++ -fPIC -mavx2 -fopt-info-vec -O3 -o vector-avx2 vector-mem.cc

vector-avx512vl: vector-mem.cc
	g++ -fPIC -mavx512vl -fopt-info-vec -O3 -o vector-avx512vl vector-mem.cc

run: vector-mem.O0 vector-mem.O1 vector-mem.O2 vector-mem.O3 \
      vector-avx vector-avx2 vector-avx512vl
	@echo Running -O0 version
	(time ./vector-mem.O0)
	@echo; echo
	@echo Running -O1 version
	(time ./vector-mem.O1)
	@echo; echo
	@echo Running -O2 version
	(time ./vector-mem.O2)
	@echo; echo
	@echo Running -O3 version
	(time ./vector-mem.O3)
	@echo; echo
	@echo Running avx version
	(time ./vector-avx)
	@echo; echo
	@echo Running avx2 version
	(time ./vector-avx2)
	@echo; echo
	@echo Running avx512vl version
	(time ./vector-avx512vl)


clean: 
	rm -f vector-mem.O0 vector-mem.O1 vector-mem.O2 vector-mem.O3 \
            vector-avx vector-avx2 vector-avx512vl
