CMakeLists.txt 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. cmake_minimum_required(VERSION 3.12)
  2. set(ARCH "X86_64" CACHE STRING "Target Architecture")
  3. option(AVX512 "generate code that can make use of avx-512-instructions" ON)
  4. #message(CMAKE_SYSTEM_PROCESSOR)
  5. project(mandel VERSION 1.0.0 DESCRIPTION "library for mandelbrot calculations")
  6. find_package(OpenCL REQUIRED)
  7. find_package(OpenMP)
  8. #set(Boost_DEBUG 1)
  9. set(Boost_USE_STATIC_LIBS ON)
  10. set(ASMJIT_STATIC ON)
  11. find_package(Boost 1.65 REQUIRED)
  12. set(CMAKE_CXX_STANDARD 17)
  13. #FILE(GLOB MandelSources src/*.cpp)
  14. SET(MandelSources
  15. src/ClGenerators.cpp
  16. src/CpuGenerators.cpp
  17. src/Generators.cpp
  18. src/Mandel.cpp
  19. src/Hardware.cpp
  20. src/MandelUtil.cpp
  21. src/Types.cpp
  22. src/OpenClCode.cpp
  23. src/IterationGenerator.cpp
  24. src/IterationFormula.cpp
  25. src/IterationCompiler.cpp
  26. src/IterationIR.cpp
  27. src/NaiveIRGenerator.cpp
  28. )
  29. FILE(GLOB MandelHeaders include/*.h)
  30. if (ARCH STREQUAL "X86_64" OR ARCH STREQUAL "X86")
  31. list(APPEND MandelSources src/CpuGeneratorsAVX.cpp src/CpuGeneratorsAVXFMA.cpp src/CpuGeneratorsSSE2.cpp)
  32. if (AVX512)
  33. list(APPEND MandelSources src/CpuGeneratorsAVX512.cpp)
  34. endif()
  35. endif()
  36. # message(${MandelSources})
  37. add_subdirectory(asmjit)
  38. add_library(mandel STATIC ${MandelSources})
  39. FILE(GLOB QdSources qd-2.3.22/src/*.cpp)
  40. target_compile_definitions(mandel PUBLIC WITH_QD)
  41. add_library(qd STATIC ${QdSources})
  42. target_include_directories(qd PUBLIC qd-2.3.22/include qd-2.3.22)
  43. #FILE(GLOB AsmjitSources asmjit/src/asmjit/*/*.cpp)
  44. #add_library(asmjit STATIC ${AsmjitSources})
  45. #target_include_directories(asmjit PUBLIC asmjit/src)
  46. #target_compile_definitions(asmjit PUBLIC NOMINMAX)
  47. #target_compile_definitions(asmjit PUBLIC ASMJIT_STATIC)
  48. #target_include_directories(mandel PUBLI#C qd-2.3.22/include)
  49. #target_include_directories(mandel PUBLI#C qd-2.3.22/include)
  50. target_link_libraries(mandel PUBLIC qd)
  51. target_link_libraries(mandel PUBLIC asmjit)
  52. include(CheckIPOSupported)
  53. check_ipo_supported(RESULT LTO_SUPPORTED)
  54. if (LTO_SUPPORTED AND WITH_LTO)
  55. message("Enabling link-time optimization.")
  56. set_property(TARGET mandel PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
  57. set_property(TARGET qd PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
  58. endif()
  59. if(OPENCL_FOUND)
  60. target_compile_definitions(mandel PUBLIC WITH_OPENCL)
  61. target_include_directories(mandel PUBLIC
  62. "include"
  63. ${OpenCL_INCLUDE_DIRS}
  64. )
  65. link_directories(${OpenCL_LIBRARY})
  66. else(OPENCL_FOUND)
  67. include_directories("include")
  68. endif(OPENCL_FOUND)
  69. if (APPLE AND OpenCL_FOUND)
  70. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -framework OpenCL")
  71. endif()
  72. if(Boost_FOUND)
  73. target_compile_definitions(mandel PUBLIC WITH_BOOST)
  74. target_include_directories(mandel PRIVATE ${Boost_INCLUDE_DIRS})
  75. target_link_libraries(mandel PRIVATE ${Boost_LIBRARIES})
  76. endif(Boost_FOUND)
  77. if (ARCH STREQUAL "X86_64" OR ARCH STREQUAL "X86")
  78. if (AVX512)
  79. target_compile_definitions(mandel PUBLIC WITH_AVX512)
  80. if (MSVC)
  81. set_source_files_properties(src/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS /arch:AVX512F)
  82. else()
  83. set_source_files_properties(src/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS -mavx512f)
  84. endif(MSVC)
  85. endif()
  86. if (MSVC)
  87. set_source_files_properties(src/CpuGeneratorsAVX.cpp PROPERTIES COMPILE_FLAGS /arch:AVX)
  88. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS /arch:AVX)
  89. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS /arch:FMA)
  90. set_source_files_properties(src/CpuGeneratorsSSE2.cpp PROPERTIES COMPILE_FLAGS /arch:SSE2)
  91. else()
  92. set_source_files_properties(src/CpuGeneratorsAVX.cpp PROPERTIES COMPILE_FLAGS -mavx)
  93. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS -mavx)
  94. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS -mfma)
  95. set_source_files_properties(src/CpuGeneratorsSSE2.cpp PROPERTIES COMPILE_FLAGS -msse2)
  96. endif(MSVC)
  97. elseif(ARCH STREQUAL "ARM")
  98. list(APPEND MandelSources src/CpuGeneratorsNeon.cpp)
  99. #set_source_files_properties(src/CpuGeneratorsNeon.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
  100. endif()
  101. if(OpenMP_CXX_FOUND)
  102. target_link_libraries(mandel PUBLIC OpenMP::OpenMP_CXX)
  103. endif()
  104. if(OpenCL_FOUND)
  105. target_link_libraries(mandel PUBLIC OpenCL::OpenCL)
  106. endif()