CMakeLists.txt 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. cmake_minimum_required(VERSION 3.12)
  2. include(CheckCXXCompilerFlag)
  3. project(mandel VERSION 1.0.0 DESCRIPTION "library for mandelbrot calculations")
  4. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
  5. set(MANDEL_TARGET_ARCHITECTURE "aarch64" CACHE STRING "Target Architecture")
  6. else()
  7. set(MANDEL_TARGET_ARCHITECTURE "x86_64" CACHE STRING "Target Architecture")
  8. endif()
  9. option(MANDEL_AVX512 "generate plugin that can make use of avx-512-instructions" ON)
  10. option(MANDEL_ASMJIT "use just-in-time-compilation library asmjit" ON)
  11. option(MANDEL_OPENCL "use opencl to offload calculations on GPU devices" ON)
  12. option(MANDEL_BUILD_NATIVE
  13. "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"
  14. OFF)
  15. find_package(OpenCL)
  16. find_package(OpenMP)
  17. set(Boost_USE_STATIC_LIBS ON)
  18. set(ASMJIT_STATIC ON)
  19. find_package(Boost 1.65 REQUIRED)
  20. set(CMAKE_CXX_STANDARD 17)
  21. SET(MandelSources
  22. src/ClGenerators.cpp
  23. src/CpuGenerators.cpp
  24. src/Generators.cpp
  25. src/Mandel.cpp
  26. src/Hardware.cpp
  27. src/MandelUtil.cpp
  28. src/Types.cpp
  29. src/Real.cpp
  30. src/IterationGenerator.cpp
  31. src/IterationFormula.cpp
  32. src/IterationCompiler.cpp
  33. src/IterationCompilerCl.cpp
  34. src/IterationIR.cpp
  35. src/NaiveIRGenerator.cpp
  36. src/FloatLog.cpp
  37. src/Benchmark.cpp
  38. src/CalcPlugin.cpp
  39. )
  40. FILE(GLOB MandelHeaders include/*.h)
  41. FILE(GLOB MandelClSources src/opencl/*.cl src/opencl_template/*.cl)
  42. if (MANDEL_TARGET_ARCHITECTURE STREQUAL "x86_64" OR MANDEL_TARGET_ARCHITECTURE STREQUAL "x86")
  43. list(APPEND MandelSources src/CpuGeneratorsAVX.cpp src/CpuGeneratorsAVXFMA.cpp src/CpuGeneratorsSSE2.cpp)
  44. if (MANDEL_AVX512)
  45. list(APPEND MandelSources src/CpuGeneratorsAVX512.cpp)
  46. endif()
  47. elseif(MANDEL_TARGET_ARCHITECTURE STREQUAL "aarch64")
  48. list(APPEND MandelSources src/CpuGeneratorsNeon.cpp)
  49. endif()
  50. # use both flags (mtune & march) just to be sure
  51. CHECK_CXX_COMPILER_FLAG("-march=native" MARCH_NATIVE_SUPPORTED)
  52. CHECK_CXX_COMPILER_FLAG("-mtune=native" MTUNE_NATIVE_SUPPORTED)
  53. if(MARCH_NATIVE_SUPPORTED AND MANDEL_BUILD_NATIVE)
  54. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
  55. endif()
  56. if(MTUNE_NATIVE_SUPPORTED AND MANDEL_BUILD_NATIVE)
  57. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=native")
  58. endif()
  59. add_executable(resourcec resourcec/resourcec.cpp)
  60. add_custom_command(
  61. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/OpenClCode.cpp
  62. BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/OpenClCode.h
  63. COMMAND resourcec ARGS -n mnd::cl_src -d ${CMAKE_CURRENT_BINARY_DIR}/OpenClCode.h -o ${CMAKE_CURRENT_BINARY_DIR}/OpenClCode.cpp
  64. SOURCES ${MandelClSources}
  65. WORKING_DIRECTORY ${CMAKE_PROJECT_DIR}
  66. COMMENT "Packaging Opencl Resources"
  67. VERBATIM
  68. )
  69. set(CMAKE_ENABLE_EXPORTS ON)
  70. if(OPENCL_FOUND AND MANDEL_OPENCL)
  71. add_library(mandel STATIC ${MandelSources} OpenClCode.cpp)
  72. else()
  73. add_library(mandel STATIC ${MandelSources})
  74. endif()
  75. # avx+fma plugin
  76. add_library(avxfma MODULE src/plugins/CpuGeneratorsAVXFMA.cpp)
  77. set_target_properties(avxfma PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${MANDEL_PLUGIN_DIR})
  78. target_include_directories(avxfma PUBLIC "include")
  79. add_dependencies(mandel avxfma)
  80. target_link_libraries(avxfma PUBLIC mandel)
  81. # avx512 plugin
  82. add_library(avx512 MODULE src/plugins/CpuGeneratorsAVX512.cpp)
  83. set_target_properties(avx512 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${MANDEL_PLUGIN_DIR})
  84. target_include_directories(avx512 PUBLIC "include")
  85. add_dependencies(mandel avx512)
  86. target_include_directories(mandel PUBLIC "include")
  87. target_include_directories(mandel PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
  88. if(MANDEL_ASMJIT)
  89. add_subdirectory(asmjit)
  90. target_compile_definitions(mandel PUBLIC WITH_ASMJIT)
  91. target_link_libraries(mandel PUBLIC AsmJit::AsmJit)
  92. endif(MANDEL_ASMJIT)
  93. if(OPENCL_FOUND AND MANDEL_OPENCL)
  94. target_compile_definitions(mandel PUBLIC WITH_OPENCL)
  95. target_include_directories(mandel SYSTEM PUBLIC ${OpenCL_INCLUDE_DIRS})
  96. target_include_directories(mandel SYSTEM PUBLIC "include_cl")
  97. link_directories(${OpenCL_LIBRARY})
  98. target_link_libraries(mandel PUBLIC OpenCL::OpenCL)
  99. else()
  100. endif()
  101. if (APPLE AND OpenCL_FOUND)
  102. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -framework OpenCL")
  103. endif()
  104. if(OpenMP_CXX_FOUND)
  105. target_link_libraries(mandel PUBLIC OpenMP::OpenMP_CXX)
  106. target_link_libraries(avx512 PUBLIC OpenMP::OpenMP_CXX)
  107. target_link_libraries(avxfma PUBLIC OpenMP::OpenMP_CXX)
  108. endif()
  109. if(Boost_FOUND)
  110. target_compile_definitions(mandel PUBLIC WITH_BOOST)
  111. target_include_directories(mandel PUBLIC ${Boost_INCLUDE_DIRS})
  112. target_compile_definitions(avx512 PUBLIC WITH_BOOST)
  113. target_include_directories(avx512 PUBLIC ${Boost_INCLUDE_DIRS})
  114. target_compile_definitions(avxfma PUBLIC WITH_BOOST)
  115. target_include_directories(avxfma PUBLIC ${Boost_INCLUDE_DIRS})
  116. #target_link_libraries(mandel PRIVATE ${Boost_LIBRARIES})
  117. endif(Boost_FOUND)
  118. if (MANDEL_TARGET_ARCHITECTURE STREQUAL "x86_64" OR MANDEL_TARGET_ARCHITECTURE STREQUAL "x86")
  119. if (MANDEL_AVX512)
  120. target_compile_definitions(mandel PUBLIC WITH_AVX512)
  121. if (MSVC)
  122. set_source_files_properties(src/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS /arch:AVX512F)
  123. set_source_files_properties(src/plugins/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS /arch:AVX512F)
  124. else()
  125. set_source_files_properties(src/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS -mavx512f)
  126. set_source_files_properties(src/plugins/CpuGeneratorsAVX512.cpp PROPERTIES COMPILE_FLAGS -mavx512f)
  127. endif(MSVC)
  128. endif()
  129. if (MSVC)
  130. set_source_files_properties(src/CpuGeneratorsAVX.cpp PROPERTIES COMPILE_FLAGS /arch:AVX)
  131. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS /arch:AVX2)
  132. set_source_files_properties(src/plugins/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS /arch:AVX2)
  133. set_source_files_properties(src/CpuGeneratorsSSE2.cpp PROPERTIES COMPILE_FLAGS /arch:SSE2)
  134. else()
  135. set_source_files_properties(src/CpuGeneratorsAVX.cpp PROPERTIES COMPILE_FLAGS -mavx)
  136. set_source_files_properties(src/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS "-mavx2 -mfma")
  137. set_source_files_properties(src/plugins/CpuGeneratorsAVXFMA.cpp PROPERTIES COMPILE_FLAGS "-mavx2 -mfma")
  138. set_source_files_properties(src/CpuGeneratorsSSE2.cpp PROPERTIES COMPILE_FLAGS -msse2)
  139. endif(MSVC)
  140. elseif(MANDEL_TARGET_ARCHITECTURE STREQUAL "aarch64")
  141. set_source_files_properties(src/CpuGeneratorsNeon.cpp PROPERTIES COMPILE_FLAGS -march=armv8-a+simd)
  142. endif()