You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

CMakeLists.txt 42 kB

5 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. cmake_minimum_required(VERSION 3.15.2)
  2. include (cmake/FetchMegBrainVersion.cmake)
  3. project(MegEngine LANGUAGES C CXX VERSION ${MGB_VER_STRING})
  4. set(CMAKE_CXX_STANDARD 14)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_CXX_EXTENSIONS OFF)
  7. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  8. set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
  9. set(CMAKE_POLICY_DEFAULT_CMP0048 NEW)
  10. if(NOT MSVC AND NOT APPLE AND NOT WIN32)
  11. set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Dqc <TARGET> <LINK_FLAGS> <OBJECTS>")
  12. set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> Dq <TARGET> <LINK_FLAGS> <OBJECTS>")
  13. set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
  14. endif()
  15. include(GNUInstallDirs)
  16. include(CheckCXXCompilerFlag)
  17. CHECK_CXX_COMPILER_FLAG(-Wclass-memaccess CXX_SUPPORT_WCLASS_MEMACCESS)
  18. set(MGE_ARCH AUTO CACHE STRING "Architecture on which MegEngine to be built.")
  19. set_property(CACHE MGE_ARCH PROPERTY STRINGS AUTO
  20. x86_64 i386
  21. armv7 aarch64
  22. naive fallback
  23. )
  24. set (MGE_EXPORT_TARGETS MegEngine-targets)
  25. option(MGE_WITH_JIT "Build MegEngine with JIT." ON)
  26. option(MGE_WITH_JIT_MLIR "Build MegEngine with MLIR JIT." OFF)
  27. option(MGE_WITH_HALIDE "Build MegEngine with Halide JIT" OFF)
  28. option(MGE_WITH_MIDOUT_PROFILE "Build MegEngine with Midout profile." OFF)
  29. option(MGE_WITH_MINIMUM_SIZE "Swith off MGE_ENABLE_RTTI、MGE_ENABLE_EXCEPTIONS、MGE_ENABLE_LOGGING and switch on MGE_INFERENCE_ONLY so that compile minimum load_and_run. Take effect only when MGE_BIN_REDUCE was set" OFF)
  30. option(MGE_ARMV8_2_FEATURE_FP16 "Enable armv8.2-a+fp16 support" OFF)
  31. option(MGE_DISABLE_FLOAT16 "Disable MegEngine float16 support." OFF)
  32. option(MGE_WITH_CUDA "Enable MegEngine CUDA support." ON)
  33. option(MGE_CUDA_USE_STATIC "Enable MegEngine CUDA static linking." ON)
  34. option(MGE_WITH_TRT "Build MegEngine with TensorRT." ON)
  35. option(MGE_WITH_CUDA_STUB "Build MegEngine with CUDA stub." ON)
  36. option(MGE_WITH_NVRTC_STUB "Build MegEngine with NVRTC stub." OFF)
  37. option(MGE_WITH_CUDNN_SHARED "Build MegEngine with CUDNN shared." ON)
  38. option(MGE_WITH_CUBLAS_SHARED "Build MegEngine with CUBLAS shared." OFF)
  39. option(MGE_USE_SYSTEM_LIB "Build MegEngine with system libraries." OFF)
  40. option(MGB_WITH_FLATBUFFERS "Build MegBrain with FlatBuffers serialization support." ON)
  41. option(MGE_WITH_CAMBRICON "Build MegEngine with Cambricon support" OFF)
  42. option(BUILD_SHARED_LIBS "Build shared libraries" ON)
  43. option(MGE_WITH_ATLAS "Build MegEngine with Atlas support" OFF)
  44. option(MGE_ENABLE_RTTI "Build with RTTI" ON)
  45. option(MGE_ENABLE_LOGGING "Build with logging" ON)
  46. option(MGE_DEBUG_UTIL "Enable debug utility" ON)
  47. option(MGE_ENABLE_EXCEPTIONS "Build with exceptions" ON)
  48. option(MGE_WITH_TEST "Enable test for MegEngine." OFF)
  49. option(MGE_WITH_DISTRIBUTED "Build with distributed support" ON)
  50. option(MGE_BUILD_IMPERATIVE_RT "Build _imperative_rt Python Module " ON)
  51. option(MGE_BUILD_SDK "Build load_and_run" ON)
  52. option(MGE_INFERENCE_ONLY "Build inference only library." OFF)
  53. option(MGE_WITH_MKLDNN "Enable Intel MKL_DNN support," ON)
  54. option(MGE_WITH_ROCM "Enable ROCM support" OFF)
  55. option(MGE_WITH_LARGE_ARCHIVE "Enable big archive link support" OFF)
  56. if(MSVC OR WIN32)
  57. message(STATUS "windows force cudnn static link")
  58. set(MGE_WITH_CUDNN_SHARED OFF)
  59. endif()
  60. if(MGE_WITH_NVRTC_STUB OR MGE_WITH_CUDA_STUB)
  61. set(MGE_WITH_ANY_CUDA_STUB ON)
  62. else()
  63. set(MGE_WITH_ANY_CUDA_STUB OFF)
  64. endif()
  65. if(NOT ${MGE_BIN_REDUCE} STREQUAL "")
  66. message(STATUS "build with BIN REDUCE")
  67. if(MGE_WITH_MINIMUM_SIZE)
  68. set(MGE_ENABLE_RTTI OFF)
  69. set(MGE_ENABLE_LOGGING OFF)
  70. set(MGE_ENABLE_EXCEPTIONS OFF)
  71. set(MGE_INFERENCE_ONLY ON)
  72. endif()
  73. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include ${MGE_BIN_REDUCE}")
  74. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -include ${MGE_BIN_REDUCE}")
  75. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto=full")
  76. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flto=full")
  77. endif()
  78. if(MGE_WITH_MIDOUT_PROFILE)
  79. message(STATUS "build with MIDOUT PROFILE")
  80. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMIDOUT_PROFILING")
  81. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMIDOUT_PROFILING")
  82. endif()
  83. if (APPLE)
  84. set (BUILD_SHARED_LIBS OFF)
  85. message(STATUS "build static for xcode framework require")
  86. endif()
  87. if (MGE_USE_SYSTEM_LIB)
  88. set (MGE_CUDA_USE_STATIC OFF)
  89. endif()
  90. if (MGB_WITH_FLATBUFFERS)
  91. set(MGB_ENABLE_FBS_SERIALIZATION ON)
  92. endif()
  93. if(CMAKE_TOOLCHAIN_FILE)
  94. message(STATUS "We are cross compiling.")
  95. message(STATUS "config FLATBUFFERS_FLATC_EXECUTABLE to: ${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  96. set(FLATBUFFERS_FLATC_EXECUTABLE "${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  97. if(ANDROID_TOOLCHAIN_ROOT)
  98. if(NOT "${ANDROID_ARCH_NAME}" STREQUAL "")
  99. set(ANDROID_ARCH ${ANDROID_ARCH_NAME})
  100. endif()
  101. if(${ANDROID_ARCH} STREQUAL "arm")
  102. set(MGE_ARCH "armv7")
  103. elseif(${ANDROID_ARCH} STREQUAL "arm64")
  104. set(MGE_ARCH "aarch64")
  105. else()
  106. message(FATAL_ERROR "DO NOT SUPPORT ANDROID ARCH NOW")
  107. endif()
  108. elseif(IOS_TOOLCHAIN_ROOT)
  109. if(${IOS_ARCH} STREQUAL "armv7")
  110. set(MGE_ARCH "armv7")
  111. elseif(${IOS_ARCH} STREQUAL "arm64")
  112. set(MGE_ARCH "aarch64")
  113. elseif(${IOS_ARCH} STREQUAL "armv7k")
  114. set(MGE_ARCH "armv7")
  115. elseif(${IOS_ARCH} STREQUAL "arm64e")
  116. set(MGE_ARCH "aarch64")
  117. elseif(${IOS_ARCH} STREQUAL "armv7s")
  118. set(MGE_ARCH "armv7")
  119. else()
  120. message(FATAL_ERROR "Unsupported IOS_ARCH.")
  121. endif()
  122. elseif(RISCV_TOOLCHAIN_ROOT)
  123. set(MGE_ARCH "riscv64")
  124. elseif(NOT "${ARM_CROSS_BUILD_ARCH}" STREQUAL "")
  125. set(MGE_ARCH ${ARM_CROSS_BUILD_ARCH})
  126. else()
  127. message(FATAL_ERROR "Unknown cross-compiling settings.")
  128. endif()
  129. message(STATUS "CONFIG MGE_ARCH TO ${MGE_ARCH}")
  130. endif()
  131. if(${MGE_ARCH} STREQUAL "AUTO")
  132. if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
  133. set(MGE_ARCH "x86_64")
  134. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
  135. set(MGE_ARCH "i386")
  136. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
  137. set(MGE_ARCH "aarch64")
  138. elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm")
  139. set(MGE_ARCH "armv7")
  140. else()
  141. message(FATAL_ERROR "Unknown machine architecture for MegEngine.")
  142. endif()
  143. endif()
  144. if((${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386" OR ${MGE_ARCH} STREQUAL "armv7" OR ${MGE_ARCH} STREQUAL "aarch64") AND NOT APPLE)
  145. option(MGE_ENABLE_CPUINFO "Build cpuinfo library for check runtime." ON)
  146. if(MGE_ENABLE_CPUINFO)
  147. message(STATUS "Enable cpuinfo runtime check and little kernel optimize.")
  148. add_definitions(-DMGB_ENABLE_CPUINFO_CHECK)
  149. include(cmake/cpuinfo.cmake)
  150. endif()
  151. endif()
  152. if(MSVC OR WIN32)
  153. # for cmake after 3.15.2
  154. cmake_policy(SET CMP0091 NEW)
  155. set(CMAKE_OBJECT_PATH_MAX 300)
  156. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  157. set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDebug")
  158. else()
  159. set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
  160. endif()
  161. add_compile_definitions(NOMINMAX=1 _USE_MATH_DEFINES=1 WIN32=1)
  162. message(STATUS "into windows build...")
  163. message(VERBOSE "CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}")
  164. if (${CMAKE_C_COMPILER_ID} STREQUAL "Clang-cl")
  165. message(FATAL_ERROR "only support clang-cl for windows build, pls check detail: scripts/cmake-build/BUILD_README.md")
  166. endif()
  167. # add flags for enable sse instruction optimize for X86, enable avx header to compile avx code
  168. set(WIN_FLAGS "-msse4.2 -O2 -D_AVX_ -D_AVX2_ -D__AVX__ -D__AVX2__ -D__FMA__")
  169. # if u CPU is cascadelake series, u can enable for performance
  170. # set(WIN_FLAGS "{WIN_FLAGS} -march=cascadelake -mtune=cascadelake")
  171. # set(WIN_FLAGS "{WIN_FLAGS} -mavx512cd -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi -mavx512vnni")
  172. # for windows build
  173. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=implicit-int-conversion -Wno-error=double-promotion")
  174. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=zero-as-null-pointer-constant -Wno-error=implicit-int-conversion")
  175. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=float-conversion -Wno-error=shadow-field -Wno-error=covered-switch-default")
  176. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=deprecated -Wno-error=documentation -Wno-error=unreachable-code-break")
  177. set(WIN_FLAGS "${WIN_FLAGS} /DWIN32 -Wno-macro-redefined /D_WIN32_WINNT=0x0601 /wd4819")
  178. set(WIN_FLAGS "${WIN_FLAGS} /D_CRT_SECURE_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /DNOGDI /D_USE_MATH_DEFINES /bigobj")
  179. set(WIN_FLAGS "${WIN_FLAGS} /Zm500 /EHs /wd4351 /wd4291 /wd4250 /wd4996 /wd4819 -Wno-inconsistent-dllimport")
  180. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WIN_FLAGS}")
  181. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WIN_FLAGS}")
  182. #FIXME: fix halide JIT on windows
  183. message(STATUS "disable jit, halide and mlir on windows host build...")
  184. set(MGE_WITH_HALIDE OFF)
  185. set(MGE_WITH_JIT OFF)
  186. set(MGE_WITH_JIT_MLIR OFF)
  187. #FIXME: fix MegRay on windows
  188. message(STATUS "Disable distributed build on windows host build...")
  189. set(MGE_WITH_DISTRIBUTED OFF)
  190. else()
  191. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
  192. set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
  193. if(ANDROID)
  194. set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -DNDEBUG")
  195. set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Ofast -DNDEBUG -g")
  196. else()
  197. set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
  198. set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -DNDEBUG -g")
  199. endif()
  200. endif()
  201. if(MGE_WITH_CUDA)
  202. include(cmake/cudnn.cmake)
  203. if(MGE_CUDA_USE_STATIC AND ("${CUDNN_VERSION}" VERSION_GREATER "8.0.0" OR "${CUDNN_VERSION}" VERSION_EQUAL "8.0.0") AND (NOT MGE_WITH_CUDNN_SHARED))
  204. message(WARNING "Static link CUDNN8 will auto enable MGE_WITH_LARGE_ARCHIVE=ON")
  205. set(MGE_WITH_LARGE_ARCHIVE ON)
  206. endif()
  207. endif()
  208. CHECK_CXX_COMPILER_FLAG(-fuse-ld=gold CXX_SUPPORT_GOLD)
  209. if(MGE_WITH_LARGE_ARCHIVE)
  210. message(STATUS "Set -mcmodel=large and disable -fuse-ld=gold")
  211. set(MGE_COMMON_LINKER_FLAGS "-mcmodel=large")
  212. elseif(CXX_SUPPORT_GOLD AND NOT ANDROID AND NOT APPLE AND NOT MSVC AND NOT WIN32 AND NOT MGE_WITH_LARGE_ARCHIVE)
  213. message(STATUS "Using GNU gold linker.")
  214. set(MGE_COMMON_LINKER_FLAGS "-fuse-ld=gold")
  215. endif()
  216. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MGE_COMMON_LINKER_FLAGS}")
  217. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MGE_COMMON_LINKER_FLAGS}")
  218. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MGE_COMMON_LINKER_FLAGS}")
  219. if(NOT MGE_WITH_JIT)
  220. if(MGE_WITH_HALIDE)
  221. message(WARNING "MGE_WITH_HALIDE is set to OFF with MGE_WITH_JIT disabled")
  222. set(MGE_WITH_HALIDE OFF)
  223. endif()
  224. if(MGE_WITH_JIT_MLIR)
  225. message(WARNING "MGE_WITH_JIT_MLIR is set to OFF with MGE_WITH_JIT disabled")
  226. set(MGE_WITH_JIT_MLIR OFF)
  227. endif()
  228. endif()
  229. # FIXME At present, there are some conflicts between the LLVM that halide
  230. # depends on and the LLVM that MLIR depends on. Should be fixed in subsequent
  231. # versions.
  232. if(MGE_BUILD_IMPERATIVE_RT AND MGE_WITH_HALIDE)
  233. message(FATAL_ERROR "cannot use HALIDE when building IMPERATIVE_RT")
  234. endif()
  235. if(MGE_WITH_JIT_MLIR AND MGE_WITH_HALIDE)
  236. message(FATAL_ERROR "cannot use HALIDE with MGE_WITH_JIT_MLIR enabled")
  237. endif()
  238. if(MGE_WITH_CUDA)
  239. # FIXME: check_language(CUDA) failed when sbsa mode!
  240. # detail: https://gitlab.kitware.com/cmake/cmake/-/issues/20676
  241. if(CMAKE_TOOLCHAIN_FILE)
  242. set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
  243. message(WARNING "force set CMAKE_CUDA_HOST_COMPILER to CMAKE_CXX_COMPILER when nvcc sbsa mode!!")
  244. endif()
  245. include(CheckLanguage)
  246. check_language(CUDA)
  247. if(NOT CMAKE_CUDA_COMPILER AND NOT CMAKE_TOOLCHAIN_FILE)
  248. message(FATAL_ERROR "CUDA compiler not found in PATH")
  249. endif()
  250. # remove this after CMAKE fix nvcc sbsa
  251. if(NOT CMAKE_CUDA_COMPILER AND CMAKE_TOOLCHAIN_FILE)
  252. set(CMAKE_CUDA_COMPILER "nvcc")
  253. message(WARNING "force set CMAKE_CUDA_COMPILER to nvcc when nvcc sbsa mode!!")
  254. endif()
  255. enable_language(CUDA)
  256. set(CMAKE_CUDA_STANDARD 14)
  257. set(CMAKE_CUDA_STANDARD_REQUIRED ON)
  258. endif()
  259. if(NOT MGE_WITH_CUDA)
  260. if(NOT MGE_ARCH STREQUAL "x86_64" AND NOT MGE_ARCH STREQUAL "i386")
  261. message(STATUS "Disable JIT support, as the MGE_ARCH is not X86 and CUDA is not enabled.")
  262. set(MGE_WITH_JIT OFF)
  263. set(MGE_WITH_JIT_MLIR OFF)
  264. endif()
  265. set(MGE_WITH_HALIDE OFF)
  266. message(STATUS "Disable TensorRT support, as CUDA is not enabled.")
  267. set(MGE_WITH_TRT OFF)
  268. endif()
  269. find_package(PythonInterp 3 REQUIRED)
  270. # NOTICE: just use for target, which do not depend on python api
  271. # PURPOSE: reuse target obj when switch python3 version
  272. # will fallback to PYTHON_EXECUTABLE if can not find in PATH env
  273. set(PYTHON3_IN_ENV "python3")
  274. find_program(PYTHON3_EXECUTABLE_WITHOUT_VERSION ${PYTHON3_IN_ENV})
  275. if (PYTHON3_EXECUTABLE_WITHOUT_VERSION)
  276. message(STATUS "use ${PYTHON3_IN_ENV} as PYTHON3_EXECUTABLE_WITHOUT_VERSION")
  277. set(PYTHON3_EXECUTABLE_WITHOUT_VERSION ${PYTHON3_IN_ENV})
  278. else()
  279. message(STATUS "fallback ${PYTHON_EXECUTABLE} as PYTHON3_EXECUTABLE_WITHOUT_VERSION,\
  280. target which depend on PYTHON3_EXECUTABLE_WITHOUT_VERSION will be rebuild when switch python3")
  281. set(PYTHON3_EXECUTABLE_WITHOUT_VERSION ${PYTHON_EXECUTABLE})
  282. endif()
  283. set(THREADS_PREFER_PTHREAD_FLAG ON)
  284. find_package(Threads)
  285. if(NOT "${CMAKE_THREAD_LIBS_INIT}" STREQUAL "")
  286. if(${CMAKE_THREAD_LIBS_INIT} STREQUAL "-pthread" AND MGE_WITH_CUDA)
  287. set_property(TARGET Threads::Threads
  288. PROPERTY INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-pthread>"
  289. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-pthread>")
  290. endif()
  291. endif()
  292. set(MGE_BLAS MKL CACHE STRING "BLAS implementaion used by MegEngine.")
  293. set_property(CACHE MGE_BLAS PROPERTY STRINGS MKL OpenBLAS)
  294. set(MGE_CUDA_GENCODE "" CACHE STRING "Overwrite -gencode specifications for CUDA")
  295. if(NOT CMAKE_CUDA_HOST_COMPILER)
  296. set(CMAKE_CUDA_HOST_COMPILER $(CMAKE_CXX_COMPILER))
  297. endif()
  298. if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  299. message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
  300. set(CMAKE_BUILD_TYPE RelWithDebInfo)
  301. endif()
  302. if(NOT MGE_ENABLE_RTTI)
  303. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
  304. endif()
  305. if(NOT MGE_ENABLE_EXCEPTIONS)
  306. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
  307. endif()
  308. if(MGE_WITH_TEST)
  309. include(cmake/gtest.cmake)
  310. endif()
  311. if(MGE_BUILD_IMPERATIVE_RT)
  312. set(CMAKE_CXX_STANDARD 17)
  313. endif()
  314. if(NOT ${MGE_WITH_CUDA} AND NOT ${MGE_WITH_ROCM})
  315. message(STATUS "Disable distributed support, as both CUDA and ROCm are disabled.")
  316. set(MGE_WITH_DISTRIBUTED OFF)
  317. endif()
  318. if(MGE_INFERENCE_ONLY)
  319. message(STATUS "Disable distributed support for inference only build.")
  320. set(MGE_WITH_DISTRIBUTED OFF)
  321. message(STATUS "Disable imperative_rt python module for inference only build.")
  322. set(MGE_BUILD_IMPERATIVE_RT OFF)
  323. endif()
  324. if(MGE_WITH_JIT_MLIR OR MGE_BUILD_IMPERATIVE_RT)
  325. include(cmake/llvm-project.cmake)
  326. endif()
  327. if(MGE_WITH_DISTRIBUTED)
  328. include(cmake/protobuf.cmake)
  329. include(cmake/zmq.cmake)
  330. endif()
  331. if(MGB_WITH_FLATBUFFERS)
  332. include(cmake/flatbuffers.cmake)
  333. endif()
  334. if(MGE_WITH_CUDA)
  335. include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
  336. foreach(path ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  337. get_filename_component(_NAME ${path} NAME)
  338. if(NOT ${_NAME} STREQUAL "stubs")
  339. list(APPEND CUDA_LINK_DIRECTORIES ${path})
  340. endif()
  341. endforeach()
  342. link_directories(${CUDA_LINK_DIRECTORIES})
  343. set(CMAKE_CUDA_FLAGS_DEBUG "-O0 -g")
  344. set(CMAKE_CUDA_FLAGS_RELEASE "-O3")
  345. set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-O3 -g")
  346. set(CMAKE_CUDA_FLAGS_MINSIZEREL "-Os")
  347. if(MSVC OR WIN32)
  348. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xfatbin -compress-all")
  349. set(CCBIN_FLAG "${CCBIN_FLAG} /wd4819 /wd4334 /wd4267 /wd4002 /wd4244 /wd4068")
  350. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  351. set(CCBIN_FLAG "${CCBIN_FLAG} -D_ITERATOR_DEBUG_LEVEL=2 -MTd")
  352. endif()
  353. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --compiler-options \" ${CCBIN_FLAG} \" ")
  354. else()
  355. set(CMAKE_CUDA_FLAGS "-Xcompiler -Wall,-Wextra -Xfatbin -compress-all")
  356. endif()
  357. if(NOT MGE_ENABLE_RTTI)
  358. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-rtti")
  359. endif()
  360. if(NOT MGE_ENABLE_EXCEPTIONS)
  361. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-exceptions")
  362. endif()
  363. if(NOT MGE_CUDA_GENCODE)
  364. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386" OR ${MGE_ARCH} STREQUAL "aarch64")
  365. set(MEGDNN_THREADS_512 0)
  366. if(MGE_WITH_CUDA AND MGE_CUDA_USE_STATIC AND ("${CUDNN_VERSION}" VERSION_GREATER "8.0.0" OR "${CUDNN_VERSION}" VERSION_EQUAL "8.0.0") AND (NOT MGE_WITH_CUDNN_SHARED))
  367. message(WARNING "Static link CUDNN8 with many sm is unworkable, we only enable sm61 sm70 sm75 by default, and enable MGE_WITH_LARGE_ARCHIVE=ON")
  368. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  369. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  370. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  371. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "11.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "11.1.0")
  372. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  373. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  374. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  375. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_80,code=sm_80")
  376. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_86,code=sm_86")
  377. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_86,code=compute_86")
  378. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "11.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "11.0.0")
  379. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  380. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  381. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  382. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_80,code=sm_80")
  383. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_80,code=compute_80")
  384. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0")
  385. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  386. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  387. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  388. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  389. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  390. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=compute_75")
  391. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "9.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "9.0.0")
  392. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  393. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  394. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  395. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  396. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=compute_70")
  397. else()
  398. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_35,code=sm_35")
  399. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  400. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  401. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  402. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=compute_61")
  403. endif()
  404. else()
  405. message(FATAL_ERROR "Unsupported CUDA host arch.")
  406. endif()
  407. else()
  408. set(MEGDNN_THREADS_512 1)
  409. endif()
  410. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} ${MGE_CUDA_GENCODE}")
  411. if(MGE_WITH_TRT)
  412. include(cmake/tensorrt.cmake)
  413. endif()
  414. if(MGE_CUDA_USE_STATIC)
  415. if(MGE_WITH_TRT)
  416. if(MSVC OR WIN32)
  417. message(STATUS "windows TRT_LIBRARY: ${TRT_LIBRARY}")
  418. list(APPEND MGE_CUDA_LIBS ${TRT_LIBRARY})
  419. else()
  420. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libnvinfer -Wl,--no-whole-archive)
  421. endif()
  422. if(TensorRT_VERSION_MAJOR GREATER_EQUAL 7)
  423. message(STATUS "handle trt myelin lib after trt7")
  424. list(APPEND MGE_CUDA_LIBS libmyelin_compiler libmyelin_executor libmyelin_pattern_runtime libmyelin_pattern_library)
  425. endif()
  426. endif()
  427. if("${CUDNN_VERSION}" STREQUAL "7.5.0")
  428. if(MSVC OR WIN32)
  429. message(STATUS "windows CUDNN_LIBRARY: ${CUDNN_LIBRARY}")
  430. list(APPEND MGE_CUDA_LIBS ${CUDNN_LIBRARY})
  431. else()
  432. message(STATUS "cudnn 7.5.0 has bug in cudnnConvolutionBiasActivationForward, need --whole-archive to workaround, ref https://docs.nvidia.com/deeplearning/cudnn/release-notes/rel_7xx.html")
  433. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libcudnn -Wl,--no-whole-archive)
  434. endif()
  435. else()
  436. if(MSVC OR WIN32)
  437. message(STATUS "windows CUDNN_LIBRARY: ${CUDNN_LIBRARY}")
  438. list(APPEND MGE_CUDA_LIBS ${CUDNN_LIBRARY})
  439. else()
  440. list(APPEND MGE_CUDA_LIBS libcudnn)
  441. endif()
  442. endif()
  443. if(MSVC OR WIN32)
  444. list(APPEND MGE_CUDA_LIBS cusolver.lib curand.lib cudart_static.lib cusparse.lib)
  445. else()
  446. list(APPEND MGE_CUDA_LIBS cusolver_static curand_static culibos cudart_static cusparse_static)
  447. endif()
  448. if(MSVC OR WIN32)
  449. list(APPEND MGE_CUDA_LIBS cublas.lib)
  450. else()
  451. if(MGE_WITH_CUBLAS_SHARED)
  452. list(APPEND MGE_CUDA_LIBS cublas)
  453. else()
  454. list(APPEND MGE_CUDA_LIBS cublas_static)
  455. endif()
  456. endif()
  457. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  458. if(MSVC OR WIN32)
  459. list(APPEND MGE_CUDA_LIBS cublasLt.lib)
  460. else()
  461. if(MGE_WITH_CUBLAS_SHARED)
  462. list(APPEND MGE_CUDA_LIBS cublasLt)
  463. else()
  464. list(APPEND MGE_CUDA_LIBS cublasLt_static)
  465. endif()
  466. endif()
  467. endif()
  468. if((${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0") AND NOT MSVC AND NOT WIN32)
  469. # mark all symbols from liblapack_static.a as weak to avoid
  470. # duplicated definition with mkl
  471. find_library(
  472. LAPACK_STATIC_PATH lapack_static
  473. HINTS ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  474. if(NOT LAPACK_STATIC_PATH)
  475. message(FATAL_ERROR "liblapack_static.a not found")
  476. endif()
  477. set(LAPACK_STATIC_COPY_PATH ${CMAKE_CURRENT_BINARY_DIR}/liblapack_static_copy.a)
  478. # add a target that run objcopy
  479. add_custom_command(
  480. OUTPUT ${LAPACK_STATIC_COPY_PATH}
  481. COMMAND ${CMAKE_OBJCOPY} -w -W* ${LAPACK_STATIC_PATH} ${LAPACK_STATIC_COPY_PATH}
  482. VERBATIM)
  483. add_custom_target(lapack_static_weak_target DEPENDS ${LAPACK_STATIC_COPY_PATH})
  484. # create a library named "lapack_static_weak"
  485. add_library(lapack_static_weak STATIC IMPORTED GLOBAL)
  486. add_dependencies(lapack_static_weak lapack_static_weak_target)
  487. set_target_properties(
  488. lapack_static_weak PROPERTIES
  489. IMPORTED_LOCATION ${LAPACK_STATIC_COPY_PATH})
  490. list(APPEND MGE_CUDA_LIBS lapack_static_weak ${LAPACK_STATIC_COPY_PATH})
  491. endif()
  492. else()
  493. if(MGE_WITH_TRT)
  494. list(APPEND MGE_CUDA_LIBS libnvinfer)
  495. if(TensorRT_VERSION_MAJOR GREATER_EQUAL 7)
  496. message(STATUS "handle trt myelin lib after trt7")
  497. list(APPEND MGE_CUDA_LIBS libmyelin)
  498. endif()
  499. endif()
  500. list(APPEND MGE_CUDA_LIBS libcudnn)
  501. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  502. list(APPEND MGE_CUDA_LIBS cublasLt cusolver cublas curand)
  503. endif()
  504. list(APPEND MGE_CUDA_LIBS cudart)
  505. endif()
  506. if(NOT MGE_WITH_CUDA_STUB)
  507. if(MSVC OR WIN32)
  508. list(APPEND MGE_CUDA_LIBS cuda.lib)
  509. else()
  510. list(APPEND MGE_CUDA_LIBS cuda)
  511. endif()
  512. endif()
  513. if(NOT MGE_WITH_NVRTC_STUB)
  514. if(MSVC OR WIN32)
  515. list(APPEND MGE_CUDA_LIBS nvrtc.lib)
  516. else()
  517. list(APPEND MGE_CUDA_LIBS nvrtc)
  518. endif()
  519. endif()
  520. if(MGE_WITH_ANY_CUDA_STUB)
  521. add_subdirectory(dnn/cuda-stub)
  522. list(APPEND MGE_CUDA_LIBS cuda-stub)
  523. endif()
  524. if(MSVC OR WIN32)
  525. list(APPEND MGE_CUDA_LIBS nvrtc.lib)
  526. else()
  527. list(APPEND MGE_CUDA_LIBS nvToolsExt)
  528. endif()
  529. set(MGE_CUDA_LIBS "${MGE_CUDA_LIBS} -lrt")
  530. if(UNIX)
  531. set(MGE_CUDA_LIBS "${MGE_CUDA_LIBS} -ldl")
  532. endif()
  533. endif()
  534. if(MGE_WITH_CAMBRICON)
  535. include_directories("$ENV{NEUWARE_HOME}/include")
  536. link_directories("$ENV{NEUWARE_HOME}/lib64")
  537. include(cmake/FindBANG/FindBANG.cmake)
  538. if (${MGE_MLU_ARCH} STREQUAL "MLU100")
  539. set(BANG_ARCH "100")
  540. elseif (${MGE_MLU_ARCH} STREQUAL "MLU1h8")
  541. set(BANG_ARCH "110")
  542. elseif (${MGE_MLU_ARCH} STREQUAL "MLU220")
  543. set(BANG_ARCH "220")
  544. elseif (${MGE_MLU_ARCH} STREQUAL "MLU270")
  545. set(BANG_ARCH "270")
  546. elseif (${MGE_MLU_ARCH} STREQUAL "MLU290")
  547. set(BANG_ARCH "290")
  548. elseif (${MGE_MLU_ARCH} STREQUAL "MLU200")
  549. set(BANG_ARCH "200")
  550. else()
  551. message (FATAL_ERROR "Unsupported MLU arch.")
  552. endif()
  553. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} --bang-mlu-arch=${MGE_MLU_ARCH}")
  554. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -std=c++11 -Werror")
  555. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__BANG_ARCH__=${BANG_ARCH}")
  556. if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  557. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -g -O0")
  558. elseif (${CMAKE_BUILD_TYPE} STREQUAL "Release")
  559. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -O3")
  560. elseif (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  561. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -g -O3")
  562. elseif (${CMAKE_BUILD_TYPE} STREQUAL "MinSizeRel")
  563. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -Os")
  564. endif()
  565. include(cmake/cnrt.cmake)
  566. include(cmake/cndev.cmake)
  567. include(cmake/cnml.cmake)
  568. list(APPEND MGE_CAMBRICON_LIBS libcnrt libcndev libcnml)
  569. set(MGE_CAMBRICON_LIBS "${MGE_CAMBRICON_LIBS}")
  570. endif()
  571. if (MGE_WITH_ROCM)
  572. include(cmake/rocm.cmake)
  573. endif ()
  574. if(MGE_WITH_ATLAS)
  575. add_subdirectory(dnn/atlas-stub)
  576. list(APPEND MGE_ATLAS_LIBS atlas-stub)
  577. set(MGE_ATLAS_LIBS "${MGE_ATLAS_LIBS}")
  578. set(MGB_ATLAS ${MGE_WITH_ATLAS})
  579. endif()
  580. find_program(CCACHE_BIN ccache)
  581. if(CCACHE_BIN)
  582. set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BIN})
  583. if(MGE_WITH_CUDA AND NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
  584. message(STATUS "Using ccache as CMAKE_CUDA_COMPILER_LAUNCHER")
  585. set(CMAKE_CUDA_COMPILER_LAUNCHER ${CCACHE_BIN})
  586. endif()
  587. endif()
  588. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  589. if(${MGE_BLAS} STREQUAL "MKL")
  590. include(cmake/mkl.cmake)
  591. set(MGE_BLAS_LIBS libmkl)
  592. elseif(${MGE_BLAS} STREQUAL "OpenBLAS")
  593. include(cmake/OpenBLAS.cmake)
  594. set(MGE_BLAS_LIBS libopenblas)
  595. else()
  596. message(FATAL_ERROR "Unknown BLAS implementation ${MGE_BLAS}")
  597. endif()
  598. endif()
  599. # MKLDNN build
  600. if(MGE_WITH_MKLDNN AND ${MGE_ARCH} STREQUAL "x86_64")
  601. include(cmake/MKL_DNN.cmake)
  602. set(MEGDNN_X86_WITH_MKL_DNN 1)
  603. endif()
  604. # RTTI
  605. if(MGE_ENABLE_RTTI)
  606. set(MEGDNN_ENABLE_MANGLING 0)
  607. set(MEGDNN_ENABLE_RTTI 1)
  608. else()
  609. set(MEGDNN_ENABLE_MANGLING 1)
  610. set(MEGDNN_ENABLE_RTTI 0)
  611. endif()
  612. set(MGB_VERBOSE_TYPEINFO_NAME ${MGE_ENABLE_RTTI})
  613. # Logging
  614. set(MGB_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  615. set(MEGDNN_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  616. set(MGB_ENABLE_JSON ${MGE_ENABLE_LOGGING})
  617. # Exception
  618. if(NOT MGE_ENABLE_EXCEPTIONS)
  619. message(STATUS "Exceptions disabled; MegEngine would kill itself when it is supposed to throw an exception.")
  620. endif()
  621. set(MGB_ENABLE_EXCEPTION ${MGE_ENABLE_EXCEPTIONS})
  622. set(MEGDNN_ENABLE_EXCEPTIONS ${MGE_ENABLE_EXCEPTIONS})
  623. # JIT
  624. if(MGE_WITH_JIT AND MGE_WITH_HALIDE)
  625. set(HALIDE_SHARED_LIBRARY OFF CACHE BOOL "Build as a shared library")
  626. include(cmake/Halide.cmake)
  627. endif()
  628. # Thread
  629. IF(APPLE)
  630. set(CMAKE_THREAD_LIBS_INIT "-lpthread")
  631. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  632. set(CMAKE_USE_WIN32_THREADS_INIT 0)
  633. set(CMAKE_USE_PTHREADS_INIT 1)
  634. set(THREADS_PREFER_PTHREAD_FLAG ON)
  635. message(STATUS "disable jit, halide and mlir on macos host build...")
  636. set(MGE_WITH_HALIDE OFF)
  637. set(MGE_WITH_JIT OFF)
  638. set(MGE_WITH_JIT_MLIR OFF)
  639. ENDIF()
  640. set(MGB_JIT ${MGE_WITH_JIT})
  641. set(MGB_JIT_MLIR ${MGE_WITH_JIT_MLIR})
  642. set(MGB_JIT_HALIDE ${MGE_WITH_HALIDE})
  643. if(MSVC OR WIN32)
  644. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  645. set(CMAKE_USE_WIN32_THREADS_INIT 1)
  646. set(CMAKE_USE_PTHREADS_INIT 1)
  647. set(THREADS_PREFER_PTHREAD_FLAG ON)
  648. endif()
  649. if(CMAKE_THREAD_LIBS_INIT OR CMAKE_USE_WIN32_THREADS_INIT OR ANDROID)
  650. set(MGB_HAVE_THREAD 1)
  651. endif()
  652. if(MGE_WITH_TEST)
  653. # use intra-op multi threads
  654. set(MEGDNN_ENABLE_MULTI_THREADS 1)
  655. endif()
  656. # CUDA
  657. set(MGB_CUDA ${MGE_WITH_CUDA})
  658. set(MEGDNN_WITH_CUDA ${MGE_WITH_CUDA})
  659. #ROCM
  660. set(MGB_ROCM ${MGE_WITH_ROCM})
  661. set(MEGDNN_WITH_ROCM ${MGE_WITH_ROCM})
  662. # CAMBRICON
  663. set(MGB_CAMBRICON ${MGE_WITH_CAMBRICON})
  664. set(MEGDNN_WITH_CAMBRICON ${MGE_WITH_CAMBRICON})
  665. # ENFLAME
  666. set(MGB_ENFLAME ${MGE_WITH_ENFLAME})
  667. set(MEGDNN_WITH_ENFLAME ${MGE_WITH_ENFLAME})
  668. # Debug info
  669. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  670. set(MGB_ASSERT_LOC 1)
  671. set(MGB_ENABLE_DEBUG_UTIL 1)
  672. else()
  673. set(MGB_ASSERT_LOC 0)
  674. set(MGB_ENABLE_DEBUG_UTIL 0)
  675. endif()
  676. # TensorRT
  677. set(MGB_ENABLE_TENSOR_RT ${MGE_WITH_TRT})
  678. # Inference only
  679. if(MGE_INFERENCE_ONLY AND NOT MGE_WITH_TEST)
  680. set(MGB_ENABLE_GRAD 0)
  681. set(MGB_BUILD_SLIM_SERVING 1)
  682. else()
  683. set(MGB_ENABLE_GRAD 1)
  684. set(MGB_BUILD_SLIM_SERVING 0)
  685. endif()
  686. # Distributed communication
  687. set(MGB_ENABLE_OPR_MM ${MGE_WITH_DISTRIBUTED})
  688. # MGE_ARCH related flags
  689. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  690. if(MGE_BLAS STREQUAL "MKL")
  691. set(MEGDNN_X86_WITH_MKL 1)
  692. elseif(MGE_BLAS STREQUAL "OpenBLAS")
  693. set(MEGDNN_X86_WITH_OPENBLAS 1)
  694. endif()
  695. endif()
  696. # Enable Naive
  697. if(MGE_ARCH STREQUAL "naive")
  698. set(MEGDNN_NAIVE 1)
  699. message(STATUS "MEGDNN_NAIVE is enabled; MegDNN performance is degraded.")
  700. endif()
  701. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  702. set(MEGDNN_X86 1)
  703. if(MGE_ARCH STREQUAL "x86_64")
  704. set(MEGDNN_X86_64 1)
  705. set(MEGDNN_64_BIT 1)
  706. if(NOT MSVC)
  707. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
  708. endif()
  709. else()
  710. set(MEGDNN_X86_32 1)
  711. if(NOT MSVC)
  712. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
  713. endif()
  714. endif()
  715. if(NOT MSVC)
  716. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mfpmath=sse")
  717. endif()
  718. endif()
  719. # dotprod is not enable by default on APPLE, cpuinfo has some problem on APPLE
  720. if(NOT APPLE)
  721. CHECK_CXX_COMPILER_FLAG("-march=armv8.2-a+dotprod" CXX_COMPILER_SUPPORT_DOT)
  722. if(CXX_COMPILER_SUPPORT_DOT)
  723. message(STATUS "Enable dotprod feature in armv8.2-a using MGB_ENABLE_DOT")
  724. set(MGB_ENABLE_DOT 1)
  725. endif()
  726. endif()
  727. if(MGE_ARCH STREQUAL "armv7")
  728. # -funsafe-math-optimizations to enable neon auto-vectorization (since neon is not fully IEEE 754 compatible, GCC does not turn on neon auto-vectorization by default.
  729. if(ANDROID)
  730. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon")
  731. endif()
  732. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funsafe-math-optimizations")
  733. set (MARCH "-march=armv7-a")
  734. set (MEGDNN_ARMV7 1)
  735. endif()
  736. if(MGE_ARCH STREQUAL "aarch64")
  737. set(MEGDNN_AARCH64 1)
  738. set(MEGDNN_64_BIT 1)
  739. set(MARCH "-march=armv8-a")
  740. set(MGB_AARCH64 1)
  741. if(MGE_ARMV8_2_FEATURE_FP16)
  742. message(STATUS "Enable fp16 feature support in armv8.2")
  743. if(NOT ${MGE_DISABLE_FLOAT16})
  744. set(MEGDNN_ENABLE_FP16_NEON 1)
  745. endif()
  746. set(MARCH "-march=armv8.2-a+fp16")
  747. endif()
  748. if(MGE_WITH_CUDA)
  749. message(WARNING "aarch64 ld will add -mfix-cortex-a53-843419 and -mfix-cortex-a53-835769,\
  750. when cuda enable and CMAKE with DEBUG build type,ld will take about 14min+,\
  751. for save link time(14min->1min), you may open below flags if not deploy on\
  752. arm a53 platform, or just build release type!")
  753. #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-fix-cortex-a53-843419 -mno-fix-cortex-a53-835769")
  754. endif()
  755. endif()
  756. if(MGE_ARCH STREQUAL "riscv64")
  757. set(MEGDNN_RISCV64 1)
  758. set(MEGDNN_64_BIT 1)
  759. endif()
  760. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MARCH}")
  761. set(MGE_VERSION_SCRIPT ${PROJECT_SOURCE_DIR}/src/version.ld CACHE INTERNAL "Path to linker version script")
  762. # Write out megbrain_build_config.h
  763. # It defines macros needed by both megbrain and dnn
  764. configure_file(src/megbrain_build_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h)
  765. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  766. add_subdirectory(dnn)
  767. list(APPEND MGB_OPR_PARAM_DEFS_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py)
  768. set(MGB_OPR_PARAM_DEFS_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/dnn/scripts/gen_param_defs.py)
  769. set(MGB_OPR_PARAM_DEFS_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/opr/include/)
  770. file(MAKE_DIRECTORY ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr)
  771. add_custom_command(
  772. OUTPUT ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  773. COMMAND ${PYTHON3_EXECUTABLE_WITHOUT_VERSION} ${MGB_OPR_PARAM_DEFS_SCRIPT} ${MGB_OPR_PARAM_DEFS_SRCS} ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  774. DEPENDS ${MGB_OPR_PARAM_DEFS_SRCS} ${MGB_OPR_PARAM_DEFS_SCRIPT}
  775. VERBATIM
  776. )
  777. list(APPEND MGB_OPR_PARAM_DEFS_OUTS
  778. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  779. )
  780. install(FILES ${MGB_OPR_PARAM_DEFS_OUTS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/megbrain/opr/)
  781. list(APPEND MGB_OPR_PARAM_DEFS_INC ${MGB_OPR_PARAM_DEFS_OUT_DIR})
  782. add_custom_target(_mgb_opr_param_defs DEPENDS ${MGB_OPR_PARAM_DEFS_OUTS})
  783. add_library(mgb_opr_param_defs INTERFACE)
  784. target_include_directories(mgb_opr_param_defs
  785. INTERFACE
  786. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  787. $<BUILD_INTERFACE:${MGB_OPR_PARAM_DEFS_INC}>
  788. )
  789. add_dependencies(mgb_opr_param_defs _mgb_opr_param_defs)
  790. install(TARGETS mgb_opr_param_defs EXPORT ${MGE_EXPORT_TARGETS})
  791. if(MGE_WITH_JIT_MLIR OR MGE_BUILD_IMPERATIVE_RT)
  792. # generate param_defs.td
  793. set(MGE_GENFILE_DIR ${PROJECT_BINARY_DIR}/src/genfiles)
  794. set(MGE_GEN_IR_DIR ${PROJECT_BINARY_DIR}/src/core/include/megbrain/ir)
  795. set(OPR_PARAM_DEFS_SRCS ${MGE_GENFILE_DIR}/opr_param_defs.py)
  796. set(OPR_PARAM_DEFS_SCRIPT ${PROJECT_SOURCE_DIR}/dnn/scripts/gen_tablegen.py)
  797. set(OPR_PARAM_DEFS_OUT ${MGE_GEN_IR_DIR}/param_defs.td)
  798. file(COPY ${PROJECT_SOURCE_DIR}/dnn/scripts/opr_param_defs.py DESTINATION ${MGE_GENFILE_DIR})
  799. file(READ ${PROJECT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py CONTENTS)
  800. file(APPEND ${OPR_PARAM_DEFS_SRCS} ${CONTENTS})
  801. file(MAKE_DIRECTORY ${MGE_GEN_IR_DIR})
  802. add_custom_command(
  803. OUTPUT ${OPR_PARAM_DEFS_OUT}
  804. COMMAND ${PYTHON3_EXECUTABLE_WITHOUT_VERSION} ${OPR_PARAM_DEFS_SCRIPT} ${OPR_PARAM_DEFS_SRCS} ${OPR_PARAM_DEFS_OUT}
  805. DEPENDS ${PROJECT_SOURCE_DIR}/dnn/scripts/opr_param_defs.py ${PROJECT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py ${OPR_PARAM_DEFS_SCRIPT}
  806. VERBATIM
  807. )
  808. # mlir tblgen sources
  809. set(MGE_IR_DIR ${PROJECT_SOURCE_DIR}/src/core/include/megbrain/ir)
  810. set(MGE_IR_INCLUDE_DIRS ${MLIR_LLVM_INCLUDE_DIR} ${MGE_IR_DIR} ${MGE_GEN_IR_DIR})
  811. list(TRANSFORM MGE_IR_INCLUDE_DIRS PREPEND "-I")
  812. file(GLOB_RECURSE MGE_IR_TDS ${MGE_IR_DIR}/*.td)
  813. add_custom_target(param_defs_tblgen DEPENDS ${OPR_PARAM_DEFS_OUT})
  814. endif()
  815. if(MGE_WITH_DISTRIBUTED)
  816. set(MEGRAY_WITH_NCCL ${MGE_WITH_CUDA} CACHE BOOL "Override MegRay option" FORCE)
  817. set(MEGRAY_WITH_RCCL ${MGE_WITH_ROCM} CACHE BOOL "Override MegRay option" FORCE)
  818. add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/MegRay)
  819. endif()
  820. add_subdirectory(src)
  821. if(MGE_BUILD_SDK)
  822. add_subdirectory(sdk/load-and-run)
  823. endif()
  824. if(MGE_BUILD_IMPERATIVE_RT)
  825. add_subdirectory(imperative)
  826. message(STATUS "Enable imperative python wrapper runtime")
  827. endif()
  828. if(MGE_WITH_TEST AND MGE_ENABLE_RTTI)
  829. add_subdirectory(test)
  830. endif()
  831. if(TARGET _imperative_rt)
  832. add_custom_target(
  833. develop
  834. COMMAND ${CMAKE_COMMAND} -E create_symlink
  835. ${CMAKE_CURRENT_BINARY_DIR}/imperative/python/${PACKAGE_NAME}/core/$<TARGET_FILE_NAME:${MODULE_NAME}>
  836. ${CMAKE_CURRENT_SOURCE_DIR}/imperative/python/${PACKAGE_NAME}/core/$<TARGET_FILE_NAME:${MODULE_NAME}>
  837. COMMAND ${CMAKE_COMMAND} -E create_symlink
  838. ${CMAKE_CURRENT_BINARY_DIR}/imperative/python/${PACKAGE_NAME}/version.py
  839. ${CMAKE_CURRENT_SOURCE_DIR}/imperative/python/${PACKAGE_NAME}/version.py
  840. DEPENDS _imperative_rt
  841. VERBATIM
  842. )
  843. endif()
  844. # Configure and install pkg-config.
  845. # Note that unlike the Config.cmake modules, this is not relocatable (and not
  846. # really portable) because we have two dependencies without pkg-config
  847. # descriptions: FlatBuffers and MKL-DNN
  848. if (MGE_USE_SYSTEM_MKLDNN)
  849. set (MGE_PKGCONFIG_LIBS_PRIVATE "-ldnnl")
  850. endif()
  851. if (MGE_USE_SYSTEM_OPENBLAS)
  852. set (MGE_PKGCONFIG_LIBS_PRIVATE "${MGE_PKGCONFIG_LIBS_PRIVATE} -lopenblas")
  853. endif()
  854. configure_file(cmake/megengine.pc.in
  855. ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  856. @ONLY)
  857. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  858. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  859. # Do not export targets if MGE_WITH_DISTRIBUTED is on. MegRay is not ready.
  860. if (NOT MGE_WITH_DISTRIBUTED)
  861. include(CMakePackageConfigHelpers)
  862. set (MGE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/MegEngine)
  863. configure_package_config_file(cmake/MegEngineConfig.cmake.in
  864. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  865. INSTALL_DESTINATION ${MGE_INSTALL_CMAKEDIR}
  866. )
  867. write_basic_package_version_file(
  868. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  869. VERSION ${MGB_VER_MAJOR}.${MGB_VER_MINOR}.${MGB_VER_PATCH}
  870. COMPATIBILITY SameMajorVersion)
  871. install(EXPORT ${MGE_EXPORT_TARGETS} DESTINATION ${MGE_INSTALL_CMAKEDIR})
  872. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  873. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  874. DESTINATION ${MGE_INSTALL_CMAKEDIR})
  875. endif()
  876. if(MSVC OR WIN32)
  877. add_compile_options(
  878. $<$<CONFIG:>:/MT>
  879. $<$<CONFIG:Debug>:/MTd>
  880. $<$<CONFIG:Release>:/MT>
  881. )
  882. foreach (CompilerFlag
  883. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  884. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
  885. CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
  886. CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
  887. if(${CompilerFlag} MATCHES "/MD")
  888. string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
  889. set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
  890. message(VERBOSE "MSVC flags: ${CompilerFlag}:${${CompilerFlag}}")
  891. endif()
  892. endforeach()
  893. endif()
  894. if(MGE_WITH_JIT_MLIR)
  895. add_subdirectory(tools/mlir/mgb-opt)
  896. add_subdirectory(tools/mlir/mgb-file-check)
  897. endif()
  898. if(MGE_WITH_CUDA AND MGE_CUDA_USE_STATIC AND("${CUDNN_VERSION}" VERSION_GREATER "8.0.0" OR "${CUDNN_VERSION}" VERSION_EQUAL "8.0.0") AND (NOT MGE_WITH_CUDNN_SHARED))
  899. message(WARNING "Static link CUDNN8 with many sm is unworkable, please use -DMGE_WITH_CUDNN_SHARED=ON or -DMGE_WITH_LARGE_ARCHIVE=ON -DMGE_CUDA_GENCODE=\"-gencode arch=compute_70,code=sm_70 arch=compute_75,code=sm_75\" ")
  900. message(WARNING "Static link CUDNN8 with many sm is unworkable, please use -DMGE_WITH_CUDNN_SHARED=ON or -DMGE_WITH_LARGE_ARCHIVE=ON -DMGE_CUDA_GENCODE=\"-gencode arch=compute_70,code=sm_70 arch=compute_75,code=sm_75\" ")
  901. message(WARNING "Static link CUDNN8 with many sm is unworkable, please use -DMGE_WITH_CUDNN_SHARED=ON or -DMGE_WITH_LARGE_ARCHIVE=ON -DMGE_CUDA_GENCODE=\"-gencode arch=compute_70,code=sm_70 arch=compute_75,code=sm_75\" ")
  902. endif()

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台