1
0

CMakeLists.txt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. cmake_minimum_required(VERSION 3.12)
  2. include(CheckCXXCompilerFlag)
  3. set(ARCH "X86_64" CACHE STRING "Target Architecture")
  4. option(AVX512 "generate code that can make use of avx-512-instructions" ON)
  5. option(WITH_ASMJIT "use just-in-time-compilation capabilities of asmjit" ON)
  6. option(MANDEL_BUILD_NATIVE
  7. "use the -march=native flags if supported WARNING: when compiling with this flag, the binary might not run on machines other than the one it was compiled on"
  8. OFF)
  9. #message(CMAKE_SYSTEM_PROCESSOR)
  10. project(mandel VERSION 1.0.0 DESCRIPTION "library for mandelbrot calculations")
  11. find_package(OpenCL REQUIRED)
  12. find_package(OpenMP)
  13. #set(Boost_DEBUG 1)
  14. set(Boost_USE_STATIC_LIBS ON)
  15. set(ASMJIT_STATIC ON)
  16. set(ASMJIT_EMBED ON)
  17. find_package(Boost 1.65 REQUIRED)
  18. set(CMAKE_CXX_STANDARD 17)
  19. #FILE(GLOB MandelSources src/*.cpp)
  20. SET(MandelSources
  21. src/ClGenerators.cpp
  22. src/CpuGenerators.cpp
  23. src/Generators.cpp
  24. src/Mandel.cpp
  25. src/Hardware.cpp
  26. src/MandelUtil.cpp
  27. src/Types.cpp
  28. src/OpenClCode.cpp
  29. src/IterationGenerator.cpp
  30. src/IterationFormula.cpp
  31. src/IterationCompiler.cpp
  32. src/IterationIR.cpp
  33. src/NaiveIRGenerator.cpp
  34. )
  35. FILE(GLOB MandelHeaders include/*.h)
  36. if (ARCH STREQUAL "X86_64" OR ARCH STREQUAL "X86")
  37. list(APPEND MandelSources src/CpuGeneratorsAVX.cpp src/CpuGeneratorsAVXFMA.cpp src/CpuGeneratorsSSE2.cpp)
  38. if (AVX512)
  39. list(APPEND MandelSources src/CpuGeneratorsAVX512.cpp)
  40. endif()
  41. elseif(ARCH STREQUAL "ARM")
  42. list(APPEND MandelSources src/CpuGeneratorsNeon.cpp)
  43. endif()
  44. # use both flags just to be sure
  45. CHECK_CXX_COMPILER_FLAG("-march=native" MARCH_NATIVE_SUPPORTED)
  46. CHECK_CXX_COMPILER_FLAG("-mtune=native" MTUNE_NATIVE_SUPPORTED)
  47. if(MARCH_NATIVE_SUPPORTED AND MANDEL_BUILD_NATIVE)
  48. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
  49. endif()
  50. if(MTUNE_NATIVE_SUPPORTED AND MANDEL_BUILD_NATIVE)
  51. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=native")
  52. endif()
  53. # message(${MandelSources})
  54. add_library(mandel STATIC ${MandelSources})
  55. FILE(GLOB QdSources qd-2.3.22/src/*.cpp)
  56. target_compile_definitions(mandel PUBLIC WITH_QD)
  57. add_library(qd STATIC ${QdSources})
  58. target_include_directories(mandel PUBLIC "include")
  59. target_include_directories(qd PUBLIC qd-2.3.22/include qd-2.3.22)
  60. target_link_libraries(mandel PUBLIC qd)
  61. if(WITH_ASMJIT)
  62. set(ASMJIT_LIBS "" PARENT_SCOPE)
  63. add_subdirectory(asmjit)
  64. message("depps " ${ASMJIT_LIBS})
  65. target_compile_definitions(mandel PUBLIC WITH_ASMJIT)
  66. target_link_libraries(mandel PUBLIC asmjit)
  67. target_link_libraries(mandel PRIVATE ${ASMJIT_LIBS})
  68. endif(WITH_ASMJIT)
  69. if(OPENCL_FOUND)
  70. target_compile_definitions(mandel PUBLIC WITH_OPENCL)
  71. target_include_directories(mandel SYSTEM PUBLIC ${OpenCL_INCLUDE_DIRS})
  72. target_include_directories(mandel SYSTEM PUBLIC "include_cl")
  73. link_directories(${OpenCL_LIBRARY})
  74. target_link_libraries(mandel PUBLIC OpenCL::OpenCL)
  75. else(OPENCL_FOUND)
  76. endif(OPENCL_FOUND)
  77. if (APPLE AND OpenCL_FOUND)
  78. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -framework OpenCL")
  79. endif()
  80. if(OpenMP_CXX_FOUND)
  81. target_link_libraries(mandel PUBLIC OpenMP::OpenMP_CXX)
  82. endif()
  83. if(Boost_FOUND)
  84. target_compile_definitions(mandel PUBLIC WITH_BOOST)
  85. target_include_directories(mandel PUBLIC ${Boost_INCLUDE_DIRS})
  86. target_link_libraries(mandel PRIVATE ${Boost_LIBRARIES})
  87. endif(Boost_FOUND)
  88. if (ARCH STREQUAL "X86_64" OR ARCH STREQUAL "X86")
  89. if (AVX512)
  90. target_compile_definitions(mandel PUBLIC WITH_AVX512)
  91. if (MSVC)
  92. set_source_files_properties(src/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS /arch:AVX512F)
  93. else()
  94. set_source_files_properties(src/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS -mavx512f)
  95. endif(MSVC)
  96. endif()
  97. if (MSVC)
  98. set_source_files_properties(src/CpuGeneratorsAVX.cpp PROPERTIES COMPILE_FLAGS /arch:AVX)
  99. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS /arch:AVX2)
  100. set_source_files_properties(src/CpuGeneratorsSSE2.cpp PROPERTIES COMPILE_FLAGS /arch:SSE2)
  101. else()
  102. set_source_files_properties(src/CpuGeneratorsAVX.cpp PROPERTIES COMPILE_FLAGS -mavx)
  103. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS "-mavx2 -mfma")
  104. set_source_files_properties(src/CpuGeneratorsSSE2.cpp PROPERTIES COMPILE_FLAGS -msse2)
  105. endif(MSVC)
  106. elseif(ARCH STREQUAL "ARM")
  107. set_source_files_properties(src/CpuGeneratorsNeon.cpp PROPERTIES COMPILE_FLAGS -march=armv8-a+simd)
  108. endif()