Skip to content

Commit

Permalink
Update CMake configuration for CUDA support and simplify pybind11 int…
Browse files Browse the repository at this point in the history
…egration
  • Loading branch information
absternator committed Feb 25, 2025
1 parent bc215c2 commit 6b70726
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 18 deletions.
35 changes: 18 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.19)
project(SCE)
set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ version selection")
cmake_policy(SET CMP0104 NEW) # Can't get CUDA_ARCHITECTURES to work with NEW
cmake_policy(SET CMP0104 OLD) # Can't get CUDA_ARCHITECTURES to work with NEW

# Variable definitions
set(TARGET_NAME SCE)
Expand All @@ -13,8 +13,6 @@ ENDIF()

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")


# Set these to profile
# set(CMAKE_CXX_FLAGS_RELEASE "-O2 -g")
# set(CMAKE_CUDA_FLAGS_RELEASE "-O2 -DUSE_CUDA_PROFILER")
Expand All @@ -37,8 +35,7 @@ endif()
# Add libraries
find_package(ZLIB REQUIRED)
find_package(Boost REQUIRED)
find_package(Python COMPONENTS Interpreter Development REQUIRED)
find_package(pybind11 CONFIG REQUIRED)
find_package(pybind11 REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

# Check for CUDA and compiles GPU library
Expand All @@ -62,36 +59,40 @@ if(CMAKE_CUDA_COMPILER)
set(CMAKE_CUDA_FLAGS "${CUDA_OPTS}")

add_compile_definitions(GPU_AVAILABLE)
# Create Python extension module with CUDA support
pybind11_add_module(${TARGET_NAME}_CUDA src/wtsne_gpu.cu)

# Set CUDA properties (optional, but recommended)
set_target_properties(${TARGET_NAME}_CUDA PROPERTIES
CUDA_SEPARABLE_COMPILATION ON # Allows linking multiple CUDA files
POSITION_INDEPENDENT_CODE ON # Required for shared libraries
)
add_library("${TARGET_NAME}_CUDA" OBJECT src/wtsne_gpu.cu)
target_include_directories("${TARGET_NAME}_CUDA" PRIVATE "${pybind11_INCLUDE_DIRS}")
set_property(TARGET "${TARGET_NAME}_CUDA"
PROPERTY POSITION_INDEPENDENT_CODE ON
CUDA_SEPARABLE_COMPILATION OFF
CUDA_RESOLVE_DEVICE_SYMBOLS ON # try and ensure device link with nvcc
CUDA_VISIBILITY_PRESET "hidden")
else()
message(STATUS "CUDA not found, compiling CPU code only")
endif()

# Compile CPU library
pybind11_add_module("${TARGET_NAME}" src/wtsne_cpu.cpp src/python_bindings.cpp)

add_library("${TARGET_NAME}" MODULE src/wtsne_cpu.cpp src/python_bindings.cpp)
set_target_properties("${TARGET_NAME}" PROPERTIES
CXX_VISIBILITY_PRESET "hidden"
PREFIX "${PYTHON_MODULE_PREFIX}"
SUFFIX "${PYTHON_MODULE_EXTENSION}"
)
if(UNIX AND (NOT APPLE OR NOT CMAKE_COMPILER_IS_GNUCC))
set_target_properties("${TARGET_NAME}" PROPERTIES
INTERPROCEDURAL_OPTIMIZATION ON)
endif()

if(CMAKE_CUDA_COMPILER)
target_link_libraries("${TARGET_NAME}" PRIVATE "${TARGET_NAME}_CUDA")
set_property(TARGET "${TARGET_NAME}" PROPERTY CUDA_RESOLVE_DEVICE_SYMBOLS ON)
endif()

if(DEFINED ENV{CONDA_PREFIX} AND (NOT APPLE OR CMAKE_COMPILER_IS_GNUCC OR "$ENV{SCE_BUILD_ENV}" STREQUAL "conda_forge"))
target_link_libraries("${TARGET_NAME}" PRIVATE pybind11::module)
if(DEFINED ENV{CONDA_PREFIX} AND (NOT APPLE OR CMAKE_COMPILER_IS_GNUCC OR ENV{SCE_BUILD_ENV} EQUAL "conda_forge"))
target_link_libraries("${TARGET_NAME}" PRIVATE gomp z)
else()
target_link_libraries("${TARGET_NAME}" PRIVATE ZLIB::ZLIB)
if(OpenMP_CXX_FOUND)
target_link_libraries("${TARGET_NAME}" PRIVATE OpenMP::OpenMP_CXX)
endif()
endif()

2 changes: 1 addition & 1 deletion environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ dependencies:
- hdbscan
- h5py
- pp-sketchlib >=1.7.0
- pybind11 >= 2.12.0
- pybind11
- zlib
- cmake >= 3.19
- libgomp
Expand Down

0 comments on commit 6b70726

Please sign in to comment.