EXE = demo
SOURCES = tutorial_example
QUEST_DIR = QuEST
COMPILER = gcc
COMPILER_TYPE = GNU
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)
$(error COMPILER_TYPE must be one of CLANG, GNU or INTEL)
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
endif
endif
endif
LIBS = -lm
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
endif
else
THREAD_FLAGS =
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)
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_CUDA_FLAGS = -O2 -arch=compute_$(GPU_COMPUTE_CAPABILITY) -code=sm_$(GPU_COMPUTE_CAPABILITY) -DQuEST_PREC=$(PRECISION) -ccbin $(COMPILER)
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)
endif
ifeq ($(TEST), 1)
QUEST_LIB := libQuEST
LIB_EXT = .so
LIB_NAME = $(addsuffix $(LIB_EXT), $(QUEST_LIB))
C_FLAGS += -fPIC
endif
MPI_WRAPPED_COMP = I_MPI_CC=$(COMPILER) OMPI_CC=$(COMPILER) MPICH_CC=$(COMPILER)
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: %.c
$(COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_INNER_DIR)/%.c
$(COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_COMMON_DIR)/%.c
$(COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: %.cu
$(CUDA_COMPILER) -dc $(CPP_CUDA_FLAGS) $(QUEST_INCLUDE) $<
%.o: $(QUEST_INNER_DIR)/%.cu
$(CUDA_COMPILER) -dc $(CPP_CUDA_FLAGS) $(QUEST_INCLUDE) $<
%.o: %.cpp
$(CUDA_COMPILER) -dc $(CPP_CUDA_FLAGS) $(QUEST_INCLUDE) $<
%.o: $(QUEST_INNER_DIR)/%.cpp
$(CUDA_COMPILER) -dc $(CPP_CUDA_FLAGS) $(QUEST_INCLUDE) $<
else ifeq ($(DISTRIBUTED), 1)
%.o: %.c
$(MPI_WRAPPED_COMP) $(MPI_COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_INNER_DIR)/%.c
$(MPI_WRAPPED_COMP) $(MPI_COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_COMMON_DIR)/%.c
$(MPI_WRAPPED_COMP) $(MPI_COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: %.cpp
$(MPI_WRAPPED_COMP) $(MPI_COMPILER) $(CPP_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_INNER_DIR)/%.cpp
$(MPI_WRAPPED_COMP) $(MPI_COMPILER) $(CPP_FLAGS) $(QUEST_INCLUDE) -c $<
else
%.o: %.c
$(COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_INNER_DIR)/%.c
$(COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_COMMON_DIR)/%.c
$(COMPILER) -x c $(C_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: %.cpp
$(COMPILER) $(CPP_FLAGS) $(QUEST_INCLUDE) -c $<
%.o: $(QUEST_INNER_DIR)/%.cpp
$(COMPILER) $(CPP_FLAGS) -c $<
endif
ifeq ($(GPUACCELERATED), 1)
all: $(OBJ)
$(CUDA_COMPILER) $(CPP_CUDA_FLAGS) $(QUEST_INCLUDE) -o $(EXE) $(OBJ) $(LIBS)
else ifeq ($(DISTRIBUTED), 1)
default: $(EXE)
$(EXE): $(OBJ)
$(MPI_WRAPPED_COMP) $(MPI_COMPILER) $(C_FLAGS) $(QUEST_INCLUDE) -o $(EXE) $(OBJ) $(LIBS)
else
default: $(EXE)
$(EXE): $(OBJ)
$(COMPILER) $(C_FLAGS) $(QUEST_INCLUDE) -o $(EXE) $(OBJ) $(LIBS)
endif
.PHONY: clean veryclean
clean:
/bin/rm -f *.o $(EXE)
veryclean: clean
/bin/rm -f *.h~ *.c~ makefile~
print-%:
@echo $*=$($*)
getvalue-%:
@echo $($*)