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
138 changes: 138 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)



17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,27 @@ 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}

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
```
11 changes: 11 additions & 0 deletions separableconvolutioncudalib-config-version.cmake.in
Original file line number Diff line number Diff line change
@@ -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()
33 changes: 33 additions & 0 deletions separableconvolutioncudalib-config.cmake.in
Original file line number Diff line number Diff line change
@@ -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@")
25 changes: 25 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)