include ../../common/make.config

CUDA_LIB =	-lcuda -lcudart
CUDA_FLAG = -arch sm_20

# ====================================================================================================100
#	END
# ====================================================================================================100

# ======================================================================================================================================================150
#	OPENCL
# ======================================================================================================================================================150

# ====================================================================================================100
#	NVIDIA OpenCL header/library [NVIDIA SDK]
# ====================================================================================================100

# OCL_DIR =/af14/lgs9a/Programs/NVIDIA/SDK
# OCL_INC_DIR = -I$(OCL_DIR)/OpenCL/common/inc
# OCL_LIB_DIR = -L$(OCL_DIR)/OpenCL/common/lib

# ====================================================================================================100
#	AMD OpenCL header/library [AMD SDK]
# ====================================================================================================100

# OCL_DIR = /af14/lgs9a/Programs/AMD/SDK
# OCL_INC_DIR = -I$(OCL_DIR)/include/ 
# OCL_LIB_DIR = -L$(OCL_DIR)/lib/x86/
# ifeq ($(shell uname -m), x86_64)
    # ifeq ($(shell if test -d $(OCL_DIR)/lib/x86_64/; then echo T; else echo F; fi), T)
#    	# OCL_LIB_DIR = -L$(OCL_DIR)/lib/x86_64/
    # endif
# endif

# ====================================================================================================100
#	END
# ====================================================================================================100

# ======================================================================================================================================================150
#	COMPILER
# ======================================================================================================================================================150

# ====================================================================================================100
#	ICC
# ====================================================================================================100

# C_C = icc
# OMP_FLAG = -openmp

# ====================================================================================================100
#	GCC
# ====================================================================================================100

C_C = gcc
# OMP_LIB = -lgomp
# OMP_FLAG = -fopenmp
# OCL_LIB = -lOpenCL

# ====================================================================================================100
#	NVCC
# ====================================================================================================100

CUD_C = nvcc
# OMP_FLAG = 	-Xcompiler paste_one_here

# ====================================================================================================100
#	PGCC
# ====================================================================================================100

# C_C = pgcc
# OMP_FLAG = -mp
# ACC_FLAG = 	-ta=nvidia \
			# -Minfo \
			# -Mbounds

# ====================================================================================================100
#	END
# ====================================================================================================100

# ======================================================================================================================================================150
#	END
# ======================================================================================================================================================150

# ========================================================================================================================================================================================================200
#	EXECUTABLES (LINK OBJECTS TOGETHER INTO BINARY)
# ========================================================================================================================================================================================================200

b+tree.out:	./main.o \
		./kernel/kernel_gpu_cuda_wrapper.o \
		./kernel/kernel_gpu_cuda_wrapper_2.o \
		./util/timer/timer.o \
		./util/num/num.o \
		./util/cuda/cuda.o
	$(C_C)	./main.o \
			./kernel/kernel_gpu_cuda_wrapper.o \
			./kernel/kernel_gpu_cuda_wrapper_2.o \
			./util/timer/timer.o \
			./util/num/num.o \
			./util/cuda/cuda.o \
			-lm \
			-L$(CUDA_LIB_DIR) \
			$(CUDA_LIB)\
                       -o b+tree.out


# ========================================================================================================================================================================================================200
#	OBJECTS (COMPILE SOURCE FILES INTO OBJECTS)
# ========================================================================================================================================================================================================200

# ======================================================================================================================================================150
#	MAIN FUNCTION
# ======================================================================================================================================================150

main.o:	./common.h \
		./main.h \
		./main.c
	$(C_C)	$(KERNEL_DIM) ./main.c \
			-c \
			-o ./main.o \
			-O3

# ======================================================================================================================================================150
#	KERNELS
# ======================================================================================================================================================150

./kernel/kernel_gpu_cuda_wrapper.o:	./common.h \
									./kernel/kernel_gpu_cuda_wrapper.h \
									./kernel/kernel_gpu_cuda_wrapper.cu
	$(CUD_C) $(KERNEL_DIM) ./kernel/kernel_gpu_cuda_wrapper.cu \
				-c \
				-o ./kernel/kernel_gpu_cuda_wrapper.o \
				-O3 \
				$(CUDA_FLAG)

./kernel/kernel_gpu_cuda_wrapper_2.o:	./common.h \
										./kernel/kernel_gpu_cuda_wrapper_2.h \
										./kernel/kernel_gpu_cuda_wrapper_2.cu
	$(CUD_C) $(KERNEL_DIM) ./kernel/kernel_gpu_cuda_wrapper_2.cu \
				-c \
				-o ./kernel/kernel_gpu_cuda_wrapper_2.o \
				-O3 \
				$(CUDA_FLAG)

# ======================================================================================================================================================150
#	UTILITIES
# ======================================================================================================================================================150

./util/timer/timer.o:	./common.h \
						./util/timer/timer.h \
						./util/timer/timer.c
	$(C_C)	./util/timer/timer.c \
			-c \
			-o ./util/timer/timer.o \
			-O3

./util/num/num.o:	./common.h \
					./util/num/num.h \
					./util/num/num.c
	$(C_C)	./util/num/num.c \
			-c \
			-o ./util/num/num.o \
			-O3

./util/cuda/cuda.o:	./common.h \
					./util/cuda/cuda.h \
					./util/cuda/cuda.cu
	$(CUD_C)	./util/cuda/cuda.cu \
				-c \
				-o ./util/cuda/cuda.o \
				-O3 \
				$(CUDA_FLAG)

# ======================================================================================================================================================150
#	END
# ======================================================================================================================================================150

# ========================================================================================================================================================================================================200
#	DELETE
# ========================================================================================================================================================================================================200

clean:
	rm	*.o *.out \
		./kernel/*.o \
		./util/timer/*.o \
		./util/num/*.o \
		./util/cuda/*.o \
                output.txt \

# ========================================================================================================================================================================================================200
#	END
# ========================================================================================================================================================================================================200
KERNELS = kernel/kernel_gpu_cuda_wrapper kernel/kernel_gpu_cuda_wrapper_2

drano: $(addsuffix .cu, $(KERNELS))
	$(foreach KERNEL, $(KERNELS), clang++ -S -g -emit-llvm $(KERNEL).cu --cuda-gpu-arch=sm_30 $(INCLUDES);)

drano_analysis: $(addsuffix .cu, $(KERNELS))
	$(foreach KERNEL, $(KERNELS), $(OPT) -instnamer -interproc-uncoalesced-analysis < $(notdir $(KERNEL))-cuda-nvptx64-nvidia-cuda-sm_30.ll > /dev/null 2>log_$(subst /,_,$(KERNEL));)

dranoclean:
	find . -name \*.ll -type f -delete; \
	rm log*
