diff --git a/.gitignore b/.gitignore index e3ec39b..717d5bd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ benchmark example1 example2 tags +config.mk diff --git a/Makefile b/Makefile index ada3124..19335ce 100755 --- a/Makefile +++ b/Makefile @@ -1,9 +1,21 @@ -CC=gcc -CXX=g++ +BASEPROJ?=. + +FILENAME=$(BASEPROJ)/config.mk +ifeq ("$(wildcard $(FILENAME))",) +else +include $(BASEPROJ)/config.mk +endif + +CFG_CC?=gcc-4.9 +CFG_CXX?=g++-4.9 +CFG_NVCC?=nvcc + +CFG_NVCC+= -arch=sm_21 -w + CFLAGS= -NVCC=nvcc -arch=sm_21 -w CUDA_ROOT=/usr/local/cuda +CFG_CUDA_LIBPATH?=/usr/local/cuda/lib EXECUTABLES= EXAMPLE_PROGRAM=benchmark example1 example2 @@ -32,7 +44,7 @@ INCLUDE= -I include/\ -I ../math_ext/ LIBRARY= -lcuda -lcublas -lcudart -LIBRARY_PATH=-L$(CUDA_ROOT)/lib64/ +LIBRARY_PATH=-L$(CFG_CUDA_LIBPATH) CUDA_INCLUDE=$(INCLUDE) \ -I $(CUDA_ROOT)/samples/common/inc/ \ -I $(CUDA_ROOT)/include @@ -40,22 +52,22 @@ CUDA_INCLUDE=$(INCLUDE) \ CPPFLAGS= -std=c++0x $(CFLAGS) $(INCLUDE) benchmark: $(OBJ) benchmark.cpp - $(CXX) $(CPPFLAGS) $(CUDA_INCLUDE) -o $@ $^ $(LIBRARY_PATH) $(LIBRARY) + $(CFG_CXX) $(CPPFLAGS) $(CUDA_INCLUDE) -o $@ $^ $(LIBRARY_PATH) $(LIBRARY) example1: $(OBJ) example1.cpp - $(CXX) $(CPPFLAGS) $(CUDA_INCLUDE) -o $@ $^ $(LIBRARY_PATH) $(LIBRARY) + $(CFG_CXX) $(CPPFLAGS) $(CUDA_INCLUDE) -o $@ $^ $(LIBRARY_PATH) $(LIBRARY) example2: $(OBJ) example2.cu - $(NVCC) $(NVCCFLAGS) $(CFLAGS) $(CUDA_INCLUDE) -o $@ $^ $(LIBRARY_PATH) $(LIBRARY) + $(CFG_NVCC) $(NVCCFLAGS) $(CFLAGS) $(CUDA_INCLUDE) -o $@ $^ $(LIBRARY_PATH) $(LIBRARY) # +==============================+ # +===== Other Phony Target =====+ # +==============================+ obj/%.o: %.cpp include/%.h - $(CXX) $(CPPFLAGS) $(CUDA_INCLUDE) -o $@ -c $< + $(CFG_CXX) $(CPPFLAGS) $(CUDA_INCLUDE) -o $@ -c $< obj/%.o: %.cu - $(NVCC) $(NVCCFLAGS) $(CFLAGS) $(CUDA_INCLUDE) -o $@ -c $< + $(CFG_NVCC) $(NVCCFLAGS) $(CFLAGS) $(CUDA_INCLUDE) -o $@ -c $< obj/%.d: %.cpp - @$(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \ + @$(CFG_CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,obj/\1.o $@ : ,g' < $@.$$$$ > $@;\ rm -f $@.$$$$ diff --git a/configure b/configure new file mode 100755 index 0000000..58b9be0 --- /dev/null +++ b/configure @@ -0,0 +1,199 @@ +#!/bin/bash + +test_cmd() { + "$@" + local status=$? + + if [ $status -ne 0 ] + then err "are you using the gnu version?" + else msg "test $@ OK" + fi +} + + +msg() { + echo "configure: $1" +} + +step_msg() { + msg + msg "$1" + msg +} + +warn() { + echo "configure: WARNING: $1" +} + +err() { + echo "configure: error: $1" + exit 1 +} + +need_cmd() { + if command -v $1 >/dev/null 2>&1 + then msg "found $1" + else err "need $1" + fi +} + + +probe() { + local V=$1 + shift + local P + local T + + for P + do + T=$(command -v $P 2>&1) + if [ $? -eq 0 ] + then + VER0=$($P --version 2>/dev/null | head -1 \ + | sed -e 's/[^0-9]*\([vV]\?[0-9.]\+[^ ]*\).*/\1/' ) + if [ $? -eq 0 -a "x${VER0}" != "x" ] + then + VER="($VER0)" + else + VER="" + fi + break + else + VER="" + T="" + fi + done + + eval $V=\$T + putvar $V "$VER" +} + +probe_need() { + local V=$1 + probe $* + eval VV=\$$V + + if [ -z "$VV" ] + then + err "needed, but unable to find any of: $*" + fi +} + +putvar() { + local T + eval T=\$$1 + eval TLEN=\${#$1} + if [ $TLEN -gt 35 ] + then + printf "configure: %-20s := %.35s ...\n" $1 "$T" + else + printf "configure: %-20s := %s %s\n" $1 "$T" "$2" + fi + printf "%-20s := %s\n" $1 "$T" >>config.tmp +} + +move_if_changed() { + if cmp -s $1 $2 + then + msg "leaving $2 unchanged" + else + msg "mv $1 $2" + mv -f $1 $2 + chmod u-w $2 # make moved artifact read-only + fi +} + +copy_if_changed() { + if cmp -s $1 $2 + then + msg "leaving $2 unchanged" + else + msg "cp $1 $2" + cp -f $1 $2 + chmod u-w $2 # make copied artifact read-only + fi +} + + +CFG_OSTYPE=$(uname -s) +CFG_CPUTYPE=$(uname -m) + + +case $CFG_OSTYPE in + Linux) + CFG_OSTYPE=unknown-linux-gnu + ;; + Darwin) + CFG_OSTYPE=apple-darwin + ;; + MSYS*) + CFG_OSTYPE=pc-windows-gnu + ;; + *) + err "unknown OS type: $CFG_OSTYPE" + ;; +esac + + +if [ $CFG_OSTYPE = apple-darwin -a $CFG_CPUTYPE = i386 ] +then + if sysctl hw.optional.x86_64 | grep -q ': 1' + then + CFG_CPUTYPE=x86_64 + fi +fi + + +msg "looking for required commands" +need_cmd mkdir +need_cmd printf + +step_msg "looking for needed program" + +probe_need CFG_NVCC nvcc +probe_need CFG_MAKE make +probe_need CFG_CTAGS ctags + + +if [ $CFG_OSTYPE = apple-darwin ] +then + CFG_OSX_GCC_VERSION=$(g++ --version 2>&1 | grep "Apple LLVM version") + + if [ $? -eq 0 ] + then + step_msg "on OS X 10.9, g++ is an alias of clang. Which is not good since CUDA is only compatible with g++, trying to probe other path instead" + + #probe for homebrew installed g++-4.9 + probe_need CFG_CC gcc-4.9 + probe_need CFG_CXX g++-4.9 + + else + if [ $(g++ --version 2>&1 | grep -c ' 4\.[0-6]') -ne 0 ]; then + err "older g++ found, please install a newer version of gcc" + fi + + probe_need CFG_CC gcc + probe_need CFG_CXX g++ + fi + + CFG_CUDA_LIBPATH=/usr/local/cuda/lib + putvar CFG_CUDA_LIBPATH + +elif [ $CFG_OSTYPE = unknown-linux-gnu ] +then + probe_need CFG_CC gcc + probe_need CFG_CXX g++ + + CFG_CUDA_LIBPATH=/usr/local/cuda/lib64 + putvar CFG_CUDA_LIBPATH +fi + + +msg "testing ctags is gnu" +test_cmd ctags -R + +move_if_changed config.tmp config.mk +rm -f config.tmp + +msg libcumatrix "configuration complete" +step_msg "please type 'make' to build the library"