-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
124 lines (110 loc) · 3.78 KB
/
CMakeLists.txt
File metadata and controls
124 lines (110 loc) · 3.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
cmake_minimum_required(VERSION 3.18)
project(Sparsity
VERSION 0.1.0
DESCRIPTION "Natively hybrid C++ vector similarity search library"
LANGUAGES CXX
)
# ---------------------------------------------------------------------------
# Options
# ---------------------------------------------------------------------------
option(WITH_CUDA "Enable CUDA acceleration" OFF)
option(BUILD_TESTS "Build unit tests" ON)
option(BUILD_BENCHMARKS "Build benchmarks" ON)
option(BUILD_PYTHON "Build Python bindings" OFF)
# ---------------------------------------------------------------------------
# C++ standard
# ---------------------------------------------------------------------------
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# ---------------------------------------------------------------------------
# CUDA (optional)
# ---------------------------------------------------------------------------
if(WITH_CUDA)
enable_language(CUDA)
find_package(CUDAToolkit REQUIRED)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
add_compile_definitions(WITH_CUDA)
message(STATUS "CUDA enabled — toolkit: ${CUDAToolkit_VERSION}")
else()
message(STATUS "CUDA disabled (pass -DWITH_CUDA=ON to enable)")
endif()
# ---------------------------------------------------------------------------
# Core library sources
# ---------------------------------------------------------------------------
set(SPARSITY_SOURCES
src/core/metrics/l2.cpp
src/core/metrics/cosine.cpp
src/core/metrics/tanimoto.cpp
src/core/metrics/sparse.cpp
src/core/packing.cpp
src/core/sparse.cpp
src/core/binary.cpp
src/core/blocked_ell.cpp
src/core/index.cpp
src/core/dispatch.cpp
src/core/kmeans.cpp
src/core/ivf.cpp
src/core/tiled_dense.cpp
)
if(WITH_CUDA)
list(APPEND SPARSITY_SOURCES
src/cuda/metrics/l2.cu
src/cuda/metrics/l2_tiled.cu
src/cuda/metrics/cosine.cu
src/cuda/metrics/tanimoto.cu
src/cuda/topk.cu
src/cuda/sparse_dot.cu
)
endif()
add_library(sparsity STATIC ${SPARSITY_SOURCES})
target_include_directories(sparsity PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_compile_options(sparsity PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-Wall -Wextra -Wpedantic>
$<$<CONFIG:Release>:-O3 -march=native>
$<$<CONFIG:Debug>:-O0 -g>
)
if(WITH_CUDA)
target_link_libraries(sparsity PRIVATE CUDA::cudart)
target_compile_options(sparsity PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:--expt-relaxed-constexpr -O3>
)
endif()
# ---------------------------------------------------------------------------
# clang-format target
# ---------------------------------------------------------------------------
find_program(CLANG_FORMAT clang-format)
if(CLANG_FORMAT)
file(GLOB_RECURSE ALL_CXX_FILES
"${CMAKE_SOURCE_DIR}/include/*.h"
"${CMAKE_SOURCE_DIR}/src/*.cpp"
"${CMAKE_SOURCE_DIR}/src/*.cu"
"${CMAKE_SOURCE_DIR}/tests/*.cpp"
"${CMAKE_SOURCE_DIR}/python/bindings/*.cpp"
)
add_custom_target(format
COMMAND ${CLANG_FORMAT} -i ${ALL_CXX_FILES}
COMMENT "Running clang-format on all source files"
VERBATIM
)
else()
message(STATUS "clang-format not found — 'make format' target unavailable")
endif()
# ---------------------------------------------------------------------------
# Subdirectories
# ---------------------------------------------------------------------------
if(BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
if(BUILD_BENCHMARKS)
add_subdirectory(benchmarks)
endif()
if(BUILD_PYTHON)
add_subdirectory(python)
endif()