blob: e0d87f86cf501b08c2407884ab4f44283a26297d [file] [log] [blame]
Marat Dukhan04933482017-10-17 18:30:34 -07001CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
Marat Dukhanb966e592017-10-17 14:47:06 -07002
3INCLUDE(GNUInstallDirs)
4
5# ---[ Project
Marat Dukhan5856b582017-10-26 00:59:30 +00006PROJECT(FP16 C CXX)
Marat Dukhanb966e592017-10-17 14:47:06 -07007
8# ---[ Options.
9OPTION(FP16_BUILD_TESTS "Build FP16 unit tests" ON)
10OPTION(FP16_BUILD_BENCHMARKS "Build FP16 micro-benchmarks" ON)
11
12# ---[ CMake options
Marat Dukhanb966e592017-10-17 14:47:06 -070013IF(FP16_BUILD_TESTS)
14 ENABLE_TESTING()
15ENDIF()
16
Marat Dukhan43d6d172018-02-25 00:30:28 +010017MACRO(FP16_TARGET_ENABLE_CXX11 target)
Marat Dukhanfb64e162018-02-25 00:23:20 +010018 IF(${CMAKE_VERSION} VERSION_LESS "3.1")
19 IF(NOT MSVC)
20 TARGET_COMPILE_OPTIONS(${target} PRIVATE -std=c++11)
21 ENDIF()
22 ELSE()
23 SET_TARGET_PROPERTIES(${target} PROPERTIES
24 CXX_STANDARD 11
25 CXX_STANDARD_REQUIRED YES
Marat Dukhan4b37bd32018-07-08 14:22:44 -070026 CXX_EXTENSIONS YES)
Marat Dukhanfb64e162018-02-25 00:23:20 +010027 ENDIF()
28ENDMACRO()
29
Marat Dukhan04933482017-10-17 18:30:34 -070030# ---[ Download deps
31SET(CONFU_DEPENDENCIES_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deps
32 CACHE PATH "Confu-style dependencies source directory")
33SET(CONFU_DEPENDENCIES_BINARY_DIR ${CMAKE_BINARY_DIR}/deps
34 CACHE PATH "Confu-style dependencies binary directory")
35
Marat Dukhanaf4eeb52018-01-31 17:56:56 -080036IF(NOT DEFINED PSIMD_SOURCE_DIR)
37 MESSAGE(STATUS "Downloading PSimd to ${CONFU_DEPENDENCIES_SOURCE_DIR}/psimd (define PSIMD_SOURCE_DIR to avoid it)")
Marat Dukhanc485bd72018-02-24 16:41:19 +010038 CONFIGURE_FILE(cmake/DownloadPSimd.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd-download/CMakeLists.txt")
Marat Dukhan04933482017-10-17 18:30:34 -070039 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
Marat Dukhanc485bd72018-02-24 16:41:19 +010040 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd-download")
Marat Dukhan04933482017-10-17 18:30:34 -070041 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
Marat Dukhanc485bd72018-02-24 16:41:19 +010042 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd-download")
Marat Dukhanaf4eeb52018-01-31 17:56:56 -080043 SET(PSIMD_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/psimd" CACHE STRING "PSimd source directory")
Marat Dukhan04933482017-10-17 18:30:34 -070044ENDIF()
45
Marat Dukhanaf4eeb52018-01-31 17:56:56 -080046IF(FP16_BUILD_TESTS AND NOT DEFINED GOOGLETEST_SOURCE_DIR)
47 MESSAGE(STATUS "Downloading Google Test to ${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest (define GOOGLETEST_SOURCE_DIR to avoid it)")
Marat Dukhanc485bd72018-02-24 16:41:19 +010048 CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download/CMakeLists.txt")
Marat Dukhan04933482017-10-17 18:30:34 -070049 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
Marat Dukhanc485bd72018-02-24 16:41:19 +010050 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download")
Marat Dukhan04933482017-10-17 18:30:34 -070051 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
Marat Dukhanc485bd72018-02-24 16:41:19 +010052 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download")
Marat Dukhanaf4eeb52018-01-31 17:56:56 -080053 SET(GOOGLETEST_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest" CACHE STRING "Google Test source directory")
Marat Dukhan04933482017-10-17 18:30:34 -070054ENDIF()
55
Marat Dukhanaf4eeb52018-01-31 17:56:56 -080056IF(FP16_BUILD_BENCHMARKS AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR)
57 MESSAGE(STATUS "Downloading Google Benchmark to ${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)")
Marat Dukhanc485bd72018-02-24 16:41:19 +010058 CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt")
Marat Dukhan04933482017-10-17 18:30:34 -070059 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
Marat Dukhanc485bd72018-02-24 16:41:19 +010060 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download")
Marat Dukhan04933482017-10-17 18:30:34 -070061 EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
Marat Dukhanc485bd72018-02-24 16:41:19 +010062 WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download")
Marat Dukhanaf4eeb52018-01-31 17:56:56 -080063 SET(GOOGLEBENCHMARK_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark" CACHE STRING "Google Benchmark source directory")
Marat Dukhan04933482017-10-17 18:30:34 -070064ENDIF()
65
Marat Dukhanb966e592017-10-17 14:47:06 -070066# ---[ FP16 library
Marat Dukhan5856b582017-10-26 00:59:30 +000067IF(${CMAKE_VERSION} VERSION_LESS "3.0")
68 ADD_LIBRARY(fp16 STATIC
69 include/fp16.h
70 include/fp16/fp16.h
71 include/fp16/bitcasts.h
72 include/fp16/psimd.h)
73 SET_TARGET_PROPERTIES(fp16 PROPERTIES LINKER_LANGUAGE C)
74ELSE()
75 ADD_LIBRARY(fp16 INTERFACE)
76ENDIF()
Yangqing Jiafebbb1c2018-11-28 10:36:19 -080077TARGET_INCLUDE_DIRECTORIES(fp16 INTERFACE
78 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
79 $<INSTALL_INTERFACE:include>)
Marat Dukhanb966e592017-10-17 14:47:06 -070080
81INSTALL(FILES include/fp16.h
Yangqing Jiafebbb1c2018-11-28 10:36:19 -080082 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
83INSTALL(FILES
Marat Dukhanb966e592017-10-17 14:47:06 -070084 include/fp16/bitcasts.h
85 include/fp16/fp16.h
86 include/fp16/psimd.h
87 include/fp16/__init__.py
88 include/fp16/avx.py
89 include/fp16/avx2.py
Yangqing Jiafebbb1c2018-11-28 10:36:19 -080090 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fp16)
Marat Dukhanb966e592017-10-17 14:47:06 -070091
Marat Dukhan04933482017-10-17 18:30:34 -070092# ---[ Configure psimd
93IF(NOT TARGET psimd)
94 ADD_SUBDIRECTORY(
Marat Dukhanaf4eeb52018-01-31 17:56:56 -080095 "${PSIMD_SOURCE_DIR}"
Marat Dukhan04933482017-10-17 18:30:34 -070096 "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd")
Marat Dukhanb966e592017-10-17 14:47:06 -070097ENDIF()
98
99IF(FP16_BUILD_TESTS)
Marat Dukhan04933482017-10-17 18:30:34 -0700100 # ---[ Build google test
101 IF(NOT TARGET gtest)
102 SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
103 ADD_SUBDIRECTORY(
Marat Dukhanaf4eeb52018-01-31 17:56:56 -0800104 "${GOOGLETEST_SOURCE_DIR}"
Marat Dukhan04933482017-10-17 18:30:34 -0700105 "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest")
106 ENDIF()
Marat Dukhanb966e592017-10-17 14:47:06 -0700107
Marat Dukhan04933482017-10-17 18:30:34 -0700108 # ---[ Build FP16 unit tests
Marat Dukhanb966e592017-10-17 14:47:06 -0700109 ADD_EXECUTABLE(ieee-to-fp32-bits-test test/ieee-to-fp32-bits.cc test/tables.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700110 TARGET_INCLUDE_DIRECTORIES(ieee-to-fp32-bits-test PRIVATE test)
111 TARGET_LINK_LIBRARIES(ieee-to-fp32-bits-test fp16 gtest gtest_main)
Marat Dukhanb966e592017-10-17 14:47:06 -0700112 ADD_TEST(ieee-to-fp32-bits ieee-to-fp32-bits-test)
113
114 ADD_EXECUTABLE(ieee-to-fp32-value-test test/ieee-to-fp32-value.cc test/tables.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700115 TARGET_INCLUDE_DIRECTORIES(ieee-to-fp32-value-test PRIVATE test)
116 TARGET_LINK_LIBRARIES(ieee-to-fp32-value-test fp16 gtest gtest_main)
Marat Dukhanb966e592017-10-17 14:47:06 -0700117 ADD_TEST(ieee-to-fp32-value ieee-to-fp32-value-test)
118
119 ADD_EXECUTABLE(ieee-from-fp32-value-test test/ieee-from-fp32-value.cc test/tables.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700120 TARGET_INCLUDE_DIRECTORIES(ieee-from-fp32-value-test PRIVATE test)
121 TARGET_LINK_LIBRARIES(ieee-from-fp32-value-test fp16 gtest gtest_main)
Marat Dukhanb966e592017-10-17 14:47:06 -0700122 ADD_TEST(ieee-from-fp32-value ieee-from-fp32-value-test)
123
124 ADD_EXECUTABLE(alt-to-fp32-bits-test test/alt-to-fp32-bits.cc test/tables.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700125 TARGET_INCLUDE_DIRECTORIES(alt-to-fp32-bits-test PRIVATE test)
126 TARGET_LINK_LIBRARIES(alt-to-fp32-bits-test fp16 gtest gtest_main)
Marat Dukhanb966e592017-10-17 14:47:06 -0700127 ADD_TEST(alt-to-fp32-bits alt-to-fp32-bits-test)
128
129 ADD_EXECUTABLE(alt-to-fp32-value-test test/alt-to-fp32-value.cc test/tables.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700130 TARGET_INCLUDE_DIRECTORIES(alt-to-fp32-value-test PRIVATE test)
131 TARGET_LINK_LIBRARIES(alt-to-fp32-value-test fp16 gtest gtest_main)
Marat Dukhanb966e592017-10-17 14:47:06 -0700132 ADD_TEST(alt-to-fp32-value alt-to-fp32-value-test)
133
134 ADD_EXECUTABLE(alt-from-fp32-value-test test/alt-from-fp32-value.cc test/tables.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700135 TARGET_INCLUDE_DIRECTORIES(alt-from-fp32-value-test PRIVATE test)
136 TARGET_LINK_LIBRARIES(alt-from-fp32-value-test fp16 gtest gtest_main)
Marat Dukhanb966e592017-10-17 14:47:06 -0700137 ADD_TEST(alt-from-fp32-value alt-from-fp32-value-test)
138
139 ADD_EXECUTABLE(bitcasts-test test/bitcasts.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700140 TARGET_LINK_LIBRARIES(bitcasts-test fp16 gtest gtest_main)
Marat Dukhanb966e592017-10-17 14:47:06 -0700141 ADD_TEST(bitcasts bitcasts-test)
142ENDIF()
143
144IF(FP16_BUILD_BENCHMARKS)
Marat Dukhan04933482017-10-17 18:30:34 -0700145 # ---[ Build google benchmark
146 IF(NOT TARGET benchmark)
Marat Dukhan816fae62017-11-10 15:48:06 -0800147 SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "")
Marat Dukhan04933482017-10-17 18:30:34 -0700148 ADD_SUBDIRECTORY(
Marat Dukhanaf4eeb52018-01-31 17:56:56 -0800149 "${GOOGLEBENCHMARK_SOURCE_DIR}"
Marat Dukhan04933482017-10-17 18:30:34 -0700150 "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark")
151 ENDIF()
Marat Dukhanb966e592017-10-17 14:47:06 -0700152
Marat Dukhan04933482017-10-17 18:30:34 -0700153 # ---[ Build FP16 benchmarks
Marat Dukhanb966e592017-10-17 14:47:06 -0700154 ADD_EXECUTABLE(ieee-element-bench bench/ieee-element.cc)
Marat Dukhanfb64e162018-02-25 00:23:20 +0100155 TARGET_COMPILE_DEFINITIONS(ieee-element-bench PRIVATE FP16_COMPARATIVE_BENCHMARKS=1)
156 TARGET_INCLUDE_DIRECTORIES(ieee-element-bench PRIVATE ${PROJECT_SOURCE_DIR})
Marat Dukhan04933482017-10-17 18:30:34 -0700157 TARGET_LINK_LIBRARIES(ieee-element-bench fp16 psimd benchmark)
Marat Dukhanb966e592017-10-17 14:47:06 -0700158
159 ADD_EXECUTABLE(alt-element-bench bench/alt-element.cc)
Marat Dukhan04933482017-10-17 18:30:34 -0700160 TARGET_LINK_LIBRARIES(alt-element-bench fp16 psimd benchmark)
Marat Dukhanb966e592017-10-17 14:47:06 -0700161
162 ADD_EXECUTABLE(from-ieee-array-bench bench/from-ieee-array.cc)
Marat Dukhan43d6d172018-02-25 00:30:28 +0100163 FP16_TARGET_ENABLE_CXX11(from-ieee-array-bench)
Marat Dukhanfb64e162018-02-25 00:23:20 +0100164 TARGET_COMPILE_DEFINITIONS(from-ieee-array-bench PRIVATE FP16_COMPARATIVE_BENCHMARKS=1)
Marat Dukhan04933482017-10-17 18:30:34 -0700165 TARGET_INCLUDE_DIRECTORIES(from-ieee-array-bench PRIVATE ${PROJECT_SOURCE_DIR})
166 TARGET_LINK_LIBRARIES(from-ieee-array-bench fp16 psimd benchmark)
Marat Dukhanb966e592017-10-17 14:47:06 -0700167
168 ADD_EXECUTABLE(from-alt-array-bench bench/from-alt-array.cc)
Marat Dukhan43d6d172018-02-25 00:30:28 +0100169 FP16_TARGET_ENABLE_CXX11(from-alt-array-bench)
Marat Dukhan04933482017-10-17 18:30:34 -0700170 TARGET_LINK_LIBRARIES(from-alt-array-bench fp16 psimd benchmark)
Marat Dukhanb966e592017-10-17 14:47:06 -0700171
172 ADD_EXECUTABLE(to-ieee-array-bench bench/to-ieee-array.cc)
Marat Dukhan43d6d172018-02-25 00:30:28 +0100173 FP16_TARGET_ENABLE_CXX11(to-ieee-array-bench)
Marat Dukhanfb64e162018-02-25 00:23:20 +0100174 TARGET_COMPILE_DEFINITIONS(to-ieee-array-bench PRIVATE FP16_COMPARATIVE_BENCHMARKS=1)
Marat Dukhan04933482017-10-17 18:30:34 -0700175 TARGET_INCLUDE_DIRECTORIES(to-ieee-array-bench PRIVATE ${PROJECT_SOURCE_DIR})
176 TARGET_LINK_LIBRARIES(to-ieee-array-bench fp16 psimd benchmark)
Marat Dukhanb966e592017-10-17 14:47:06 -0700177
178 ADD_EXECUTABLE(to-alt-array-bench bench/to-alt-array.cc)
Marat Dukhan43d6d172018-02-25 00:30:28 +0100179 FP16_TARGET_ENABLE_CXX11(to-alt-array-bench)
Marat Dukhan04933482017-10-17 18:30:34 -0700180 TARGET_LINK_LIBRARIES(to-alt-array-bench fp16 psimd benchmark)
Marat Dukhanb966e592017-10-17 14:47:06 -0700181ENDIF()