Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ benchmark
example1
example2
tags
config.mk
32 changes: 22 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -32,30 +44,30 @@ 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

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 $@.$$$$

Expand Down
199 changes: 199 additions & 0 deletions configure
Original file line number Diff line number Diff line change
@@ -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"