From f82dd72ca140369ef870f804c4397ea666180c2d Mon Sep 17 00:00:00 2001 From: Chris Maffeo <cmaffeo2@illinois.edu> Date: Fri, 11 Nov 2016 13:25:27 -0600 Subject: [PATCH] Improved build scripts --- .gitignore | 4 +- src/BaseGrid.h | 2 +- src/Makefile | 34 ++++------ src/RigidBodyType.cu | 2 + src/TAGS.sh | 3 + src/cuda-test.c | 2 + src/findcudalib.mk | 155 ++++++------------------------------------- 7 files changed, 43 insertions(+), 159 deletions(-) create mode 100755 src/TAGS.sh create mode 100644 src/cuda-test.c diff --git a/.gitignore b/.gitignore index 23e5af8..26565cd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ *~ .backup TAGS -TAGS.sh .dir-locals.el BD_example* -runBrownCUDA +arbd +runBrownCUDA \ No newline at end of file diff --git a/src/BaseGrid.h b/src/BaseGrid.h index 1afc869..73d48f1 100644 --- a/src/BaseGrid.h +++ b/src/BaseGrid.h @@ -666,7 +666,7 @@ public: // Wrap coordinate: 0 <= x < l HOST DEVICE inline int quotient(float x, float l) const { -#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ > 0 return int(floorf( __fdividef(x,l) )); #else return int(floor(x/l)); diff --git a/src/Makefile b/src/Makefile index c208421..b8da44f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,30 +1,19 @@ ### Paths, libraries, includes, options include ./findcudalib.mk -CUDA_PATH ?= /usr/local/cuda-8.0 - -$(info CUDA_PATH=$(CUDA_PATH)) INCLUDE = $(CUDA_PATH)/include +NV_FLAGS += v ifeq ($(dbg),1) - DEBUG = -g -O0 - NV_FLAGS = -v -g -G + CC_FLAGS += -g -O0 + NV_FLAGS += -g -G EX_FLAGS = -O0 -m$(OS_SIZE) else - NV_FLAGS = -v EX_FLAGS = -O3 -m$(OS_SIZE) endif -CC_FLAGS = -Wall -Wno-write-strings -I$(INCLUDE) $(DEBUG) -std=c++0x -pedantic +CC_FLAGS += -Wall -Wno-write-strings -I$(INCLUDE) -std=c++0x -pedantic NV_FLAGS += -lineinfo -ifneq ($(MAVERICKS),) - CC = $(CLANG) - CC_FLAGS += -stdlib=libstdc++ - NV_FLAGS += -Xcompiler -arch -Xcompiler x86_64 -else - CC = $(GCC) -endif - ifneq ($(DARWIN),) LIBRARY = $(CUDA_PATH)/lib else @@ -33,13 +22,17 @@ endif # NV_FLAGS += -ftz=true # TODO: test if this preserves accurate simulation +## Find valid compute capabilities for this machine SMS ?= 20 30 35 37 50 52 60 -## Generate SASS code -$(foreach SM,$(SMS), $(eval NV_FLAGS += -gencode arch=compute_$(SM),code=sm_$(SM)) ) +$(info Testing CUDA toolkit with compute capabilities SMS='$(SMS)') +SMS := $(shell for sm in $(SMS); do $(NVCC) cuda-test.c -arch=sm_$$sm &> /dev/null && echo $$sm; done) + +SMPTXS ?= $(lastword $(sort $(SMS))) +$(info Building SASS code for SMS='$(SMS)' and PTX code for '$(SMPTXS)') -## Generate PTX code for highest SM architecture for future GPUs -SM=$(lastword $(sort $(SMS))) -NV_FLAGS += -gencode arch=compute_$(SM),code=sm_$(SM) +## Generate SASS and PTX code +$(foreach SM,$(SMS), $(eval NV_FLAGS += -gencode arch=compute_$(SM),code=sm_$(SM)) ) +$(foreach SM,$(SMPTXS), $(eval NV_FLAGS += -gencode arch=compute_$(SM),code=compute_$(SM)) ) NVLD_FLAGS := $(NV_FLAGS) --device-link LD_FLAGS = -L$(LIBRARY) -lcurand -lcudart -lcudadevrt -Wl,-rpath,$(LIBRARY) @@ -52,7 +45,6 @@ CU_SRC := $(wildcard *.cu) CC_OBJ := $(patsubst %.cpp, %.o, $(CC_SRC)) CU_OBJ := $(patsubst %.cu, %.o, $(CU_SRC)) - ### Targets TARGET = arbd diff --git a/src/RigidBodyType.cu b/src/RigidBodyType.cu index cc6577a..838e9cc 100644 --- a/src/RigidBodyType.cu +++ b/src/RigidBodyType.cu @@ -1,8 +1,10 @@ +#include <assert.h> #include "Configuration.h" #include "RigidBodyType.h" #include "Reservoir.h" #include "BaseGrid.h" #include "RigidBodyGrid.h" + #define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true) { if (code != cudaSuccess) { diff --git a/src/TAGS.sh b/src/TAGS.sh new file mode 100755 index 0000000..df6d4fa --- /dev/null +++ b/src/TAGS.sh @@ -0,0 +1,3 @@ +#! /bin/bash +# etags *.h* *.c* +etags -l c++ *.[cChH]* diff --git a/src/cuda-test.c b/src/cuda-test.c new file mode 100644 index 0000000..b3456ec --- /dev/null +++ b/src/cuda-test.c @@ -0,0 +1,2 @@ +#include <cuda_runtime.h> +int main(int argc, char **argv) {} diff --git a/src/findcudalib.mk b/src/findcudalib.mk index 89a0683..7c78849 100644 --- a/src/findcudalib.mk +++ b/src/findcudalib.mk @@ -34,6 +34,17 @@ # ################################################################################ +## Find Location of most recent CUDA Toolkit +ifeq (,$(CUDA_PATH)) + CUDA_PATH := $(shell echo $(wildcard /usr/local/cuda*) | tr ' ' '\n' | sort -Vr | head -n1) + ifeq (,$(CUDA_PATH)) + $(info ERROR: Could not CUDA_PATH. Please pass as follows: $(MAKE) CUDA_PATH=/path/to/cuda) + exit + else + $(info Using CUDA_PATH=$(CUDA_PATH)) + endif +endif + # OS Name (Linux or Darwin) OSUPPER = $(shell uname -s 2>/dev/null | tr "[:lower:]" "[:upper:]") OSLOWER = $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]") @@ -66,6 +77,7 @@ ifneq ($(DARWIN),) LION = $(strip $(findstring 10.7, $(shell egrep "<string>10\.7" /System/Library/CoreServices/SystemVersion.plist))) MOUNTAIN = $(strip $(findstring 10.8, $(shell egrep "<string>10\.8" /System/Library/CoreServices/SystemVersion.plist))) MAVERICKS = $(strip $(findstring 10.9, $(shell egrep "<string>10\.9" /System/Library/CoreServices/SystemVersion.plist))) + MAVERICKS = $(strip $(findstring 10.9, $(shell egrep "<string>10\.9" /System/Library/CoreServices/SystemVersion.plist))) endif # Common binaries @@ -73,16 +85,16 @@ GCC ?= g++ CLANG ?= /usr/bin/clang++ ifeq ("$(OSUPPER)","LINUX") - NVCC ?= $(CUDA_PATH)/bin/nvcc -ccbin $(GCC) + CC=$(GCC) else - # for some newer versions of XCode, CLANG is the default compiler, so we need to include this - ifneq ($(MAVERICKS),) - NVCC ?= $(CUDA_PATH)/bin/nvcc -ccbin $(CLANG) - STDLIB ?= -stdlib=libstdc++ - else - NVCC ?= $(CUDA_PATH)/bin/nvcc -ccbin $(GCC) - endif + # for some newer versions of XCode, CLANG is the default compiler, so we need to include this + ifeq ($(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5),1) + CC = $(CLANG) + CC_FLAGS += -stdlib=libstdc++ + NV_FLAGS += -Xcompiler -arch -Xcompiler x86_64 + endif endif +NVCC ?= $(CUDA_PATH)/bin/nvcc -ccbin $(CC) # Take command line flags that override any of these settings ifeq ($(i386),1) @@ -97,130 +109,3 @@ ifeq ($(ARMv7),1) OS_SIZE = 32 OS_ARCH = armv7l endif - -ifeq ("$(OSUPPER)","LINUX") - # Each Linux Distribuion has a set of different paths. This applies especially when using the Linux RPM/debian packages - ifeq ("$(DISTRO)","ubuntu") - CUDAPATH ?= /usr/lib/nvidia-current - CUDALINK ?= -L/usr/lib/nvidia-current - DFLT_PATH = /usr/lib - endif - ifeq ("$(DISTRO)","kubuntu") - CUDAPATH ?= /usr/lib/nvidia-current - CUDALINK ?= -L/usr/lib/nvidia-current - DFLT_PATH = /usr/lib - endif - ifeq ("$(DISTRO)","debian") - CUDAPATH ?= /usr/lib/nvidia-current - CUDALINK ?= -L/usr/lib/nvidia-current - DFLT_PATH = /usr/lib - endif - ifeq ("$(DISTRO)","suse") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib - endif - endif - ifeq ("$(DISTRO)","suse linux") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib - endif - endif - ifeq ("$(DISTRO)","opensuse") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib - endif - endif - ifeq ("$(DISTRO)","fedora") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= /usr/lib64/nvidia - CUDALINK ?= -L/usr/lib64/nvidia - DFLT_PATH = /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib - endif - endif - ifeq ("$(DISTRO)","redhat") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= /usr/lib64/nvidia - CUDALINK ?= -L/usr/lib64/nvidia - DFLT_PATH = /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib - endif - endif - ifeq ("$(DISTRO)","red") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= /usr/lib64/nvidia - CUDALINK ?= -L/usr/lib64/nvidia - DFLT_PATH = /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib - endif - endif - ifeq ("$(DISTRO)","redhatenterpriseworkstation") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= /usr/lib64/nvidia - CUDALINK ?= -L/usr/lib64/nvidia - DFLT_PATH ?= /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH ?= /usr/lib - endif - endif - ifeq ("$(DISTRO)","centos") - ifeq ($(OS_SIZE),64) - CUDAPATH ?= /usr/lib64/nvidia - CUDALINK ?= -L/usr/lib64/nvidia - DFLT_PATH = /usr/lib64 - else - CUDAPATH ?= - CUDALINK ?= - DFLT_PATH = /usr/lib - endif - endif - - ifeq ($(ARMv7),1) - CUDAPATH := /usr/arm-linux-gnueabihf/lib - CUDALINK := -L/usr/arm-linux-gnueabihf/lib - ifneq ($(TARGET_FS),) - CUDAPATH += $(TARGET_FS)/usr/lib/nvidia-current - CUDALINK += -L$(TARGET_FS)/usr/lib/nvidia-current - endif - endif - - # Search for Linux distribution path for libcuda.so - CUDALIB ?= $(shell find $(CUDAPATH) $(DFLT_PATH) -name libcuda.so -print 2>/dev/null) - - ifeq ("$(CUDALIB)",'') - $(info >>> WARNING - CUDA Driver libcuda.so is not found. Please check and re-install the NVIDIA driver. <<<) - EXEC=@echo "[@]" - endif -else - # This would be the Mac OS X path if we had to do anything special -endif - -- GitLab