EXE = demo
SOURCES = tutorial_example
QUEST_DIR = QuEST
COMPILER = gcc
COMPILER_TYPE = GNU
WINDOWS_ARCH = 32
MULTITHREADED = 0
DISTRIBUTED = 0
GPUACCELERATED = 0
GPU_COMPUTE_CAPABILITY = 30
SUPPRESS_WARNING = 0
PRECISION = 2
SILENT = 0
ifneq ($(MAKECMDGOALS), clean)
ifneq ($(MAKECMDGOALS), veryclean)
ifneq ($(SILENT), 1)
ifneq ($(COMPILER_TYPE), CLANG)
ifneq ($(COMPILER_TYPE), GNU)
ifneq ($(COMPILER_TYPE), INTEL)
ifneq ($(COMPILER_TYPE), MSVC)
$(error COMPILER_TYPE must be one of CLANG, GNU or INTEL)
endif
endif
endif
endif
ifeq ($(DISTRIBUTED), 1)
ifeq ($(GPUACCELERATED), 1)
$(error Distributed GPU acceleration not supported)
endif
endif
ifeq ($(MULTITHREADED), 1)
ifeq ($(GPUACCELERATED), 1)
$(warning GPU acceleration makes no use of multithreading. Disabling the latter...)
override MULTITHREADED = 0
endif
endif
ifeq ($(MULTITHREADED), 1)
ifeq ($(COMPILER_TYPE), CLANG)
$(warning Clang does not support multithreading. Disabling...)
override MULTITHREADED = 0
endif
endif
ifneq ($(PRECISION), 1)
ifneq ($(PRECISION), 2)
ifneq ($(PRECISION), 4)
$(error PRECISION must be set to 1, 2 or 4)
endif
endif
endif
ifeq ($(PRECISION), 4)
ifeq ($(GPUACCELERATED), 1)
$(warning GPUs do not support quad precision. Setting PRECISION=2...)
override PRECISION = 2
endif
endif
ifeq ($(GPUACCELERATED), 1)
ifeq ($(COMPILER_TYPE), CLANG)
ifeq ($(SUPPRESS_WARNING), 0)
$(info Some versions of Clang are not NVIDIA-GPU compatible. If compilation fails, try Clang 3.7)
endif
endif
endif
ifeq ($(GPUACCELERATED), 1)
ifeq ($(COMPILER_TYPE), GNU)
ifeq ($(SUPPRESS_WARNING), 0)
$(info On some platforms (e.g. OSX), NVIDIA-GPUs are not compatible with GNU compilers. If compilation fails, try an alternative compiler, like Clang 3.7)
endif
endif
endif
ifeq ($(COMPILER_TYPE), MSVC)
ifneq ($(WINDOWS_ARCH), 32)
ifneq ($(WINDOWS_ARCH), 64)
$(error When compiling with MSVC, WINDOWS_ARCH must be 32 or 64)
endif
endif
endif
endif
endif
endif
ifeq ($(COMPILER_TYPE), MSVC)
LIBS =
else
LIBS = -lm
endif
QUEST_INCLUDE_DIR = ${QUEST_DIR}/include
QUEST_SRC_DIR = ${QUEST_DIR}/src
QUEST_COMMON_DIR = $(QUEST_SRC_DIR)
ifeq ($(GPUACCELERATED), 1)
QUEST_INNER_DIR = $(QUEST_SRC_DIR)/GPU
else
QUEST_INNER_DIR = $(QUEST_SRC_DIR)/CPU
endif
QUEST_INCLUDE = -I${QUEST_INCLUDE_DIR} -I$(QUEST_INNER_DIR) -I$(QUEST_COMMON_DIR)
CUDA_COMPILER = nvcc
MPI_COMPILER = mpicc
ifeq ($(MULTITHREADED), 1)
ifeq ($(COMPILER_TYPE), GNU)
THREAD_FLAGS = -fopenmp
else ifeq ($(COMPILER_TYPE), INTEL)
THREAD_FLAGS = -qopenmp
else ifeq ($(COMPILER_TYPE), MSVC)
THREAD_FLAGS = -openmp
endif
else
THREAD_FLAGS =
endif
ifeq ($(WINDOWS_ARCH), 32)
ARCH_FLAG = X86
else
ARCH_FLAG = X64
endif
C_CLANG_FLAGS = -O2 -std=c99 -mavx -Wall -DQuEST_PREC=$(PRECISION)
C_GNU_FLAGS = -O2 -std=c99 -mavx -Wall -DQuEST_PREC=$(PRECISION) $(THREAD_FLAGS)
C_INTEL_FLAGS = -O2 -std=c99 -fprotect-parens -Wall -xAVX -axCORE-AVX2 -diag-disable -cpu-dispatch -DQuEST_PREC=$(PRECISION) $(THREAD_FLAGS)
C_MSVC_FLAGS = -O2 -EHs -DQuEST_PREC=$(PRECISION) $(THREAD_FLAGS) -nologo -DDWIN$(WINDOWS_ARCH) -D_WINDOWS -Fo$@
CPP_CLANG_FLAGS = -O2 -std=c++11 -mavx -Wall -DQuEST_PREC=$(PRECISION)
CPP_GNU_FLAGS = -O2 -std=c++11 -mavx -Wall -DQuEST_PREC=$(PRECISION) $(THREAD_FLAGS)
CPP_INTEL_FLAGS = -O2 -std=c++11 -fprotect-parens -Wall -xAVX -axCORE-AVX2 -diag-disable -cpu-dispatch -DQuEST_PREC=$(PRECISION) $(THREAD_FLAGS)
CPP_MSVC_FLAGS = -O2 -EHs -std:c++latest -DQuEST_PREC=$(PRECISION) $(THREAD_FLAGS) -nologo -DDWIN$(WINDOWS_ARCH) -D_WINDOWS -Fo$@
CPP_CUDA_FLAGS = -O2 -arch=compute_$(GPU_COMPUTE_CAPABILITY) -code=sm_$(GPU_COMPUTE_CAPABILITY) -DQuEST_PREC=$(PRECISION)
ifeq ($(COMPILER_TYPE), CLANG)
C_FLAGS = $(C_CLANG_FLAGS)
CPP_FLAGS = $(CPP_CLANG_FLAGS)
else ifeq ($(COMPILER_TYPE), GNU)
C_FLAGS = $(C_GNU_FLAGS)
CPP_FLAGS = $(CPP_GNU_FLAGS)
else ifeq ($(COMPILER_TYPE), INTEL)
C_FLAGS = $(C_INTEL_FLAGS)
CPP_FLAGS = $(CPP_INTEL_FLAGS)
else ifeq ($(COMPILER_TYPE), MSVC)
C_FLAGS = $(C_MSVC_FLAGS)
CPP_FLAGS = $(CPP_MSVC_FLAGS)
CPP_CUDA_FLAGS := $(CPP_CUDA_FLAGS) -m=$(WINDOWS_ARCH) -DDWIN$(WINDOWS_ARCH)
endif
ifeq ($(COMPILER_TYPE), MSVC)
C_MODE =
LINKER = link.exe
LINK_FLAGS := -SUBSYSTEM:CONSOLE -nologo -MACHINE:$(ARCH_FLAG)
ifeq ($(GPUACCELERATED), 1)
LINK_FLAGS := -o $(EXE).exe $(foreach option, $(LINK_FLAGS), -Xlinker $(option))
else
LINK_FLAGS := -out:$(EXE).exe $(LINK_FLAGS)
endif
MPI_VARS =
else
C_MODE = -x c
LINKER = $(COMPILER)
LINK_FLAGS := -o $(EXE) $(THREAD_FLAGS)
MPI_VARS = I_MPI_CC=$(COMPILER) OMPI_CC=$(COMPILER) MPICH_CC=$(COMPILER)
endif
ifeq ($(DISTRIBUTED), 1)
COMP_CMD = $(MPI_VARS) $(MPI_COMPILER)
LINK_CMD = $(MPI_VARS) $(MPI_COMPILER)
else
COMP_CMD = $(COMPILER)
LINK_CMD = $(LINKER)
endif
OBJ = QuEST.o QuEST_validation.o QuEST_common.o QuEST_qasm.o mt19937ar.o
ifeq ($(GPUACCELERATED), 1)
OBJ += QuEST_gpu.o
else ifeq ($(DISTRIBUTED), 1)
OBJ += QuEST_cpu.o QuEST_cpu_distributed.o
else
OBJ += QuEST_cpu.o QuEST_cpu_local.o
endif
OBJ += $(addsuffix .o, $(SOURCES))
ifeq ($(GPUACCELERATED), 1)
%.o: %.cu
$(CUDA_COMPILER) -dc $(CPP_CUDA_FLAGS) -ccbin $(COMPILER) $(QUEST_INCLUDE) -o $@ $<
%.o: $(QUEST_INNER_DIR)/%.cu
$(CUDA_COMPILER) -dc $(CPP_CUDA_FLAGS) -ccbin $(COMPILER) $(QUEST_INCLUDE) -o $@ $<
endif
%.o: %.c
$(COMP_CMD) $(C_MODE) $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_INNER_DIR)/%.c
$(COMP_CMD) $(C_MODE) $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_COMMON_DIR)/%.c
$(COMP_CMD) $(C_MODE) $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: %.cpp
$(COMP_CMD) $(CPP_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_INNER_DIR)/%.cpp
$(COMP_CMD) $(CPP_FLAGS) -c $<
%.o: $(LINK_DIR)/%.cpp
$(COMP_CMD) $(CPP_FLAGS) $(QUEST_INCLUDE) -c $<
ifeq ($(GPUACCELERATED), 1)
SHUTUP :=
ifeq ($(COMPILER_TYPE), MSVC)
SHUTUP := -Xcompiler 2>nul:
endif
all: $(OBJ)
$(CUDA_COMPILER) $(SHUTUP) $(CPP_CUDA_FLAGS) $(OBJ) $(LIBS) $(LINK_FLAGS)
else
default: $(EXE)
$(EXE): $(OBJ)
$(LINK_CMD) $(OBJ) $(LIBS) $(LINK_FLAGS)
endif
ifeq ($(COMPILER_TYPE), MSVC)
REM = del
EXE_FN = $(EXE).exe
else
REM = /bin/rm -f
EXE_FN = $(EXE)
endif
.PHONY: tidy clean veryclean
tidy:
$(REM) *.o *.lib *.exp
clean: tidy
$(REM) $(EXE_FN)
veryclean: clean
$(REM) *.h~ *.c~ makefile~
print-%:
@echo $*=$($*)
getvalue-%:
@echo $($*)