-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
307 lines (267 loc) · 13.1 KB
/
CMakeLists.txt
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
cmake_minimum_required(VERSION 3.10)
project(lib842)
if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
set(STANDALONE_BUILD TRUE)
endif()
if(STANDALONE_BUILD)
include(CTest)
endif()
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Avoid 'ignoring attributes on template argument' spam because of types such as std::vector<cl_int>
# See https://github.com/KhronosGroup/OpenCL-CLHPP/issues/37 for more information
if (CMAKE_COMPILER_IS_GNUCXX AND ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0) OR (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 6.0)))
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-ignored-attributes")
endif()
################
# DEPENDENCIES #
################
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
try_compile(CRYPTODEV_LINUX_COMP_FOUND
"${CMAKE_BINARY_DIR}/temp"
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_cryptodev_linux_comp.c")
include(CheckSymbolExists)
check_symbol_exists(accel_compress "sys/types.h;sys/vminfo.h" AIX_HWCOMPRESSION_FOUND)
find_package(OpenCL)
find_package(CUDA)
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
find_package(OpenMP)
find_package(NUMA)
find_package(PGASUS)
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
add_compile_options(
-maltivec
-mabi=altivec
-mvsx
)
else()
add_compile_options(
-march=native
)
endif()
###########
# LIBRARY #
###########
set(SRCFILES)
# Serial (unoptimized / fallback) implementation
set(SRCFILES ${SRCFILES} src/serial/842_compress.c
src/serial/842_decompress.c)
# Optimized implementation
set(SRCFILES ${SRCFILES} src/serial_optimized/842_compress.cpp
src/serial_optimized/842_decompress.cpp
src/serial_optimized/bitstream.cpp)
# In-kernel, possibly hardware-accelerated implementation (cryptodev)
if(CRYPTODEV_LINUX_COMP_FOUND)
set(LIB842_HAVE_CRYPTODEV_LINUX_COMP ON)
set(SRCFILES ${SRCFILES} src/cryptodev/842_interface.c)
endif()
if (AIX_HWCOMPRESSION_FOUND)
set(LIB842_HAVE_AIX_HWCOMPRESSION ON)
set(SRCFILES ${SRCFILES} src/aix/aix.c)
endif()
# Streams
set(SRCFILES ${SRCFILES} src/stream/DataCompressionStream.cpp
src/stream/DataDecompressionStream.cpp
src/stream/numa_spread.cpp)
# OpenCL implementation
if (OpenCL_FOUND)
set(LIB842_HAVE_OPENCL ON)
add_executable(cl2c src/tools/cl2c.cpp)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/decompress_cl_842defs.c"
COMMAND cl2c "${CMAKE_CURRENT_SOURCE_DIR}/src/common/842.h" "${CMAKE_CURRENT_BINARY_DIR}/decompress_cl_842defs.c" LIB842_CLDECOMPRESS_842DEFS_SOURCE
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/common/842.h")
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/decompress_cl_kernel.c"
COMMAND cl2c "${CMAKE_CURRENT_SOURCE_DIR}/src/ocl/decompress.cl" "${CMAKE_CURRENT_BINARY_DIR}/decompress_cl_kernel.c" LIB842_CLDECOMPRESS_KERNEL_SOURCE
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/ocl/decompress.cl")
set(SRCFILES ${SRCFILES} src/ocl/cl842decompress.cpp decompress_cl_842defs.c decompress_cl_kernel.c)
endif()
# CUDA implementation
if (CUDA_FOUND)
set(LIB842_HAVE_CUDA ON)
set(SRCFILES ${SRCFILES} src/cuda/842_decompress.cu)
endif()
configure_file(include/lib842/config.h.in include/lib842/config.h @ONLY)
if (CUDA_FOUND)
# NB: This is necessary for the CUDA build to work on CMake 3.5.1,
# as it appears that (target_)include_directories is not respected there
cuda_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}/include")
cuda_add_library(842 STATIC ${SRCFILES})
else ()
add_library(842 STATIC ${SRCFILES})
endif()
set_property(TARGET 842 PROPERTY POSITION_INDEPENDENT_CODE ON)
target_include_directories(842 PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}/include")
if (OpenCL_FOUND)
target_include_directories(842 PRIVATE ${OpenCL_INCLUDE_DIRS})
target_link_libraries(842 ${OpenCL_LIBRARIES})
target_compile_definitions(842 PRIVATE CL_TARGET_OPENCL_VERSION=120
CL_HPP_MINIMUM_OPENCL_VERSION=120
CL_HPP_TARGET_OPENCL_VERSION=120
CL_HPP_ENABLE_EXCEPTIONS)
endif()
if (CMAKE_USE_PTHREADS_INIT AND NUMA_FOUND)
target_compile_definitions(842 PRIVATE "LIB842_HAVE_NUMA")
target_link_libraries(842 NUMA::NUMA)
endif()
if(CRYPTODEV_LINUX_COMP_FOUND)
target_link_libraries(842 Threads::Threads)
endif()
###########
# SAMPLES #
###########
if(STANDALONE_BUILD)
add_executable(test_serial sample/compdecomp.c sample/compdecomp_driver.c)
target_link_libraries(test_serial 842)
if (OpenMP_C_FOUND)
target_link_libraries(test_serial OpenMP::OpenMP_C)
endif()
add_executable(test_serial_optimized sample/compdecomp.c sample/compdecomp_driver.c)
target_compile_definitions(test_serial_optimized PRIVATE "USEOPTSW")
target_link_libraries(test_serial_optimized 842)
if (OpenMP_C_FOUND)
target_link_libraries(test_serial_optimized OpenMP::OpenMP_C)
endif()
add_executable(test_serial_optimized_streams sample/compdecomp_streams.cpp sample/compdecomp_driver.c)
target_compile_definitions(test_serial_optimized_streams PRIVATE "USEOPTSW")
target_link_libraries(test_serial_optimized_streams 842 Threads::Threads)
if(PGASUS_FOUND AND NUMA_FOUND)
message(STATUS "Found PGASUS: \"${PGASUS_LIBRARIES}\"")
add_executable(test_serial_optimized_pgasus sample/compdecomp_pgasus.cpp)
target_link_libraries(test_serial_optimized_pgasus 842 ${PGASUS_LIBRARIES})
target_include_directories(test_serial_optimized_pgasus PRIVATE ${PGASUS_INCLUDE_DIRS})
if (OpenMP_CXX_FOUND)
add_executable(test_serial_optimized_pgasus_omp sample/compdecomp_pgasus_omp.cpp)
target_link_libraries(test_serial_optimized_pgasus_omp 842 ${PGASUS_LIBRARIES} OpenMP::OpenMP_CXX)
target_include_directories(test_serial_optimized_pgasus_omp PRIVATE ${PGASUS_INCLUDE_DIRS})
endif()
endif()
if (CRYPTODEV_LINUX_COMP_FOUND)
add_executable(test_cryptodev sample/compdecomp.c sample/compdecomp_driver.c)
target_compile_definitions(test_cryptodev PRIVATE "USEHW")
target_link_libraries(test_cryptodev 842)
if (OpenMP_C_FOUND)
target_link_libraries(test_cryptodev OpenMP::OpenMP_C)
endif()
add_executable(test_cryptodev_streams sample/compdecomp_streams.cpp sample/compdecomp_driver.c)
target_compile_definitions(test_cryptodev_streams PRIVATE "USEHW")
target_link_libraries(test_cryptodev_streams 842 Threads::Threads)
endif()
if (AIX_HWCOMPRESSION_FOUND)
add_executable(test_aix_standalone sample/compdecomp.c sample/compdecomp_driver.c)
target_compile_definitions(test_aix_standalone PRIVATE "USEAIX")
target_link_libraries(test_aix_standalone 842)
if (OpenMP_C_FOUND)
target_link_libraries(test_aix_standalone OpenMP::OpenMP_C)
endif()
endif()
if (CUDA_FOUND)
# Hacky to mix OpenMP with CUDA (using FindCUDA)
# Should get cleaner with CMake 3.10+ and CUDA as a first-class language
set(OpenMP_CUDA_FLAGS "")
if (OpenMP_CXX_FOUND)
foreach (FLAG ${OpenMP_CXX_FLAGS})
set(OpenMP_CUDA_FLAGS "${OpenMP_CUDA_FLAGS}--compiler-options;${FLAG};")
endforeach()
endif()
cuda_add_executable(test_cuda sample/compdecomp.cu OPTIONS ${OpenMP_CUDA_FLAGS})
target_link_libraries(test_cuda 842)
target_link_libraries(test_cuda ${OpenMP_CXX_FLAGS})
endif()
if (OpenCL_FOUND)
add_executable(test_ocl sample/compdecomp_cl.cpp sample/compdecomp_driver.c)
target_link_libraries(test_ocl 842 ${OpenCL_LIBRARIES})
target_include_directories(test_ocl PRIVATE ${OpenCL_INCLUDE_DIRS})
target_compile_definitions(test_ocl PRIVATE CL_TARGET_OPENCL_VERSION=120
CL_HPP_MINIMUM_OPENCL_VERSION=120
CL_HPP_TARGET_OPENCL_VERSION=120
CL_HPP_ENABLE_EXCEPTIONS)
if (OpenMP_CXX_FOUND)
target_link_libraries(test_ocl OpenMP::OpenMP_CXX)
endif()
add_executable(test_ocl_inplace sample/compdecomp_cl.cpp sample/compdecomp_driver.c)
target_compile_definitions(test_ocl_inplace PRIVATE "USE_INPLACE_COMPRESSED_CHUNKS")
target_link_libraries(test_ocl_inplace 842 ${OpenCL_LIBRARIES})
target_include_directories(test_ocl_inplace PRIVATE ${OpenCL_INCLUDE_DIRS})
target_compile_definitions(test_ocl_inplace PRIVATE CL_TARGET_OPENCL_VERSION=120
CL_HPP_MINIMUM_OPENCL_VERSION=120
CL_HPP_TARGET_OPENCL_VERSION=120
CL_HPP_ENABLE_EXCEPTIONS)
if (OpenMP_CXX_FOUND)
target_link_libraries(test_ocl_inplace OpenMP::OpenMP_CXX)
endif()
add_executable(test_ocl_maybe sample/compdecomp_cl.cpp sample/compdecomp_driver.c)
target_compile_definitions(test_ocl_maybe PRIVATE "USE_MAYBE_COMPRESSED_CHUNKS")
target_link_libraries(test_ocl_maybe 842 ${OpenCL_LIBRARIES})
target_include_directories(test_ocl_maybe PRIVATE ${OpenCL_INCLUDE_DIRS})
target_compile_definitions(test_ocl_maybe PRIVATE CL_TARGET_OPENCL_VERSION=120
CL_HPP_MINIMUM_OPENCL_VERSION=120
CL_HPP_TARGET_OPENCL_VERSION=120
CL_HPP_ENABLE_EXCEPTIONS)
if (OpenMP_CXX_FOUND)
target_link_libraries(test_ocl_maybe OpenMP::OpenMP_CXX)
endif()
endif()
endif()
###################
# AUTOMATIC TESTS #
###################
if(STANDALONE_BUILD AND BUILD_TESTING)
foreach(test test_compress_pattern
test_compress_pattern_unaligned
test_compress_pattern_halfsmall
test_compress_pattern_barelysmall
test_compress_diffuse
test_compress_notmultipleof8
test_decompress_pattern
test_decompress_pattern_unaligned
test_decompress_pattern_halfsmall
test_decompress_pattern_barelysmall
test_decompress_invalid_simple
test_decompress_invalid_generator
test_decompress_crcerror
test_decompress_boundscheck)
add_executable(${test} test/${test}.c test/test_patterns.c test/test_util.c)
target_link_libraries(${test} 842)
endforeach()
set(IMPLS_COMPRESS sw optsw)
set(IMPLS_DECOMPRESS sw optsw)
if (CRYPTODEV_LINUX_COMP_FOUND)
set(IMPLS_COMPRESS ${IMPLS_COMPRESS} hw)
set(IMPLS_DECOMPRESS ${IMPLS_DECOMPRESS} hw)
endif()
if (OpenCL_FOUND)
set(IMPLS_DECOMPRESS ${IMPLS_DECOMPRESS} cl)
endif()
set(PATTERNS empty zeros random mixed limit text)
foreach (IMPL ${IMPLS_COMPRESS})
foreach(PATTERN ${PATTERNS})
foreach (IMPLD ${IMPLS_DECOMPRESS})
add_test(test_compress_pattern_${IMPL}_${IMPLD}_${PATTERN} test_compress_pattern ${IMPL} ${IMPLD} ${PATTERN})
endforeach()
add_test(test_compress_pattern_unaligned_${IMPL}_${PATTERN} test_compress_pattern_unaligned ${IMPL} ${PATTERN})
add_test(test_compress_pattern_halfsmall_${IMPL}_${PATTERN} test_compress_pattern_halfsmall ${IMPL} ${PATTERN})
add_test(test_compress_pattern_barelysmall_${IMPL}_${PATTERN} test_compress_pattern_barelysmall ${IMPL} ${PATTERN})
endforeach()
add_test(test_compress_diffuse_${IMPL} test_compress_diffuse ${IMPL})
add_test(test_compress_notmultipleof8_${IMPL} test_compress_notmultipleof8 ${IMPL})
endforeach()
foreach (IMPL ${IMPLS_DECOMPRESS})
foreach(PATTERN ${PATTERNS})
add_test(test_decompress_pattern_${IMPL}_${PATTERN} test_decompress_pattern ${IMPL} ${PATTERN})
add_test(test_decompress_pattern_unaligned_${IMPL}_${PATTERN} test_decompress_pattern_unaligned ${IMPL} ${PATTERN})
if (NOT ("${PATTERN}" STREQUAL "empty"))
add_test(test_decompress_pattern_halfsmall_${IMPL}_${PATTERN} test_decompress_pattern_halfsmall ${IMPL} ${PATTERN})
add_test(test_decompress_pattern_barelysmall_${IMPL}_${PATTERN} test_decompress_pattern_barelysmall ${IMPL} ${PATTERN})
endif()
endforeach()
add_test(test_decompress_invalid_simple_${IMPL} test_decompress_invalid_simple ${IMPL})
add_test(test_decompress_invalid_generator_${IMPL} test_decompress_invalid_generator ${IMPL})
add_test(test_decompress_crcerror_${IMPL} test_decompress_crcerror ${IMPL})
add_test(test_decompress_boundscheck_${IMPL} test_decompress_boundscheck ${IMPL})
endforeach()
endif()