xref: /aosp_15_r20/external/FP16/CMakeLists.txt (revision 5f32b7105932ea8520a0e8811c640f936367d707)
1*5f32b710SXin LiCMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
2*5f32b710SXin Li
3*5f32b710SXin LiINCLUDE(GNUInstallDirs)
4*5f32b710SXin Li
5*5f32b710SXin Li# ---[ Project
6*5f32b710SXin LiPROJECT(FP16 C CXX)
7*5f32b710SXin Li
8*5f32b710SXin Li# ---[ Options.
9*5f32b710SXin LiOPTION(FP16_BUILD_TESTS "Build FP16 unit tests" ON)
10*5f32b710SXin LiOPTION(FP16_BUILD_BENCHMARKS "Build FP16 micro-benchmarks" ON)
11*5f32b710SXin Li
12*5f32b710SXin Li# ---[ CMake options
13*5f32b710SXin LiIF(FP16_BUILD_TESTS)
14*5f32b710SXin Li  ENABLE_TESTING()
15*5f32b710SXin LiENDIF()
16*5f32b710SXin Li
17*5f32b710SXin LiMACRO(FP16_TARGET_ENABLE_CXX11 target)
18*5f32b710SXin Li  IF(${CMAKE_VERSION} VERSION_LESS "3.1")
19*5f32b710SXin Li    IF(NOT MSVC)
20*5f32b710SXin Li      TARGET_COMPILE_OPTIONS(${target} PRIVATE -std=c++11)
21*5f32b710SXin Li    ENDIF()
22*5f32b710SXin Li  ELSE()
23*5f32b710SXin Li    SET_TARGET_PROPERTIES(${target} PROPERTIES
24*5f32b710SXin Li      CXX_STANDARD 11
25*5f32b710SXin Li      CXX_STANDARD_REQUIRED YES
26*5f32b710SXin Li      CXX_EXTENSIONS YES)
27*5f32b710SXin Li  ENDIF()
28*5f32b710SXin LiENDMACRO()
29*5f32b710SXin Li
30*5f32b710SXin Li# ---[ Download deps
31*5f32b710SXin LiSET(CONFU_DEPENDENCIES_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deps
32*5f32b710SXin Li  CACHE PATH "Confu-style dependencies source directory")
33*5f32b710SXin LiSET(CONFU_DEPENDENCIES_BINARY_DIR ${CMAKE_BINARY_DIR}/deps
34*5f32b710SXin Li  CACHE PATH "Confu-style dependencies binary directory")
35*5f32b710SXin Li
36*5f32b710SXin LiIF(NOT DEFINED PSIMD_SOURCE_DIR)
37*5f32b710SXin Li  MESSAGE(STATUS "Downloading PSimd to ${CONFU_DEPENDENCIES_SOURCE_DIR}/psimd (define PSIMD_SOURCE_DIR to avoid it)")
38*5f32b710SXin Li  CONFIGURE_FILE(cmake/DownloadPSimd.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd-download/CMakeLists.txt")
39*5f32b710SXin Li  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
40*5f32b710SXin Li    WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd-download")
41*5f32b710SXin Li  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
42*5f32b710SXin Li    WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd-download")
43*5f32b710SXin Li  SET(PSIMD_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/psimd" CACHE STRING "PSimd source directory")
44*5f32b710SXin LiENDIF()
45*5f32b710SXin Li
46*5f32b710SXin LiIF(FP16_BUILD_TESTS AND NOT DEFINED GOOGLETEST_SOURCE_DIR)
47*5f32b710SXin Li  MESSAGE(STATUS "Downloading Google Test to ${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest (define GOOGLETEST_SOURCE_DIR to avoid it)")
48*5f32b710SXin Li  CONFIGURE_FILE(cmake/DownloadGoogleTest.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download/CMakeLists.txt")
49*5f32b710SXin Li  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
50*5f32b710SXin Li    WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download")
51*5f32b710SXin Li  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
52*5f32b710SXin Li    WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest-download")
53*5f32b710SXin Li  SET(GOOGLETEST_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googletest" CACHE STRING "Google Test source directory")
54*5f32b710SXin LiENDIF()
55*5f32b710SXin Li
56*5f32b710SXin LiIF(FP16_BUILD_BENCHMARKS AND NOT DEFINED GOOGLEBENCHMARK_SOURCE_DIR)
57*5f32b710SXin Li  MESSAGE(STATUS "Downloading Google Benchmark to ${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark (define GOOGLEBENCHMARK_SOURCE_DIR to avoid it)")
58*5f32b710SXin Li  CONFIGURE_FILE(cmake/DownloadGoogleBenchmark.cmake "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download/CMakeLists.txt")
59*5f32b710SXin Li  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
60*5f32b710SXin Li    WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download")
61*5f32b710SXin Li  EXECUTE_PROCESS(COMMAND "${CMAKE_COMMAND}" --build .
62*5f32b710SXin Li    WORKING_DIRECTORY "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark-download")
63*5f32b710SXin Li  SET(GOOGLEBENCHMARK_SOURCE_DIR "${CONFU_DEPENDENCIES_SOURCE_DIR}/googlebenchmark" CACHE STRING "Google Benchmark source directory")
64*5f32b710SXin LiENDIF()
65*5f32b710SXin Li
66*5f32b710SXin Li# ---[ FP16 library
67*5f32b710SXin LiIF(${CMAKE_VERSION} VERSION_LESS "3.0")
68*5f32b710SXin Li  ADD_LIBRARY(fp16 STATIC
69*5f32b710SXin Li    include/fp16.h
70*5f32b710SXin Li    include/fp16/fp16.h
71*5f32b710SXin Li    include/fp16/bitcasts.h
72*5f32b710SXin Li    include/fp16/psimd.h)
73*5f32b710SXin Li  SET_TARGET_PROPERTIES(fp16 PROPERTIES LINKER_LANGUAGE C)
74*5f32b710SXin LiELSE()
75*5f32b710SXin Li  ADD_LIBRARY(fp16 INTERFACE)
76*5f32b710SXin LiENDIF()
77*5f32b710SXin LiTARGET_INCLUDE_DIRECTORIES(fp16 INTERFACE
78*5f32b710SXin Li    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
79*5f32b710SXin Li    $<INSTALL_INTERFACE:include>)
80*5f32b710SXin Li
81*5f32b710SXin LiINSTALL(FILES include/fp16.h
82*5f32b710SXin Li  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
83*5f32b710SXin LiINSTALL(FILES
84*5f32b710SXin Li    include/fp16/bitcasts.h
85*5f32b710SXin Li    include/fp16/fp16.h
86*5f32b710SXin Li    include/fp16/psimd.h
87*5f32b710SXin Li    include/fp16/__init__.py
88*5f32b710SXin Li    include/fp16/avx.py
89*5f32b710SXin Li    include/fp16/avx2.py
90*5f32b710SXin Li  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fp16)
91*5f32b710SXin Li
92*5f32b710SXin Li# ---[ Configure psimd
93*5f32b710SXin LiIF(NOT TARGET psimd)
94*5f32b710SXin Li  ADD_SUBDIRECTORY(
95*5f32b710SXin Li    "${PSIMD_SOURCE_DIR}"
96*5f32b710SXin Li    "${CONFU_DEPENDENCIES_BINARY_DIR}/psimd")
97*5f32b710SXin LiENDIF()
98*5f32b710SXin Li
99*5f32b710SXin LiIF(FP16_BUILD_TESTS)
100*5f32b710SXin Li  # ---[ Build google test
101*5f32b710SXin Li  IF(NOT TARGET gtest)
102*5f32b710SXin Li    SET(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
103*5f32b710SXin Li    ADD_SUBDIRECTORY(
104*5f32b710SXin Li      "${GOOGLETEST_SOURCE_DIR}"
105*5f32b710SXin Li      "${CONFU_DEPENDENCIES_BINARY_DIR}/googletest")
106*5f32b710SXin Li  ENDIF()
107*5f32b710SXin Li
108*5f32b710SXin Li  # ---[ Build FP16 unit tests
109*5f32b710SXin Li  ADD_EXECUTABLE(ieee-to-fp32-bits-test test/ieee-to-fp32-bits.cc test/tables.cc)
110*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(ieee-to-fp32-bits-test PRIVATE test)
111*5f32b710SXin Li  TARGET_LINK_LIBRARIES(ieee-to-fp32-bits-test fp16 gtest gtest_main)
112*5f32b710SXin Li  ADD_TEST(ieee-to-fp32-bits ieee-to-fp32-bits-test)
113*5f32b710SXin Li
114*5f32b710SXin Li  ADD_EXECUTABLE(ieee-to-fp32-value-test test/ieee-to-fp32-value.cc test/tables.cc)
115*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(ieee-to-fp32-value-test PRIVATE test)
116*5f32b710SXin Li  TARGET_LINK_LIBRARIES(ieee-to-fp32-value-test fp16 gtest gtest_main)
117*5f32b710SXin Li  ADD_TEST(ieee-to-fp32-value ieee-to-fp32-value-test)
118*5f32b710SXin Li
119*5f32b710SXin Li  ADD_EXECUTABLE(ieee-from-fp32-value-test test/ieee-from-fp32-value.cc test/tables.cc)
120*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(ieee-from-fp32-value-test PRIVATE test)
121*5f32b710SXin Li  TARGET_LINK_LIBRARIES(ieee-from-fp32-value-test fp16 gtest gtest_main)
122*5f32b710SXin Li  ADD_TEST(ieee-from-fp32-value ieee-from-fp32-value-test)
123*5f32b710SXin Li
124*5f32b710SXin Li  ADD_EXECUTABLE(alt-to-fp32-bits-test test/alt-to-fp32-bits.cc test/tables.cc)
125*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(alt-to-fp32-bits-test PRIVATE test)
126*5f32b710SXin Li  TARGET_LINK_LIBRARIES(alt-to-fp32-bits-test fp16 gtest gtest_main)
127*5f32b710SXin Li  ADD_TEST(alt-to-fp32-bits alt-to-fp32-bits-test)
128*5f32b710SXin Li
129*5f32b710SXin Li  ADD_EXECUTABLE(alt-to-fp32-value-test test/alt-to-fp32-value.cc test/tables.cc)
130*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(alt-to-fp32-value-test PRIVATE test)
131*5f32b710SXin Li  TARGET_LINK_LIBRARIES(alt-to-fp32-value-test fp16 gtest gtest_main)
132*5f32b710SXin Li  ADD_TEST(alt-to-fp32-value alt-to-fp32-value-test)
133*5f32b710SXin Li
134*5f32b710SXin Li  ADD_EXECUTABLE(alt-from-fp32-value-test test/alt-from-fp32-value.cc test/tables.cc)
135*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(alt-from-fp32-value-test PRIVATE test)
136*5f32b710SXin Li  TARGET_LINK_LIBRARIES(alt-from-fp32-value-test fp16 gtest gtest_main)
137*5f32b710SXin Li  ADD_TEST(alt-from-fp32-value alt-from-fp32-value-test)
138*5f32b710SXin Li
139*5f32b710SXin Li  ADD_EXECUTABLE(bitcasts-test test/bitcasts.cc)
140*5f32b710SXin Li  TARGET_LINK_LIBRARIES(bitcasts-test fp16 gtest gtest_main)
141*5f32b710SXin Li  ADD_TEST(bitcasts bitcasts-test)
142*5f32b710SXin LiENDIF()
143*5f32b710SXin Li
144*5f32b710SXin LiIF(FP16_BUILD_BENCHMARKS)
145*5f32b710SXin Li  # ---[ Build google benchmark
146*5f32b710SXin Li  IF(NOT TARGET benchmark)
147*5f32b710SXin Li    SET(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "")
148*5f32b710SXin Li    ADD_SUBDIRECTORY(
149*5f32b710SXin Li      "${GOOGLEBENCHMARK_SOURCE_DIR}"
150*5f32b710SXin Li      "${CONFU_DEPENDENCIES_BINARY_DIR}/googlebenchmark")
151*5f32b710SXin Li  ENDIF()
152*5f32b710SXin Li
153*5f32b710SXin Li  # ---[ Build FP16 benchmarks
154*5f32b710SXin Li  ADD_EXECUTABLE(ieee-element-bench bench/ieee-element.cc)
155*5f32b710SXin Li  TARGET_COMPILE_DEFINITIONS(ieee-element-bench PRIVATE FP16_COMPARATIVE_BENCHMARKS=1)
156*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(ieee-element-bench PRIVATE ${PROJECT_SOURCE_DIR})
157*5f32b710SXin Li  TARGET_LINK_LIBRARIES(ieee-element-bench fp16 psimd benchmark)
158*5f32b710SXin Li
159*5f32b710SXin Li  ADD_EXECUTABLE(alt-element-bench bench/alt-element.cc)
160*5f32b710SXin Li  TARGET_LINK_LIBRARIES(alt-element-bench fp16 psimd benchmark)
161*5f32b710SXin Li
162*5f32b710SXin Li  ADD_EXECUTABLE(from-ieee-array-bench bench/from-ieee-array.cc)
163*5f32b710SXin Li  FP16_TARGET_ENABLE_CXX11(from-ieee-array-bench)
164*5f32b710SXin Li  TARGET_COMPILE_DEFINITIONS(from-ieee-array-bench PRIVATE FP16_COMPARATIVE_BENCHMARKS=1)
165*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(from-ieee-array-bench PRIVATE ${PROJECT_SOURCE_DIR})
166*5f32b710SXin Li  TARGET_LINK_LIBRARIES(from-ieee-array-bench fp16 psimd benchmark)
167*5f32b710SXin Li
168*5f32b710SXin Li  ADD_EXECUTABLE(from-alt-array-bench bench/from-alt-array.cc)
169*5f32b710SXin Li  FP16_TARGET_ENABLE_CXX11(from-alt-array-bench)
170*5f32b710SXin Li  TARGET_LINK_LIBRARIES(from-alt-array-bench fp16 psimd benchmark)
171*5f32b710SXin Li
172*5f32b710SXin Li  ADD_EXECUTABLE(to-ieee-array-bench bench/to-ieee-array.cc)
173*5f32b710SXin Li  FP16_TARGET_ENABLE_CXX11(to-ieee-array-bench)
174*5f32b710SXin Li  TARGET_COMPILE_DEFINITIONS(to-ieee-array-bench PRIVATE FP16_COMPARATIVE_BENCHMARKS=1)
175*5f32b710SXin Li  TARGET_INCLUDE_DIRECTORIES(to-ieee-array-bench PRIVATE ${PROJECT_SOURCE_DIR})
176*5f32b710SXin Li  TARGET_LINK_LIBRARIES(to-ieee-array-bench fp16 psimd benchmark)
177*5f32b710SXin Li
178*5f32b710SXin Li  ADD_EXECUTABLE(to-alt-array-bench bench/to-alt-array.cc)
179*5f32b710SXin Li  FP16_TARGET_ENABLE_CXX11(to-alt-array-bench)
180*5f32b710SXin Li  TARGET_LINK_LIBRARIES(to-alt-array-bench fp16 psimd benchmark)
181*5f32b710SXin LiENDIF()
182