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