-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
131 lines (114 loc) · 4.67 KB
/
Copy pathCMakeLists.txt
File metadata and controls
131 lines (114 loc) · 4.67 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
125
126
127
128
129
130
131
cmake_minimum_required(VERSION 3.20)
project(ArrowBpacking CXX)
include(CheckCXXCompilerFlag)
set(ARROW_NORMAL_SOURCES
arrow/status.cc
arrow/util/bpacking.cc
arrow/util/bpacking_scalar.cc
arrow/util/bpacking_scalar_exact.cc
arrow/util/cpu_info.cc
arrow/util/string.cc
arrow/util/string_util.cc
)
# Collect SIMD compile definitions and per-file flags
set(ARROW_SIMD_DEFAULT_SOURCES
arrow/util/bpacking_simd_default.cc
arrow/util/bpacking_simd_default_no_dispatch.cc
arrow/util/bpacking_simd_default_old.cc
arrow/util/bpacking_simd_default_scalar_batch.cc
arrow/util/bpacking_simd_default_exact.cc
)
set(ARROW_SSE42_SOURCES
arrow/util/bpacking_littleintpacker_sse42.cc
)
set(ARROW_SIMD_AVX2_SOURCES
arrow/util/bpacking_simd_avx2.cc
arrow/util/bpacking_simd_avx2_no_dispatch.cc
arrow/util/bpacking_simd_avx2_old.cc
arrow/util/bpacking_simd_avx2_scalar_batch.cc
arrow/util/bpacking_simd_avx2_exact.cc
)
set(ARROW_SIMD_AVX512_SOURCES
arrow/util/bpacking_simd_avx512.cc
arrow/util/bpacking_simd_avx512_scalar_batch.cc
arrow/util/bpacking_simd_avx512_exact.cc
)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
# Explicitly disable simd to compare the NoSimd function
set_source_files_properties(
${ARROW_NORMAL_SOURCES}
PROPERTIES COMPILE_FLAGS "-mno-sse"
)
check_cxx_compiler_flag("-msse4.2" COMPILER_SUPPORTS_SSE4_2)
if(COMPILER_SUPPORTS_SSE4_2)
list(APPEND ARROW_COMPILE_DEFINITIONS ARROW_HAVE_SSE4_2)
list(APPEND ARROW_SIMD_SOURCES ${ARROW_SIMD_DEFAULT_SOURCES})
list(APPEND ARROW_SIMD_SOURCES ${ARROW_SSE42_SOURCES})
# Explicitly disable AVX2/AVX512 so these TUs only use SSE4.2 intrinsics
set_source_files_properties(
${ARROW_SIMD_DEFAULT_SOURCES}
${ARROW_SSE42_SOURCES}
PROPERTIES COMPILE_FLAGS "-msse4.2 -mno-avx2 -mno-avx512f"
)
endif()
check_cxx_compiler_flag("-mavx2" COMPILER_SUPPORTS_AVX2)
if(COMPILER_SUPPORTS_AVX2)
list(APPEND ARROW_COMPILE_DEFINITIONS ARROW_HAVE_RUNTIME_AVX2)
list(APPEND ARROW_SIMD_SOURCES ${ARROW_SIMD_AVX2_SOURCES})
# Per-file flag so only these TUs are compiled with avx2 intrinsics
set_source_files_properties(
${ARROW_SIMD_AVX2_SOURCES}
PROPERTIES COMPILE_FLAGS "-mavx2 -mno-avx512f"
)
endif()
check_cxx_compiler_flag("-mavx512f" COMPILER_SUPPORTS_AVX512)
if(COMPILER_SUPPORTS_AVX512)
list(APPEND ARROW_COMPILE_DEFINITIONS ARROW_HAVE_RUNTIME_AVX512)
list(APPEND ARROW_SIMD_SOURCES ${ARROW_SIMD_AVX512_SOURCES})
set_source_files_properties(
${ARROW_SIMD_AVX512_SOURCES}
PROPERTIES COMPILE_FLAGS "-mavx512f -mavx512bw -mavx512cd -mavx512dq -mavx512vl"
)
endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
# Explicitly disable simd to compare the NoSimd function
set_source_files_properties(
${ARROW_NORMAL_SOURCES}
PROPERTIES COMPILE_FLAGS "-march=armv8-a+nosimd"
)
list(APPEND ARROW_COMPILE_DEFINITIONS ARROW_HAVE_NEON)
list(APPEND ARROW_SIMD_SOURCES ${ARROW_SIMD_DEFAULT_SOURCES})
set(NEON_COMPILE_FLAGS "-march=armv8-a+simd")
check_cxx_compiler_flag("-mno-sve" COMPILER_SUPPORTS_NO_SVE)
if(COMPILER_SUPPORTS_NO_SVE)
string(APPEND NEON_COMPILE_FLAGS " -mno-sve")
endif()
set_source_files_properties(
${ARROW_SIMD_DEFAULT_SOURCES}
PROPERTIES COMPILE_FLAGS "${NEON_COMPILE_FLAGS}"
)
endif()
# Library
find_package(xsimd REQUIRED)
set(ARROW_SOURCES ${ARROW_NORMAL_SOURCES} ${ARROW_SIMD_SOURCES})
add_library(arrow ${ARROW_SOURCES})
target_compile_features(arrow PUBLIC cxx_std_20)
target_include_directories(arrow PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(arrow PUBLIC xsimd)
target_compile_definitions(arrow PRIVATE ${ARROW_COMPILE_DEFINITIONS})
# On Windows, mark symbols as exported when building the DLL
if(BUILD_SHARED_LIBS)
target_compile_definitions(arrow PRIVATE ARROW_EXPORTING)
endif()
# Tests
find_package(GTest REQUIRED)
enable_testing()
add_executable(bpacking_test arrow/util/bpacking_test.cc arrow/testing/util.cc)
target_link_libraries(bpacking_test PRIVATE arrow GTest::gtest GTest::gtest_main)
target_compile_definitions(bpacking_test PRIVATE ${ARROW_COMPILE_DEFINITIONS})
add_test(NAME bpacking_test COMMAND bpacking_test)
# Benchmarks
find_package(benchmark REQUIRED)
add_executable(bpacking_benchmark arrow/util/bpacking_benchmark.cc arrow/testing/util.cc)
target_link_libraries(bpacking_benchmark PRIVATE arrow benchmark::benchmark benchmark::benchmark_main)
target_compile_definitions(bpacking_benchmark PRIVATE ${ARROW_COMPILE_DEFINITIONS})