diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 00000000..5879f49b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,260 @@ +# ===================================================== # +# # +# # ## # # # # # +# # # # # # # # # # # +# ##### # # # # ##### ## ### # # ## ### ### # +# # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # +# # # ## # ## # # ### ### ### ## ### # # # +# # # # # +# ## # # # +# # +# ===================================================== # +# # +# Authors: # +# - Jose Luis Cercos-Pita # +# - Leo Miguel Gonzalez # +# - Antonio Souto-Iglesias # +# # +# ===================================================== # + + +# ===================================================== # +# General CMake options # +# ===================================================== # +cmake_minimum_required(VERSION 3.9.0 FATAL_ERROR) +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cMake") + +# Set the version from git repo. +# See cMake/MunkeiVersionFromGit.cmake, which is a slightly modified version of +# https://github.com/Munkei/munkei-cmake/blob/master/doc/MunkeiVersionFromGit.md +include( MunkeiVersionFromGit ) +version_from_git( + LOG OFF + INCLUDE_HASH OFF +) + +project(GPUSPH + VERSION ${VERSION} + LANGUAGES C;CXX;CUDA +) +add_definitions(-DGPUSPH_VERSION=\"${VERSION}\" -DUSE_CMAKE) + +# -std=c++11 +set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CUDA_STANDARD 11) + +# No Debug/Release output paths +set(DEBUG_MAIN_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) +set(RELEASE_MAIN_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) + +# Some useful commands comaptibility +set(PLATFORM_CP cp) +set(PLATFORM_MK mkdir -p) +if(APPLE) + set(PLATFORM_SED sed -i "" -e) +else(APPLE) + set(PLATFORM_SED sed -i -e) +endif(APPLE) + + +# ===================================================== # +# Output directories for install target # +# ===================================================== # +SET(CMAKE_INSTALL_PREFIX + "/usr" + CACHE PATH + "Installation root directory") +SET(INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") +if(APPLE) + set(BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES}) +endif(APPLE) + +SET(CMAKE_INSTALL_DATADIR + share/gpusph + CACHE PATH + "Output directory for data and resource files") +SET(CMAKE_INSTALL_INCLUDEDIR + include/gpusph + CACHE PATH + "Output directory for header files") +SET(CMAKE_INSTALL_DOCDIR + share/doc/gpusph + CACHE PATH + "Output directory for documentation and license files") +SET(CMAKE_INSTALL_BINDIR + bin + CACHE PATH + "Output directory for binary files") +SET(CMAKE_INSTALL_LIBDIR + lib + CACHE PATH + "Output directory for library files") + +# used as compiler defines +SET(RESOURCEDIR "${CMAKE_INSTALL_DATADIR}") +SET(DOCDIR "${CMAKE_INSTALL_DOCDIR}") + +# ===================================================== # +# Build options # +# ===================================================== # +IF(NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE "Release") +ENDIF(NOT CMAKE_BUILD_TYPE) +SET(GPUSPH_PROBLEM "DamBreak3D" CACHE STRING "Problem in src/problems folder to be considered") +OPTION(GPUSPH_USE_MPI "MPI support" ON) +OPTION(GPUSPH_USE_HDF5 "HDF5 files support" ON) +OPTION(GPUSPH_USE_CHRONO "CHRONO Multi-physics Simulation Engine support" OFF) +OPTION(GPUSPH_FASTMATH "Apply --use_fast_math CUDA option" ON) +SET(LINEARIZATION_VALUES xyz xzy yxz yzx zxy zyx) +SET(GPUSPH_LINEARIZATION yzx CACHE STRING "Linearization alternative") +SET_PROPERTY(CACHE GPUSPH_LINEARIZATION PROPERTY STRINGS ${LINEARIZATION_VALUES}) + +# ===================================================== # +# Search the packages # +# ===================================================== # +# AWK +FIND_PACKAGE(AWK REQUIRED) +IF(NOT AWK_FOUND) + MESSAGE(FATAL_ERROR "AWK not found") +ENDIF(NOT AWK_FOUND) + +# CUDA +FIND_PACKAGE(CUDA REQUIRED) +IF(NOT CUDA_FOUND) + MESSAGE(FATAL_ERROR "CUDA not found") +ENDIF(NOT CUDA_FOUND) + +IF(CUDA_VERSION_MAJOR LESS 7) + MESSAGE(FATAL_ERROR "CUDA is too old (${CUDA_VERSION} < 7.0)") +ENDIF(CUDA_VERSION_MAJOR LESS 7) + +# MPI +IF(GPUSPH_USE_MPI) + FIND_PACKAGE(MPI) + IF(NOT MPI_CXX_FOUND) + MESSAGE(FATAL_ERROR "MPI (CXX) not found, but GPUSPH_USE_MPI is ON. Install MPI or set GPUSPH_USE_MPI=OFF") + ENDIF(NOT MPI_CXX_FOUND) + + ADD_DEFINITIONS(-DUSE_MPI=1) +ELSE(GPUSPH_USE_MPI) + ADD_DEFINITIONS(-DUSE_MPI=0) +ENDIF(GPUSPH_USE_MPI) + +# HDF5 +IF(GPUSPH_USE_HDF5) + FIND_PACKAGE(HDF5) + IF(NOT HDF5_FOUND) + MESSAGE(FATAL_ERROR "HDF5 not found, but GPUSPH_USE_HDF5 is ON. Install HDF5 or set GPUSPH_USE_HDF5=OFF") + ENDIF(NOT HDF5_FOUND) + + ADD_DEFINITIONS(-DUSE_HDF5=1) + + IF(GPUSPH_USE_MPI AND NOT HDF5_IS_PARALLEL) + MESSAGE(WARNING "MPI support is enabled. However installed HDF5 does not support it.") + ENDIF(GPUSPH_USE_MPI AND NOT HDF5_IS_PARALLEL) +ELSE(GPUSPH_USE_HDF5) + ADD_DEFINITIONS(-DUSE_HDF5=0) +ENDIF(GPUSPH_USE_HDF5) + +# CHRONO +IF(GPUSPH_USE_CHRONO) + FIND_PACKAGE(CHRONO) + IF(NOT CHRONO_FOUND) + MESSAGE(FATAL_ERROR "CHRONO not found, but GPUSPH_USE_CHRONO is ON. Install CHRONO or set GPUSPH_USE_CHRONO=OFF") + ENDIF(NOT CHRONO_FOUND) + + ADD_DEFINITIONS(-DUSE_CHRONO=1) +ELSE(GPUSPH_USE_CHRONO) + ADD_DEFINITIONS(-DUSE_CHRONO=0) +ENDIF(GPUSPH_USE_CHRONO) + +# ===================================================== # +# CUDA compute capabilities # +# ===================================================== # +EXECUTE_PROCESS( COMMAND ${CUDA_TOOLKIT_ROOT_DIR}/bin/nvcc -Wno-deprecated-gpu-targets -o ${CMAKE_BINARY_DIR}/list-cuda-cc ${CMAKE_CURRENT_SOURCE_DIR}/scripts/list-cuda-cc.cc + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts/ + RESULT_VARIABLE CUDA_CC_HAS_ERROR + OUTPUT_VARIABLE CUDA_CC + ERROR_VARIABLE CUDA_CC_ERROR ) +IF(CUDA_CC_HAS_ERROR EQUAL 0) + EXECUTE_PROCESS( COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/define-cuda-cc.sh + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/ + RESULT_VARIABLE CUDA_CC_HAS_ERROR + OUTPUT_VARIABLE CUDA_CC + ERROR_VARIABLE CUDA_CC_ERROR ) +ENDIF(CUDA_CC_HAS_ERROR EQUAL 0) + +IF(NOT CUDA_CC_HAS_ERROR EQUAL 0) + MESSAGE(WARNING "Failed detecting the CUDA compute capabilities:") + MESSAGE(WARNING "${CUDA_CC_ERROR}") + SET(CUDA_CC "20") +ENDIF(NOT CUDA_CC_HAS_ERROR EQUAL 0) +STRING(REGEX REPLACE "\n$" "" CUDA_CC "${CUDA_CC}") +SET(GPUSPH_COMPUTE_CAPABILITIES "${CUDA_CC}" CACHE STRING "11, 12, 13, 20, 21, 30, 35, etc. Left empty for automatic detection") +MARK_AS_ADVANCED(GPUSPH_COMPUTE_CAPABILITIES) + +ADD_DEFINITIONS(-DCOMPUTE=${GPUSPH_COMPUTE_CAPABILITIES}) +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__COMPUTE__=${GPUSPH_COMPUTE_CAPABILITIES}") +SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D__COMPUTE__=${GPUSPH_COMPUTE_CAPABILITIES} -D__NVCC_VERSION__=${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR} -arch=sm_${GPUSPH_COMPUTE_CAPABILITIES}") + +# ===================================================== # +# Other options # +# ===================================================== # +IF(CMAKE_BUILD_TYPE MATCHES DEBUG) + ADD_DEFINITIONS(-D_DEBUG_) + SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --generate-line-info") +ELSE(CMAKE_BUILD_TYPE MATCHES DEBUG) + # Took from former Makefile. Prolly not required at all + REMOVE_DEFINITIONS(-D_DEBUG_) +ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG) + +STRING(SUBSTRING ${GPUSPH_LINEARIZATION} 0 1 GPUSPH_LINEARIZATION_WORD1) +STRING(SUBSTRING ${GPUSPH_LINEARIZATION} 1 1 GPUSPH_LINEARIZATION_WORD2) +STRING(SUBSTRING ${GPUSPH_LINEARIZATION} 2 1 GPUSPH_LINEARIZATION_WORD3) +ADD_DEFINITIONS(-DLINEARIZATION=\"${GPUSPH_LINEARIZATION}\" + -DCOORD1=${GPUSPH_LINEARIZATION_WORD1} + -DCOORD2=${GPUSPH_LINEARIZATION_WORD2} + -DCOORD3=${GPUSPH_LINEARIZATION_WORD3} ) + +IF(GPUSPH_FASTMATH) + ADD_DEFINITIONS(-DFASTMATH=1) + SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --use_fast_math") +ELSE(GPUSPH_FASTMATH) + ADD_DEFINITIONS(-DFASTMATH=0) +ENDIF(GPUSPH_FASTMATH) + +IF(CMAKE_VERBOSE_MAKEFILE) + SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --ptxas-options=-v") +ENDIF(CMAKE_VERBOSE_MAKEFILE) + +# ===================================================== # +# problem.h # +# ===================================================== # +CONFIGURE_FILE(problem.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/problem.h) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) + +# ===================================================== # +# Parse debugflags.def # +# ===================================================== # +EXECUTE_PROCESS( COMMAND ${AWK_EXECUTABLE} -f ${CMAKE_CURRENT_SOURCE_DIR}/scripts/parse-debugflags.awk ${CMAKE_CURRENT_SOURCE_DIR}/src/debugflags.def + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/ + RESULT_VARIABLE PARSE_DEBUG_FLAGS_HAS_ERROR + OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/parse-debugflags.h + ERROR_VARIABLE PARSE_DEBUG_FLAGS_ERROR ) +IF(NOT PARSE_DEBUG_FLAGS_HAS_ERROR EQUAL 0) + MESSAGE(FATAL_ERROR "Failure generating parse-debugflags.h\n${PARSE_DEBUG_FLAGS_ERROR}") +ENDIF(NOT PARSE_DEBUG_FLAGS_HAS_ERROR EQUAL 0) +EXECUTE_PROCESS( COMMAND ${AWK_EXECUTABLE} -f ${CMAKE_CURRENT_SOURCE_DIR}/scripts/describe-debugflags.awk ${CMAKE_CURRENT_SOURCE_DIR}/src/debugflags.def + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/ + RESULT_VARIABLE PARSE_DEBUG_FLAGS_HAS_ERROR + OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/describe-debugflags.h + ERROR_VARIABLE PARSE_DEBUG_FLAGS_ERROR ) +IF(NOT PARSE_DEBUG_FLAGS_HAS_ERROR EQUAL 0) + MESSAGE(FATAL_ERROR "Failure generating describe-debugflags.h\n${PARSE_DEBUG_FLAGS_ERROR}") +ENDIF(NOT PARSE_DEBUG_FLAGS_HAS_ERROR EQUAL 0) + +# ===================================================== # +# Compiling time! # +# ===================================================== # +ADD_SUBDIRECTORY(src) diff --git a/Makefile b/Makefile index 0d500d55..887858ae 100644 --- a/Makefile +++ b/Makefile @@ -164,7 +164,7 @@ EXTRA_PROBLEM_FILES += half_wave0.1m.txt # override: defaults /usr/local/cuda, # override: validity is checked by looking for bin/nvcc under it, # override: /usr is always tried as a last resort -CUDA_INSTALL_PATH ?= /usr/local/cuda +CUDA_INSTALL_PATH ?= /opt/cuda # We check the validity of the path by looking for bin/nvcc under it. # if not found, we look into /usr, and finally abort @@ -811,6 +811,7 @@ $(COMPUTE_SELECT_OPTFILE): $(LIST_CUDA_CC) | $(OPTSDIR) @echo "/* Define the compute capability GPU code was compiled for. */" \ > $(COMPUTE_SELECT_OPTFILE) $(call show_stage_nl,SCRIPTS,compute detection) + @printf "#define COMPUTE " >> $(COMPUTE_SELECT_OPTFILE) @$(SCRIPTSDIR)/define-cuda-cc.sh $(COMPUTE) >> $(COMPUTE_SELECT_OPTFILE) $(FASTMATH_SELECT_OPTFILE): | $(OPTSDIR) @echo "/* Determines if fastmath is enabled for GPU code. */" \ diff --git a/cMake/FindAWK.cmake b/cMake/FindAWK.cmake new file mode 100644 index 00000000..9c3b38f9 --- /dev/null +++ b/cMake/FindAWK.cmake @@ -0,0 +1,5 @@ +find_program(AWK_EXECUTABLE NAMES gawk awk) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(AWK DEFAULT_MSG AWK_EXECUTABLE) +MARK_AS_ADVANCED(AWK_EXECUTABLE) diff --git a/cMake/FindCHRONO.cmake b/cMake/FindCHRONO.cmake new file mode 100755 index 00000000..925cc130 --- /dev/null +++ b/cMake/FindCHRONO.cmake @@ -0,0 +1,14 @@ +# - Find CHRONO Multi-physics Simulation Engine support +# +# CHRONO_FOUND - System has CHRONO +# CHRONO_INCLUDE_DIRS - CHRONO include directories +# CHRONO_LIBRARIES - The libraries needed to use CHRONO + +FIND_LIBRARY(CHRONO_LIBRARIES NAMES ChronoEngine) +FIND_PATH(CHRONO_INCLUDE_DIRS NAMES chrono/core/ChChrono.h) + +# handle the QUIETLY and REQUIRED arguments and set CHRONO_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(CHRONO DEFAULT_MSG CHRONO_LIBRARIES CHRONO_INCLUDE_DIRS) +MARK_AS_ADVANCED(CHRONO_INCLUDE_DIRS CHRONO_LIBRARIES) diff --git a/cMake/MunkeiVersionFromGit.cmake b/cMake/MunkeiVersionFromGit.cmake new file mode 100644 index 00000000..6fe43ba5 --- /dev/null +++ b/cMake/MunkeiVersionFromGit.cmake @@ -0,0 +1,168 @@ +# The MIT License (MIT) +# +# Copyright (c) 2016-2017 Theo Willows +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +cmake_minimum_required( VERSION 3.0.0 ) + +include( CMakeParseArguments ) + +function( version_from_git ) + # Parse arguments + set( options OPTIONAL FAST ) + set( oneValueArgs + GIT_EXECUTABLE + INCLUDE_HASH + LOG + TIMESTAMP + ) + set( multiValueArgs ) + cmake_parse_arguments( ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + + # Defaults + if( NOT DEFINED ARG_INCLUDE_HASH ) + set( ARG_INCLUDE_HASH ON ) + endif() + + if( DEFINED ARG_GIT_EXECUTABLE ) + set( GIT_EXECUTABLE "${ARG_GIT_EXECUTABLE}" ) + else () + # Find Git or bail out + find_package( Git ) + if( NOT GIT_FOUND ) + message( FATAL_ERROR "[MunkeiVersionFromGit] Git not found" ) + endif( NOT GIT_FOUND ) + endif() + + # Git describe + execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --tags + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_describe + ERROR_VARIABLE git_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + if( NOT git_result EQUAL 0 ) + message( FATAL_ERROR + "[MunkeiVersionFromGit] Failed to execute Git: ${git_error}" + ) + endif() + + # Get Git tag + execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --tags --dirty=+custom + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_tag + ERROR_VARIABLE git_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + if( NOT git_result EQUAL 0 ) + message( FATAL_ERROR + "[MunkeiVersionFromGit] Failed to execute Git: ${git_error}" + ) + endif() + + if( git_tag MATCHES "^v(0|[1-9][0-9]*)[.](0|[1-9][0-9]*)[-](0|[1-9][0-9]*)(-[.0-9A-Za-z-]+)?([-][.+0-9A-Za-z-]+)?$" ) + set( version_major "${CMAKE_MATCH_1}" ) + set( version_minor "${CMAKE_MATCH_2}" ) + set( version_patch "${CMAKE_MATCH_3}" ) + set( identifiers "${CMAKE_MATCH_4}" ) + set( metadata "${CMAKE_MATCH_5}" ) + else() + message( FATAL_ERROR + "[MunkeiVersionFromGit] Git tag isn't valid semantic version: [${git_tag}]" + ) + endif() + + if( "${git_tag}" STREQUAL "${git_describe}" ) + set( git_at_a_tag ON ) + endif() + + if( NOT git_at_a_tag ) + # Extract the Git hash (if one exists) + string( REGEX MATCH "g[0-9a-f]+$" git_hash "${git_describe}" ) + endif() + + # Construct the version variables + set( version ${version_major}.${version_minor}.${version_patch} ) + set( semver ${version} ) + + # Identifiers + if( identifiers MATCHES ".+" ) + string( SUBSTRING "${identifiers}" 1 -1 identifiers ) + set( semver "${semver}-${identifiers}") + endif() + + # Metadata + # TODO Split and join (add Git hash inbetween) + if( metadata MATCHES ".+" ) + string( SUBSTRING "${metadata}" 1 -1 metadata ) + # Split + string( REPLACE "." ";" metadata "${metadata}" ) + endif() + + if( NOT git_at_a_tag ) + + if( ARG_INCLUDE_HASH ) + list( APPEND metadata "${git_hash}" ) + endif( ARG_INCLUDE_HASH ) + + # Timestamp + if( DEFINED ARG_TIMESTAMP ) + string( TIMESTAMP timestamp "${ARG_TIMESTAMP}" ${ARG_UTC} ) + list( APPEND metadata "${timestamp}" ) + endif( DEFINED ARG_TIMESTAMP ) + + endif() + + # Join + string( REPLACE ";" "." metadata "${metadata}" ) + + if( metadata MATCHES ".+" ) + set( semver "${semver}+${metadata}") + endif() + + # Log the results + if( ARG_LOG ) + message( STATUS + "[MunkeiVersionFromGit] Version: ${version} + Git tag: [${git_tag}] + Git hash: [${git_hash}] + Decorated: [${git_describe}] + Identifiers: [${identifiers}] + Metadata: [${metadata}] + SemVer: [${semver}]" + ) + endif( ARG_LOG ) + + # Set parent scope variables + set( GIT_TAG ${git_tag} PARENT_SCOPE ) + set( SEMVER ${semver} PARENT_SCOPE ) + set( VERSION ${version} PARENT_SCOPE ) + set( VERSION_MAJOR ${version_major} PARENT_SCOPE ) + set( VERSION_MINOR ${version_minor} PARENT_SCOPE ) + set( VERSION_PATCH ${version_patch} PARENT_SCOPE ) + set( VERSION_IDENTIFIERS ${identifiers} PARENT_SCOPE ) + +endfunction( version_from_git ) diff --git a/problem.h.cmake b/problem.h.cmake new file mode 100755 index 00000000..2e02abc3 --- /dev/null +++ b/problem.h.cmake @@ -0,0 +1,3 @@ +#define PROBLEM ${GPUSPH_PROBLEM} +#define QUOTED_PROBLEM "${GPUSPH_PROBLEM}" +#include "${GPUSPH_PROBLEM}.h" diff --git a/scripts/define-cuda-cc.sh b/scripts/define-cuda-cc.sh index 2a4c08c7..5277d99e 100755 --- a/scripts/define-cuda-cc.sh +++ b/scripts/define-cuda-cc.sh @@ -7,7 +7,11 @@ CC="$1" if [ -z "$CC" ] ; then - lister=$(dirname "$0")/list-cuda-cc + if [ -f ./list-cuda-cc ] ; then + lister=./list-cuda-cc + else + lister=$(dirname "$0")/list-cuda-cc + fi read CC card <<-AVOID_SUBSHELL_PROBLEM $(${lister} | cut -f2- | sort -n | head -1) AVOID_SUBSHELL_PROBLEM @@ -25,4 +29,4 @@ fi # transform CC from major.minor to their concatenation CC=$(echo ${CC} | tr -d .) -echo "#define COMPUTE $CC /* $card */" +echo "$CC" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100755 index 00000000..da10a29b --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,69 @@ +# ===================================================== # +# Dependencies # +# ===================================================== # +IF(GPUSPH_USE_MPI) + SET(OPTIONAL_INCLUDE_PATH ${OPTIONAL_INCLUDE_PATH} ${MPI_INCLUDE_PATH}) + SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} ${MPI_LIBRARIES}) +ENDIF(GPUSPH_USE_MPI) + +IF(GPUSPH_USE_HDF5) + SET(OPTIONAL_INCLUDE_PATH ${OPTIONAL_INCLUDE_PATH} ${HDF5_INCLUDE_DIRS}) + SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} ${HDF5_LIBRARIES}) +ENDIF(GPUSPH_USE_HDF5) + +# CHRONO +IF(GPUSPH_USE_CHRONO) + SET(OPTIONAL_INCLUDE_PATH ${OPTIONAL_INCLUDE_PATH} ${CHRONO_INCLUDE_DIRS}) + SET(OPTIONAL_LIBS ${OPTIONAL_LIBS} ${CHRONO_LIBRARIES}) +ENDIF(GPUSPH_USE_CHRONO) + +# ===================================================== # +# Include & Link # +# ===================================================== # +INCLUDE_DIRECTORIES( + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/src/cuda + ${CMAKE_SOURCE_DIR}/src/geometries + ${CMAKE_SOURCE_DIR}/src/problems + ${CMAKE_SOURCE_DIR}/src/writers + ${CUDA_INCLUDE_DIRS} + ${OPTIONAL_INCLUDE_PATH} +) + +SET(DEP_LIBS + ${CUDA_LIBRARIES} + ${OPTIONAL_LIBS} +) + +# ===================================================== # +# Sources to compile # +# ===================================================== # +FILE(GLOB PROBLEM_CXX_SRCS + "*.cc" +) + +ADD_SUBDIRECTORY(cuda) +ADD_SUBDIRECTORY(geometries) +ADD_SUBDIRECTORY(writers) + +SET(PROBLEM_CUDA_SRCS "${CMAKE_SOURCE_DIR}/src/problems/${GPUSPH_PROBLEM}.cu") + +# ===================================================== # +# Target # +# ===================================================== # +SOURCE_GROUP("GPUSPH" FILES ${PROBLEM_CXX_SRCS} ${PROBLEM_CUDA_SRCS} ) +ADD_EXECUTABLE(GPUSPH ${PROBLEM_CXX_SRCS} ${PROBLEM_CUDA_SRCS}) +SET_PROPERTY(TARGET GPUSPH + PROPERTY CUDA_SEPARABLE_COMPILATION ON) +TARGET_LINK_LIBRARIES(GPUSPH ${DEP_LIBS}) + +# ===================================================== # +# Install App # +# ===================================================== # +SET_TARGET_PROPERTIES(GPUSPH PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) +SET_TARGET_PROPERTIES(GPUSPH PROPERTIES INSTALL_RPATH ${INSTALL_RPATH}) + +INSTALL(TARGETS GPUSPH + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) diff --git a/src/GPUSPH.cc b/src/GPUSPH.cc index 154d86cf..f9ebeb1a 100644 --- a/src/GPUSPH.cc +++ b/src/GPUSPH.cc @@ -51,15 +51,20 @@ #include "utils.h" /* Include only the problem selected at compile time */ +#ifdef USE_CMAKE +#include "problem.h" +#else #include "problem_select.opt" - +#endif // USE_CMAKE // HotFile #include "HotFile.h" /* Include all other opt file for show_version */ +#ifndef USE_CMAKE #include "gpusph_version.opt" #include "fastmath_select.opt" #include "compute_select.opt" +#endif // USE_CMAKE using namespace std; diff --git a/src/HDF5SphReader.cc b/src/HDF5SphReader.cc index 5f8ea0f8..152829c9 100644 --- a/src/HDF5SphReader.cc +++ b/src/HDF5SphReader.cc @@ -16,7 +16,9 @@ #include #include // UINT_MAX +#ifndef USE_CMAKE #include "hdf5_select.opt" +#endif #include diff --git a/src/NetworkManager.cc b/src/NetworkManager.cc index 2de5211b..b36039e3 100644 --- a/src/NetworkManager.cc +++ b/src/NetworkManager.cc @@ -9,7 +9,9 @@ * NetworkManager class implementation */ +#ifndef USE_CMAKE #include "mpi_select.opt" +#endif #if USE_MPI #include diff --git a/src/Problem.cc b/src/Problem.cc index d075bd91..e7eef439 100644 --- a/src/Problem.cc +++ b/src/Problem.cc @@ -58,7 +58,9 @@ // Enable to get/set envelop and margin (mainly debug) /* +#ifndef USE_CMAKE #include "chrono_select.opt" +#endif // USE_CMAKE #if USE_CHRONO == 1 #include "chrono/collision/ChCCollisionModel.h" #endif diff --git a/src/Problem.h b/src/Problem.h index 47753f66..f6df349c 100644 --- a/src/Problem.h +++ b/src/Problem.h @@ -56,7 +56,9 @@ #include "simframework.h" // #include "deprecation.h" +#ifndef USE_CMAKE #include "chrono_select.opt" +#endif #if USE_CHRONO == 1 #include "chrono/physics/ChSystem.h" #endif diff --git a/src/cuda/CMakeLists.txt b/src/cuda/CMakeLists.txt new file mode 100755 index 00000000..e587edd6 --- /dev/null +++ b/src/cuda/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB SUBFOLDER_CXX_SRCS + "*.cc" +) +LIST(APPEND PROBLEM_CXX_SRCS ${SUBFOLDER_CXX_SRCS}) + +SET(PROBLEM_CXX_SRCS ${PROBLEM_CXX_SRCS} PARENT_SCOPE) diff --git a/src/cuda/cudautil.cc b/src/cuda/cudautil.cc index 93e7438c..d10ed5a5 100644 --- a/src/cuda/cudautil.cc +++ b/src/cuda/cudautil.cc @@ -1,7 +1,10 @@ #include #include "cudautil.h" +#ifndef USE_CMAKE #include "compute_select.opt" +#endif + // TODO: errors should be thrown properly, the functions should not brutally terminate everything. // Furthermore, the number of CUDA devices could be checked before the threads are started (i.e. when checking diff --git a/src/geometries/CMakeLists.txt b/src/geometries/CMakeLists.txt new file mode 100755 index 00000000..e587edd6 --- /dev/null +++ b/src/geometries/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB SUBFOLDER_CXX_SRCS + "*.cc" +) +LIST(APPEND PROBLEM_CXX_SRCS ${SUBFOLDER_CXX_SRCS}) + +SET(PROBLEM_CXX_SRCS ${PROBLEM_CXX_SRCS} PARENT_SCOPE) diff --git a/src/geometries/Cube.cc b/src/geometries/Cube.cc index 8e8e79a8..562866ec 100644 --- a/src/geometries/Cube.cc +++ b/src/geometries/Cube.cc @@ -30,7 +30,9 @@ // for smart pointers #include +#ifndef USE_CMAKE #include "chrono_select.opt" +#endif #if USE_CHRONO == 1 #include "chrono/physics/ChBodyEasy.h" #endif diff --git a/src/geometries/Cylinder.cc b/src/geometries/Cylinder.cc index d8cfb2bb..3293738a 100644 --- a/src/geometries/Cylinder.cc +++ b/src/geometries/Cylinder.cc @@ -30,7 +30,9 @@ // for smart pointers #include +#ifndef USE_CMAKE #include "chrono_select.opt" +#endif #if USE_CHRONO == 1 #include "chrono/physics/ChBodyEasy.h" #endif diff --git a/src/geometries/EulerParameters.h b/src/geometries/EulerParameters.h index 43d8bab1..71f60376 100644 --- a/src/geometries/EulerParameters.h +++ b/src/geometries/EulerParameters.h @@ -31,7 +31,9 @@ #include "Point.h" #include "Vector.h" +#ifndef USE_CMAKE #include "chrono_select.opt" +#endif #if USE_CHRONO == 1 #include "chrono/core/ChQuaternion.h" #endif diff --git a/src/geometries/Object.h b/src/geometries/Object.h index 47e450f3..206df91e 100644 --- a/src/geometries/Object.h +++ b/src/geometries/Object.h @@ -31,7 +31,9 @@ #include "Point.h" #include "EulerParameters.h" +#ifndef USE_CMAKE #include "chrono_select.opt" +#endif #if USE_CHRONO == 1 #include "chrono/physics/ChBody.h" #include "chrono/physics/ChSystem.h" diff --git a/src/geometries/STLMesh.cc b/src/geometries/STLMesh.cc index b9d31478..f63d6764 100644 --- a/src/geometries/STLMesh.cc +++ b/src/geometries/STLMesh.cc @@ -36,7 +36,9 @@ #include +#ifndef USE_CMAKE #include "chrono_select.opt" +#endif #if USE_CHRONO == 1 #include "chrono/physics/ChBodyEasy.h" #endif diff --git a/src/linearization.h b/src/linearization.h index 1a502185..c0a259f1 100644 --- a/src/linearization.h +++ b/src/linearization.h @@ -35,4 +35,6 @@ * thus eligible for a single burst transfer. * Cells with consecutive COORD1 are consecutive in their linearized index. */ +#ifndef USE_CMAKE #include "linearization_select.opt" +#endif diff --git a/src/main.cc b/src/main.cc index 8672bbf9..23341747 100644 --- a/src/main.cc +++ b/src/main.cc @@ -39,8 +39,13 @@ #include "NetworkManager.h" // Include only the problem selected at compile time (PROBLEM, QUOTED_PROBLEM) +#ifdef USE_CMAKE +#include "problem.h" +#else #include "problem_select.opt" +#endif // USE_CMAKE +#ifndef USE_CMAKE /* Include all other opt file for show_version */ #include "chrono_select.opt" #include "compute_select.opt" @@ -49,6 +54,7 @@ #include "gpusph_version.opt" #include "hdf5_select.opt" #include "mpi_select.opt" +#endif // USE_CMAKE using namespace std; diff --git a/src/multi_gpu_defines.h b/src/multi_gpu_defines.h index b5c41a9e..a61dd0ae 100644 --- a/src/multi_gpu_defines.h +++ b/src/multi_gpu_defines.h @@ -113,6 +113,12 @@ typedef unsigned char devcount_t; #define _MULTIGPU_DEFINES_ #ifndef PROBLEM +#ifndef USE_CMAKE +#include "gpusph_version.opt" +#include "fastmath_select.opt" +#include "compute_select.opt" +#endif // USE_CMAKE + #include "problem_select.opt" #endif diff --git a/src/writers/CMakeLists.txt b/src/writers/CMakeLists.txt new file mode 100755 index 00000000..e587edd6 --- /dev/null +++ b/src/writers/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB SUBFOLDER_CXX_SRCS + "*.cc" +) +LIST(APPEND PROBLEM_CXX_SRCS ${SUBFOLDER_CXX_SRCS}) + +SET(PROBLEM_CXX_SRCS ${PROBLEM_CXX_SRCS} PARENT_SCOPE)