diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..040ebc8 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,138 @@ +# cmake compatibility issues +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) + +# project name +PROJECT(SeparableConvolutionCUDALib CXX) +if(NOT(${CMAKE_VERSION} VERSION_LESS "3.0.0")) +cmake_policy(SET CMP0042 NEW) +endif() + +# version number +SET (SEPARABLECONVOLUTIONCUDALIB_NAME "CUDA SEPARABLE CONVOLUTION LIBRARY") +SET (SEPARABLECONVOLUTIONCUDALIB_CODENAME "${PROJECT_NAME}") +SET (SEPARABLECONVOLUTIONCUDALIB_COPYRIGHT_YEARS "2013") +SET (SEPARABLECONVOLUTIONCUDALIB_VERSION_MAJOR 2) +SET (SEPARABLECONVOLUTIONCUDALIB_VERSION_MINOR 5) +SET (SEPARABLECONVOLUTIONCUDALIB_VERSION_PATCH 0) +SET (SEPARABLECONVOLUTIONCUDALIB_VERSION_TYPE SNAPSHOT) +SET (SEPARABLECONVOLUTIONCUDALIB_VERSION_STRING "${SEPARABLECONVOLUTIONCUDALIB_VERSION_MAJOR}.${SEPARABLECONVOLUTIONCUDALIB_VERSION_MINOR}.${SEPARABLECONVOLUTIONCUDALIB_VERSION_PATCH}-${CMAKE_BUILD_TYPE}") +SET (SEPARABLECONVOLUTIONCUDALIB_VERSION "${SEPARABLECONVOLUTIONCUDALIB_VERSION_MAJOR}.${SEPARABLECONVOLUTIONCUDALIB_VERSION_MINOR}.${SEPARABLECONVOLUTIONCUDALIB_VERSION_PATCH}") +SET (SEPARABLECONVOLUTIONCUDALIB_VENDOR_ID "mpi cbg") +SET (SEPARABLECONVOLUTIONCUDALIB_VENDOR_NAME "Max Planck Institute of Molecular Cell Biology and Genetics ") +SET (SEPARABLECONVOLUTIONCUDALIB_VENDOR_URL "www.mpi-cbg.de") +SET (SEPARABLECONVOLUTIONCUDALIB_ID "${SEPARABLECONVOLUTIONCUDALIB_VENDOR_ID}.${PROJECT_NAME}") + +# trying to setup paths so this package can be picked up +set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") +set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files") + +# shared path is architecture independent for now, TODO extend this to lib/bin/include +IF(UNIX) + IF(APPLE) + set(INSTALL_SHARE_DIR ${PROJECT_NAME}.app/Contents/Resources/ CACHE PATH "Installation directory for shared files") + #the following was tested with OSX 10.8.5 and Xcode 5.0.2 + #seems to me that under apple the rpath is not stripped automatically when doing the install + #under linux it is + SET(CMAKE_SKIP_RPATH ON) + ELSE(APPLE) + set(INSTALL_SHARE_DIR lib/CMake/${PROJECT_NAME} CACHE PATH "Installation directory for shared files") + ENDIF(APPLE) +ELSE(UNIX) + IF(WIN32 AND NOT CYGWIN) + set(INSTALL_SHARE_DIR CMake CACHE PATH "Installation directory for shared files") + ELSE(WIN32) + MESSAGE(FATAL_ERROR ">> UNKNOWN ARCHITECTURE .. unable to set share dir") + ENDIF(WIN32) +ENDIF(UNIX) + +# Make relative paths absolute (needed later on) +foreach(p LIB INCLUDE SHARE) + set(var INSTALL_${p}_DIR) + if(NOT IS_ABSOLUTE "${${var}}") + set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") + endif() +endforeach() + +# set project build type +IF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE Release) +ENDIF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) +MESSAGE(">> Setting up ${CMAKE_BUILD_TYPE} build") + +######################################################################################################### +## CUDA related +# project options +OPTION(INCLUDE_CUDA "Set to OFF to not search for CUDA" ON) +# find project dependencies +# find cuda +IF(INCLUDE_CUDA) + FIND_PACKAGE(CUDA) + IF(CUDA_FOUND) + SET(CUDA_VERBOSE_BUILD ON) + + set(CUDA_NVCC_FLAGS -gencode arch=compute_10,code=sm_10;-gencode arch=compute_20,code=sm_20) + SET(CUDA_HOST_COMPILER "${CMAKE_CXX_COMPILER}") + IF(APPLE) + IF(${CUDA_HOST_COMPILER} MATCHES "/usr/bin/.*cc" OR EXISTS "/usr/bin/llvm-g++") + MESSAGE(">> adapting CUDA_HOST_COMPILER (${CUDA_HOST_COMPILER}) to match a CUDA supported compiler (/usr/bin/llvm-g++-4.2)") + SET(CUDA_HOST_COMPILER "/usr/bin/llvm-g++") + SET(CMAKE_CXX_COMPILER ${CUDA_HOST_COMPILER}) + SET(CMAKE_C_COMPILER "/usr/bin/llvm-gcc") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libstdc++") + + SET(CUDA_PROPAGATE_HOST_FLAGS OFF) + ELSE() + MESSAGE(WARNING ">> unknown CUDA_HOST_COMPILER (${CUDA_HOST_COMPILER}) or /usr/bin/llvm-g++-4.2 does not exist, cuda host compiler remains set to default") + ENDIF() + ENDIF(APPLE) + IF("${CUDA_VERSION}" VERSION_GREATER "5" OR "${CUDA_VERSION}" VERSION_EQUAL "5") + MESSAGE(">> compiling for Compute Capability 2.x, 3.0 and 3.5 only ") + set(CUDA_NVCC_FLAGS "-gencode arch=compute_20,code=sm_20;-gencode arch=compute_30,code=sm_30;-gencode arch=compute_35,code=sm_35") + ELSE() + MESSAGE(">> CUDA less than version 5.0 detected, compiling for Compute Capability 2.x only ") + set(CUDA_NVCC_FLAGS "-gencode arch=compute_20,code=sm_20;-gencode arch=compute_10,code=sm_10") + ENDIF() + set(CUDA_NVCC_FLAGS_RELEASE ${CUDA_NVCC_FLAGS_RELEASE};-O2;--use_fast_math) + set(CUDA_NVCC_FLAGS_DEBUG ${CUDA_NVCC_FLAGS_DEBUG};-g;-G) + ELSE(CUDA_FOUND) + MESSAGE(FATAL_ERROR ">> CUDA not found. Exiting ...") + ENDIF(CUDA_FOUND) +ENDIF(INCLUDE_CUDA) + + +# add subdirectories +ADD_SUBDIRECTORY(src) + +# Export the package for use from the build-tree +# (this registers the build-tree with a global CMake-registry) +# v = binary v = library + +export(PACKAGE ${PROJECT_NAME}) + +# Create the separableconvolutioncudalib-config.cmake and separableconvolutioncudalib-config-version files +file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_SHARE_DIR}" + "${INSTALL_INCLUDE_DIR}") +# ... for the build tree +set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}") +configure_file(separableconvolutioncudalib-config.cmake.in + "${PROJECT_BINARY_DIR}/separableconvolutioncudalib-config.cmake" @ONLY) +# ... for the install tree +set(CONF_INCLUDE_DIRS "\${SEPARABLECONVOLUTIONCUDALIB}/${REL_INCLUDE_DIR}") +configure_file(separableconvolutioncudalib-config.cmake.in + "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/separableconvolutioncudalib-config.cmake" @ONLY) +# ... for both +configure_file(separableconvolutioncudalib-config-version.cmake.in + "${PROJECT_BINARY_DIR}/separableconvolutioncudalib-config-version.cmake" @ONLY) + +# Install the separableconvolutioncudalib-config.cmake and separableconvolutioncudalib-config-version.cmake +install(FILES + "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/separableconvolutioncudalib-config.cmake" + "${PROJECT_BINARY_DIR}/separableconvolutioncudalib-config-version.cmake" + DESTINATION "${INSTALL_SHARE_DIR}" COMPONENT dev) + +# Install the export set for use with the install-tree +install(EXPORT separableconvolutioncudalib-targets + DESTINATION "${INSTALL_SHARE_DIR}" COMPONENT dev) + + + diff --git a/README.md b/README.md index 48053e6..2360d42 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ SeparableConvolutionCUDALib Implementation of 1/2/3d separable convolution using CUDA. +Windows Build Instructions +-------------------------- + To compile it under Linux/Mac/Windows I suggest NSight. Clone this repository into your cuda-workspace directory. Then make a new shared library project with the same name as the directory. Under Project > Properties > Build > Settings > Tool Settings > NVCC Linker add -lcuda to the command line pattern so that it looks like this: ${COMMAND} ${FLAGS} -lcuda ${OUTPUT_FLAG} ${OUTPUT_PREFIX} ${OUTPUT} ${INPUTS} @@ -10,3 +13,17 @@ ${COMMAND} ${FLAGS} -lcuda ${OUTPUT_FLAG} ${OUTPUT_PREFIX} ${OUTPUT} ${INPUTS} Now build the .so/.dll library and put it into the Fiji directory. NOTE: If you are compiling under Windows, you need to change all 'extern "C"' definitions to 'extern "C" __declspec(dllexport)' for all function calls in the separableConvolution.h and all separableConvolution_*.cu. + +OSX/Linux Build Instructions +---------------------------- + +First, make sure that CUDA must be available through `PATH`, `LD_LIBRARY_PATH` or equivalent. The build system is based on cmake, so please install this at any version higher or equal than 2.8. + +```bash +$ cd /path/to/repo +$ mkdir build +$ cd build +$ cmake -DCMAKE_INSTALL_PREFIX=/directory/of/your/choice .. #default is /usr/bin/ or similar +$ make +$ make install +``` diff --git a/separableconvolutioncudalib-config-version.cmake.in b/separableconvolutioncudalib-config-version.cmake.in new file mode 100644 index 0000000..88c8c51 --- /dev/null +++ b/separableconvolutioncudalib-config-version.cmake.in @@ -0,0 +1,11 @@ +set(PACKAGE_VERSION "@SEPARABLECONVOLUTIONCUDALIB_VERSION@") + +# Check whether the requested PACKAGE_FIND_VERSION is compatible +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() diff --git a/separableconvolutioncudalib-config.cmake.in b/separableconvolutioncudalib-config.cmake.in new file mode 100644 index 0000000..9dc156d --- /dev/null +++ b/separableconvolutioncudalib-config.cmake.in @@ -0,0 +1,33 @@ +# - Config file for the FooBar package +# It defines the following variables +# SEPARABLECONVOLUTIONCUDALIB_INCLUDE_DIRS - include directories for separableconvolutioncudalib +# SEPARABLECONVOLUTIONCUDALIB_LIBRARIES - libraries to link against +# SEPARABLECONVOLUTIONCUDALIB_EXECUTABLE - the bar executable + +# Compute paths +get_filename_component(SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) + + +# Our library dependencies (contains definitions for IMPORTED targets) +include("${SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR}/separableconvolutioncudalib-targets.cmake") + +# These are IMPORTED targets created by separableconvolutioncudalib-targets.cmake +IF(UNIX) + IF(APPLE) + get_filename_component(SEPARABLECONVOLUTIONCUDALIB_INCLUDE_DIRS "${SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR}/../../include" ABSOLUTE) + get_filename_component(SEPARABLECONVOLUTIONCUDALIB_LIB_DIRS "${SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR}/../../lib" ABSOLUTE) + get_filename_component(SEPARABLECONVOLUTIONCUDALIB_BIN_DIRS "${SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR}/../../bin" ABSOLUTE) + ELSE(APPLE) + get_filename_component(SEPARABLECONVOLUTIONCUDALIB_INCLUDE_DIRS "${SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR}/../../../include" ABSOLUTE) + get_filename_component(SEPARABLECONVOLUTIONCUDALIB_LIB_DIRS "${SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR}/../../../lib" ABSOLUTE) + get_filename_component(SEPARABLECONVOLUTIONCUDALIB_BIN_DIRS "${SEPARABLECONVOLUTIONCUDALIB_CMAKE_DIR}/../../../bin" ABSOLUTE) + ENDIF(APPLE) +ENDIF(UNIX) + +set(SEPARABLECONVOLUTIONCUDALIB_LIBRARIES "${SEPARABLECONVOLUTIONCUDALIB_LIB_DIRS}/libSeparableConvolutionCUDALib.so") + +set(SEPARABLECONVOLUTIONCUDALIB_VERSION "@SEPARABLECONVOLUTIONCUDALIB_VERSION@") +set(SEPARABLECONVOLUTIONCUDALIB_VERSION_MAJOR "@SEPARABLECONVOLUTIONCUDALIB_VERSION_MAJOR@") +set(SEPARABLECONVOLUTIONCUDALIB_VERSION_MINOR "@SEPARABLECONVOLUTIONCUDALIB_VERSION_MINOR@") +set(SEPARABLECONVOLUTIONCUDALIB_VERSION_PATCH "@SEPARABLECONVOLUTIONCUDALIB_VERSION_PATCH@") +set(SEPARABLECONVOLUTIONCUDALIB_BUILD_TYPE "@CMAKE_BUILD_TYPE@") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..a42bf03 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,25 @@ +# include directories +# src directory +INCLUDE_DIRECTORIES(.) + +# build and link +FIND_PACKAGE(CUDA QUIET) +CUDA_ADD_LIBRARY(${PROJECT_NAME} separableConvolution_255.cu separableConvolution_127.cu separableConvolution_63.cu separableConvolution_31.cu separableConvolution_15.cu separableConvolution_7.cu standardCUDAfunctions.cu SHARED) +CUDA_ADD_CUFFT_TO_TARGET(${PROJECT_NAME}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} cuda) + +IF(APPLE) +MESSAGE("adding ${CUDA_TOOLKIT_ROOT_DIR}/lib/libcuda.dylib") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CUDA_TOOLKIT_ROOT_DIR}/lib/libcuda.dylib) + ENDIF(APPLE) + + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${PROJECT_SOURCE_DIR}/src/separableConvolution.h") +INSTALL(TARGETS ${PROJECT_NAME} + EXPORT separableconvolutioncudalib-targets + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib + PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}" COMPONENT inc) + + + +