mirror of https://github.com/jlizier/jidt
123 lines
3.3 KiB
Makefile
123 lines
3.3 KiB
Makefile
####################################################
|
|
#
|
|
# Makefile for GPU Kraskov Mutual Information code
|
|
# inside the JIDT library.
|
|
#
|
|
# (C) Pedro Mediano, 2017
|
|
#
|
|
####################################################
|
|
|
|
## Common binaries and flags
|
|
#---------------------------
|
|
NVCC ?= nvcc
|
|
GCC ?= g++
|
|
CCFLAGS ?= -O3 -Wall -Wextra -Wno-unused-parameter
|
|
NVCCFLAGS ?= -O3 -D_FORCE_INLINES -Xcompiler -Wall
|
|
BIN=../bin/cuda
|
|
UNITBIN=../unittests/bin/cuda
|
|
|
|
|
|
## Quick check to find 'which' function
|
|
#--------------------------------------
|
|
ifeq ($(OS),Windows_NT)
|
|
which = $(shell where $1)
|
|
else
|
|
which = $(shell which $1)
|
|
endif
|
|
|
|
|
|
## Check that NVCC is actually available
|
|
#---------------------------------------
|
|
ifeq ($(shell which ${NVCC}),)
|
|
$(error No NVCC found. Check that CUDA is installed and that CUDA_PATH is set)
|
|
endif
|
|
|
|
|
|
## Find CUDA compute capability for target GPU
|
|
#---------------------------------------------
|
|
# Set this variable if you know your target compute capability(ies). Example:
|
|
# COMPUTE_CAPABILITY = -arch=sm_30
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
ifeq (${COMPUTE_CAPABILITY},)
|
|
ifeq ($(wildcard $(BIN)/findComputeCapability),)
|
|
$(info Compiling diagnostics script)
|
|
$(shell ${NVCC} -Wno-deprecated-gpu-targets -o $(BIN)/findComputeCapability findComputeCapability.cu)
|
|
endif
|
|
COMPUTE_CAPABILITY ?= $(shell $(BIN)/findComputeCapability)
|
|
$(info CUDA compute capability found: ${COMPUTE_CAPABILITY})
|
|
endif
|
|
endif
|
|
NVCCFLAGS += ${COMPUTE_CAPABILITY}
|
|
|
|
|
|
## Find path to JNI header files
|
|
#-------------------------------
|
|
# Set these variables if you know where your JNI header files are
|
|
# JNI_INCLUDE ?=
|
|
# JNI_PLATFORM_INCLUDE ?=
|
|
ifeq ($(and $(JNI_INCLUDE),$(JNI_PLATFORM_INCLUDE)),)
|
|
include FindJNI.mk
|
|
endif
|
|
|
|
|
|
## Set more flags depending on make arguments
|
|
#--------------------------------------------
|
|
ifdef DEBUG
|
|
CCFLAGS += -g
|
|
NVCCFLAGS += -g -G
|
|
endif
|
|
|
|
ifdef CUSTOMFLAGS
|
|
CCFLAGS += ${CUSTOMFLAGS}
|
|
NVCCFLAGS += ${CUSTOMFLAGS}
|
|
endif
|
|
|
|
# Common includes and paths for CUDA. This assumes the CUDA toolkit is in PATH
|
|
INCLUDES := -I. -I./cub -I${JNI_INCLUDE} -I${JNI_PLATFORM_INCLUDE}
|
|
LDFLAGS += -L. -L$(BIN) -lcuda -lcudart
|
|
|
|
.PHONY: all clean test
|
|
|
|
# Main target rule
|
|
all: $(BIN)/libKraskov.so
|
|
|
|
|
|
## Compile device code
|
|
#---------------------
|
|
$(BIN)/gpuKnnLibrary.o: gpuKnnLibrary.c helperfunctions.cu gpuKnnBF_kernel.cu
|
|
${NVCC} ${NVCCFLAGS} ${INCLUDES} -x cu -Xcompiler -fPIC -c gpuKnnLibrary.c -o $@
|
|
|
|
$(BIN)/libgpuKnnLibrary.a: $(BIN)/gpuKnnLibrary.o
|
|
${AR} -r $@ $<
|
|
|
|
|
|
## Compile host code
|
|
#-------------------
|
|
# PROG=program1 program2
|
|
# LIST=$(addprefix $(BIN)/, $(PROG))
|
|
c_objects = $(addprefix $(BIN)/,digamma.o gpuMILibrary.o kraskovCuda.o)
|
|
|
|
$(BIN)/%.o: %.c
|
|
${GCC} ${INCLUDES} ${CCFLAGS} -x c -std=c99 -fPIC -c $< -o $@
|
|
|
|
|
|
## Final shared library linking
|
|
#------------------------------
|
|
$(BIN)/libKraskov.so: $(BIN)/libgpuKnnLibrary.a $(c_objects)
|
|
${NVCC} ${NVCCFLAGS} ${INCLUDES} -Xcompiler -fPIC -shared -o $@ $(c_objects) ${LDFLAGS} -lgpuKnnLibrary
|
|
|
|
|
|
## Test binary targets
|
|
#------------------------------
|
|
test: $(UNITBIN)/unittest $(UNITBIN)/perftest
|
|
|
|
$(UNITBIN)/unittest: unittest.cpp $(BIN)/libKraskov.so
|
|
${GCC} ${CCFLAGS} -std=c++11 $< -Wl,-rpath,"$(abspath $(BIN))" -L$(BIN) -lKraskov -o $@
|
|
|
|
$(UNITBIN)/perftest: perftest.cpp $(BIN)/libKraskov.so
|
|
${GCC} ${CCFLAGS} -DTIMER -std=c++11 $< -L$(BIN) -lKraskov -o $@
|
|
|
|
clean:
|
|
rm -f $(BIN)/* $(UNITBIN)/*
|
|
|