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 41 kB

5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005
  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. set(THREADS_PREFER_PTHREAD_FLAG ON)
  271. find_package(Threads)
  272. if(NOT "${CMAKE_THREAD_LIBS_INIT}" STREQUAL "")
  273. if(${CMAKE_THREAD_LIBS_INIT} STREQUAL "-pthread" AND MGE_WITH_CUDA)
  274. set_property(TARGET Threads::Threads
  275. PROPERTY INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-pthread>"
  276. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-pthread>")
  277. endif()
  278. endif()
  279. set(MGE_BLAS MKL CACHE STRING "BLAS implementaion used by MegEngine.")
  280. set_property(CACHE MGE_BLAS PROPERTY STRINGS MKL OpenBLAS)
  281. set(MGE_CUDA_GENCODE "" CACHE STRING "Overwrite -gencode specifications for CUDA")
  282. if(NOT CMAKE_CUDA_HOST_COMPILER)
  283. set(CMAKE_CUDA_HOST_COMPILER $(CMAKE_CXX_COMPILER))
  284. endif()
  285. if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  286. message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
  287. set(CMAKE_BUILD_TYPE RelWithDebInfo)
  288. endif()
  289. if(NOT MGE_ENABLE_RTTI)
  290. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
  291. endif()
  292. if(NOT MGE_ENABLE_EXCEPTIONS)
  293. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
  294. endif()
  295. if(MGE_WITH_TEST)
  296. include(cmake/gtest.cmake)
  297. endif()
  298. if(MGE_BUILD_IMPERATIVE_RT)
  299. set(CMAKE_CXX_STANDARD 17)
  300. endif()
  301. if(NOT ${MGE_WITH_CUDA} AND NOT ${MGE_WITH_ROCM})
  302. message(STATUS "Disable distributed support, as both CUDA and ROCm are disabled.")
  303. set(MGE_WITH_DISTRIBUTED OFF)
  304. endif()
  305. if(MGE_INFERENCE_ONLY)
  306. message(STATUS "Disable distributed support for inference only build.")
  307. set(MGE_WITH_DISTRIBUTED OFF)
  308. message(STATUS "Disable imperative_rt python module for inference only build.")
  309. set(MGE_BUILD_IMPERATIVE_RT OFF)
  310. endif()
  311. if(MGE_WITH_JIT_MLIR OR MGE_BUILD_IMPERATIVE_RT)
  312. include(cmake/llvm-project.cmake)
  313. endif()
  314. if(MGE_WITH_DISTRIBUTED)
  315. include(cmake/protobuf.cmake)
  316. include(cmake/zmq.cmake)
  317. endif()
  318. if(MGB_WITH_FLATBUFFERS)
  319. include(cmake/flatbuffers.cmake)
  320. endif()
  321. if(MGE_WITH_CUDA)
  322. include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
  323. foreach(path ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  324. get_filename_component(_NAME ${path} NAME)
  325. if(NOT ${_NAME} STREQUAL "stubs")
  326. list(APPEND CUDA_LINK_DIRECTORIES ${path})
  327. endif()
  328. endforeach()
  329. link_directories(${CUDA_LINK_DIRECTORIES})
  330. set(CMAKE_CUDA_FLAGS_DEBUG "-O0 -g")
  331. set(CMAKE_CUDA_FLAGS_RELEASE "-O3")
  332. set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-O3 -g")
  333. set(CMAKE_CUDA_FLAGS_MINSIZEREL "-Os")
  334. if(MSVC OR WIN32)
  335. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xfatbin -compress-all")
  336. set(CCBIN_FLAG "${CCBIN_FLAG} /wd4819 /wd4334 /wd4267 /wd4002 /wd4244 /wd4068")
  337. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  338. set(CCBIN_FLAG "${CCBIN_FLAG} -D_ITERATOR_DEBUG_LEVEL=2 -MTd")
  339. endif()
  340. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --compiler-options \" ${CCBIN_FLAG} \" ")
  341. else()
  342. set(CMAKE_CUDA_FLAGS "-Xcompiler -Wall,-Wextra -Xfatbin -compress-all")
  343. endif()
  344. if(NOT MGE_ENABLE_RTTI)
  345. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-rtti")
  346. endif()
  347. if(NOT MGE_ENABLE_EXCEPTIONS)
  348. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-exceptions")
  349. endif()
  350. if(NOT MGE_CUDA_GENCODE)
  351. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386" OR ${MGE_ARCH} STREQUAL "aarch64")
  352. set(MEGDNN_THREADS_512 0)
  353. 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))
  354. 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")
  355. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  356. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  357. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  358. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "11.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "11.1.0")
  359. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  360. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  361. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  362. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_80,code=sm_80")
  363. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_86,code=sm_86")
  364. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_86,code=compute_86")
  365. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "11.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "11.0.0")
  366. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  367. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  368. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  369. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_80,code=sm_80")
  370. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_80,code=compute_80")
  371. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0")
  372. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  373. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  374. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  375. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  376. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  377. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=compute_75")
  378. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "9.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "9.0.0")
  379. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  380. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  381. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  382. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  383. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=compute_70")
  384. else()
  385. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_35,code=sm_35")
  386. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  387. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  388. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  389. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=compute_61")
  390. endif()
  391. else()
  392. message(FATAL_ERROR "Unsupported CUDA host arch.")
  393. endif()
  394. else()
  395. set(MEGDNN_THREADS_512 1)
  396. endif()
  397. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} ${MGE_CUDA_GENCODE}")
  398. if(MGE_WITH_TRT)
  399. include(cmake/tensorrt.cmake)
  400. endif()
  401. if(MGE_CUDA_USE_STATIC)
  402. if(MGE_WITH_TRT)
  403. if(MSVC OR WIN32)
  404. message(STATUS "windows TRT_LIBRARY: ${TRT_LIBRARY}")
  405. list(APPEND MGE_CUDA_LIBS ${TRT_LIBRARY})
  406. else()
  407. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libnvinfer -Wl,--no-whole-archive)
  408. endif()
  409. if(TensorRT_VERSION_MAJOR GREATER_EQUAL 7)
  410. message(STATUS "handle trt myelin lib after trt7")
  411. list(APPEND MGE_CUDA_LIBS libmyelin_compiler libmyelin_executor libmyelin_pattern_runtime libmyelin_pattern_library)
  412. endif()
  413. endif()
  414. if("${CUDNN_VERSION}" STREQUAL "7.5.0")
  415. if(MSVC OR WIN32)
  416. message(STATUS "windows CUDNN_LIBRARY: ${CUDNN_LIBRARY}")
  417. list(APPEND MGE_CUDA_LIBS ${CUDNN_LIBRARY})
  418. else()
  419. 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")
  420. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libcudnn -Wl,--no-whole-archive)
  421. endif()
  422. else()
  423. if(MSVC OR WIN32)
  424. message(STATUS "windows CUDNN_LIBRARY: ${CUDNN_LIBRARY}")
  425. list(APPEND MGE_CUDA_LIBS ${CUDNN_LIBRARY})
  426. else()
  427. list(APPEND MGE_CUDA_LIBS libcudnn)
  428. endif()
  429. endif()
  430. if(MSVC OR WIN32)
  431. list(APPEND MGE_CUDA_LIBS cusolver.lib curand.lib cudart_static.lib cusparse.lib)
  432. else()
  433. list(APPEND MGE_CUDA_LIBS cusolver_static curand_static culibos cudart_static cusparse_static)
  434. endif()
  435. if(MSVC OR WIN32)
  436. list(APPEND MGE_CUDA_LIBS cublas.lib)
  437. else()
  438. if(MGE_WITH_CUBLAS_SHARED)
  439. list(APPEND MGE_CUDA_LIBS cublas)
  440. else()
  441. list(APPEND MGE_CUDA_LIBS cublas_static)
  442. endif()
  443. endif()
  444. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  445. if(MSVC OR WIN32)
  446. list(APPEND MGE_CUDA_LIBS cublasLt.lib)
  447. else()
  448. if(MGE_WITH_CUBLAS_SHARED)
  449. list(APPEND MGE_CUDA_LIBS cublasLt)
  450. else()
  451. list(APPEND MGE_CUDA_LIBS cublasLt_static)
  452. endif()
  453. endif()
  454. endif()
  455. 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)
  456. # mark all symbols from liblapack_static.a as weak to avoid
  457. # duplicated definition with mkl
  458. find_library(
  459. LAPACK_STATIC_PATH lapack_static
  460. HINTS ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  461. if(NOT LAPACK_STATIC_PATH)
  462. message(FATAL_ERROR "liblapack_static.a not found")
  463. endif()
  464. set(LAPACK_STATIC_COPY_PATH ${CMAKE_CURRENT_BINARY_DIR}/liblapack_static_copy.a)
  465. # add a target that run objcopy
  466. add_custom_command(
  467. OUTPUT ${LAPACK_STATIC_COPY_PATH}
  468. COMMAND ${CMAKE_OBJCOPY} -w -W* ${LAPACK_STATIC_PATH} ${LAPACK_STATIC_COPY_PATH}
  469. VERBATIM)
  470. add_custom_target(lapack_static_weak_target DEPENDS ${LAPACK_STATIC_COPY_PATH})
  471. # create a library named "lapack_static_weak"
  472. add_library(lapack_static_weak STATIC IMPORTED GLOBAL)
  473. add_dependencies(lapack_static_weak lapack_static_weak_target)
  474. set_target_properties(
  475. lapack_static_weak PROPERTIES
  476. IMPORTED_LOCATION ${LAPACK_STATIC_COPY_PATH})
  477. list(APPEND MGE_CUDA_LIBS lapack_static_weak ${LAPACK_STATIC_COPY_PATH})
  478. endif()
  479. else()
  480. if(MGE_WITH_TRT)
  481. list(APPEND MGE_CUDA_LIBS libnvinfer)
  482. if(TensorRT_VERSION_MAJOR GREATER_EQUAL 7)
  483. message(STATUS "handle trt myelin lib after trt7")
  484. list(APPEND MGE_CUDA_LIBS libmyelin)
  485. endif()
  486. endif()
  487. list(APPEND MGE_CUDA_LIBS libcudnn)
  488. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  489. list(APPEND MGE_CUDA_LIBS cublasLt cusolver cublas curand)
  490. endif()
  491. list(APPEND MGE_CUDA_LIBS cudart)
  492. endif()
  493. if(NOT MGE_WITH_CUDA_STUB)
  494. if(MSVC OR WIN32)
  495. list(APPEND MGE_CUDA_LIBS cuda.lib)
  496. else()
  497. list(APPEND MGE_CUDA_LIBS cuda)
  498. endif()
  499. endif()
  500. if(NOT MGE_WITH_NVRTC_STUB)
  501. if(MSVC OR WIN32)
  502. list(APPEND MGE_CUDA_LIBS nvrtc.lib)
  503. else()
  504. list(APPEND MGE_CUDA_LIBS nvrtc)
  505. endif()
  506. endif()
  507. if(MGE_WITH_ANY_CUDA_STUB)
  508. add_subdirectory(dnn/cuda-stub)
  509. list(APPEND MGE_CUDA_LIBS cuda-stub)
  510. endif()
  511. if(MSVC OR WIN32)
  512. list(APPEND MGE_CUDA_LIBS nvrtc.lib)
  513. else()
  514. list(APPEND MGE_CUDA_LIBS nvToolsExt)
  515. endif()
  516. set(MGE_CUDA_LIBS "${MGE_CUDA_LIBS} -lrt")
  517. if(UNIX)
  518. set(MGE_CUDA_LIBS "${MGE_CUDA_LIBS} -ldl")
  519. endif()
  520. endif()
  521. if(MGE_WITH_CAMBRICON)
  522. include_directories("$ENV{NEUWARE_HOME}/include")
  523. link_directories("$ENV{NEUWARE_HOME}/lib64")
  524. include(cmake/FindBANG/FindBANG.cmake)
  525. if (${MGE_MLU_ARCH} STREQUAL "MLU100")
  526. set(BANG_ARCH "100")
  527. elseif (${MGE_MLU_ARCH} STREQUAL "MLU1h8")
  528. set(BANG_ARCH "110")
  529. elseif (${MGE_MLU_ARCH} STREQUAL "MLU220")
  530. set(BANG_ARCH "220")
  531. elseif (${MGE_MLU_ARCH} STREQUAL "MLU270")
  532. set(BANG_ARCH "270")
  533. elseif (${MGE_MLU_ARCH} STREQUAL "MLU290")
  534. set(BANG_ARCH "290")
  535. elseif (${MGE_MLU_ARCH} STREQUAL "MLU200")
  536. set(BANG_ARCH "200")
  537. else()
  538. message (FATAL_ERROR "Unsupported MLU arch.")
  539. endif()
  540. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} --bang-mlu-arch=${MGE_MLU_ARCH}")
  541. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -std=c++11 -Werror")
  542. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__BANG_ARCH__=${BANG_ARCH}")
  543. if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  544. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -g -O0")
  545. elseif (${CMAKE_BUILD_TYPE} STREQUAL "Release")
  546. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -O3")
  547. elseif (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  548. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -g -O3")
  549. elseif (${CMAKE_BUILD_TYPE} STREQUAL "MinSizeRel")
  550. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -Os")
  551. endif()
  552. include(cmake/cnrt.cmake)
  553. include(cmake/cndev.cmake)
  554. include(cmake/cnml.cmake)
  555. list(APPEND MGE_CAMBRICON_LIBS libcnrt libcndev libcnml)
  556. set(MGE_CAMBRICON_LIBS "${MGE_CAMBRICON_LIBS}")
  557. endif()
  558. if (MGE_WITH_ROCM)
  559. include(cmake/rocm.cmake)
  560. endif ()
  561. if(MGE_WITH_ATLAS)
  562. add_subdirectory(dnn/atlas-stub)
  563. list(APPEND MGE_ATLAS_LIBS atlas-stub)
  564. set(MGE_ATLAS_LIBS "${MGE_ATLAS_LIBS}")
  565. set(MGB_ATLAS ${MGE_WITH_ATLAS})
  566. endif()
  567. find_program(CCACHE_BIN ccache)
  568. if(CCACHE_BIN)
  569. set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BIN})
  570. if(MGE_WITH_CUDA AND NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
  571. message(STATUS "Using ccache as CMAKE_CUDA_COMPILER_LAUNCHER")
  572. set(CMAKE_CUDA_COMPILER_LAUNCHER ${CCACHE_BIN})
  573. endif()
  574. endif()
  575. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  576. if(${MGE_BLAS} STREQUAL "MKL")
  577. include(cmake/mkl.cmake)
  578. set(MGE_BLAS_LIBS libmkl)
  579. elseif(${MGE_BLAS} STREQUAL "OpenBLAS")
  580. include(cmake/OpenBLAS.cmake)
  581. set(MGE_BLAS_LIBS libopenblas)
  582. else()
  583. message(FATAL_ERROR "Unknown BLAS implementation ${MGE_BLAS}")
  584. endif()
  585. endif()
  586. # MKLDNN build
  587. if(MGE_WITH_MKLDNN AND ${MGE_ARCH} STREQUAL "x86_64")
  588. include(cmake/MKL_DNN.cmake)
  589. set(MEGDNN_X86_WITH_MKL_DNN 1)
  590. endif()
  591. # RTTI
  592. if(MGE_ENABLE_RTTI)
  593. set(MEGDNN_ENABLE_MANGLING 0)
  594. set(MEGDNN_ENABLE_RTTI 1)
  595. else()
  596. set(MEGDNN_ENABLE_MANGLING 1)
  597. set(MEGDNN_ENABLE_RTTI 0)
  598. endif()
  599. set(MGB_VERBOSE_TYPEINFO_NAME ${MGE_ENABLE_RTTI})
  600. # Logging
  601. set(MGB_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  602. set(MEGDNN_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  603. set(MGB_ENABLE_JSON ${MGE_ENABLE_LOGGING})
  604. # Exception
  605. if(NOT MGE_ENABLE_EXCEPTIONS)
  606. message(STATUS "Exceptions disabled; MegEngine would kill itself when it is supposed to throw an exception.")
  607. endif()
  608. set(MGB_ENABLE_EXCEPTION ${MGE_ENABLE_EXCEPTIONS})
  609. set(MEGDNN_ENABLE_EXCEPTIONS ${MGE_ENABLE_EXCEPTIONS})
  610. # JIT
  611. if(MGE_WITH_JIT AND MGE_WITH_HALIDE)
  612. set(HALIDE_SHARED_LIBRARY OFF CACHE BOOL "Build as a shared library")
  613. include(cmake/Halide.cmake)
  614. endif()
  615. # Thread
  616. IF(APPLE)
  617. set(CMAKE_THREAD_LIBS_INIT "-lpthread")
  618. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  619. set(CMAKE_USE_WIN32_THREADS_INIT 0)
  620. set(CMAKE_USE_PTHREADS_INIT 1)
  621. set(THREADS_PREFER_PTHREAD_FLAG ON)
  622. message(STATUS "disable jit, halide and mlir on macos host build...")
  623. set(MGE_WITH_HALIDE OFF)
  624. set(MGE_WITH_JIT OFF)
  625. set(MGE_WITH_JIT_MLIR OFF)
  626. ENDIF()
  627. set(MGB_JIT ${MGE_WITH_JIT})
  628. set(MGB_JIT_MLIR ${MGE_WITH_JIT_MLIR})
  629. set(MGB_JIT_HALIDE ${MGE_WITH_HALIDE})
  630. if(MSVC OR WIN32)
  631. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  632. set(CMAKE_USE_WIN32_THREADS_INIT 1)
  633. set(CMAKE_USE_PTHREADS_INIT 1)
  634. set(THREADS_PREFER_PTHREAD_FLAG ON)
  635. endif()
  636. if(CMAKE_THREAD_LIBS_INIT OR CMAKE_USE_WIN32_THREADS_INIT OR ANDROID)
  637. set(MGB_HAVE_THREAD 1)
  638. endif()
  639. if(MGE_WITH_TEST)
  640. # use intra-op multi threads
  641. set(MEGDNN_ENABLE_MULTI_THREADS 1)
  642. endif()
  643. # CUDA
  644. set(MGB_CUDA ${MGE_WITH_CUDA})
  645. set(MEGDNN_WITH_CUDA ${MGE_WITH_CUDA})
  646. #ROCM
  647. set(MGB_ROCM ${MGE_WITH_ROCM})
  648. set(MEGDNN_WITH_ROCM ${MGE_WITH_ROCM})
  649. # CAMBRICON
  650. set(MGB_CAMBRICON ${MGE_WITH_CAMBRICON})
  651. set(MEGDNN_WITH_CAMBRICON ${MGE_WITH_CAMBRICON})
  652. # ENFLAME
  653. set(MGB_ENFLAME ${MGE_WITH_ENFLAME})
  654. set(MEGDNN_WITH_ENFLAME ${MGE_WITH_ENFLAME})
  655. # Debug info
  656. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  657. set(MGB_ASSERT_LOC 1)
  658. set(MGB_ENABLE_DEBUG_UTIL 1)
  659. else()
  660. set(MGB_ASSERT_LOC 0)
  661. set(MGB_ENABLE_DEBUG_UTIL 0)
  662. endif()
  663. # TensorRT
  664. set(MGB_ENABLE_TENSOR_RT ${MGE_WITH_TRT})
  665. # Inference only
  666. if(MGE_INFERENCE_ONLY AND NOT MGE_WITH_TEST)
  667. set(MGB_ENABLE_GRAD 0)
  668. set(MGB_BUILD_SLIM_SERVING 1)
  669. else()
  670. set(MGB_ENABLE_GRAD 1)
  671. set(MGB_BUILD_SLIM_SERVING 0)
  672. endif()
  673. # Distributed communication
  674. set(MGB_ENABLE_OPR_MM ${MGE_WITH_DISTRIBUTED})
  675. # MGE_ARCH related flags
  676. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  677. if(MGE_BLAS STREQUAL "MKL")
  678. set(MEGDNN_X86_WITH_MKL 1)
  679. elseif(MGE_BLAS STREQUAL "OpenBLAS")
  680. set(MEGDNN_X86_WITH_OPENBLAS 1)
  681. endif()
  682. endif()
  683. # Enable Naive
  684. if(MGE_ARCH STREQUAL "naive")
  685. set(MEGDNN_NAIVE 1)
  686. message(STATUS "MEGDNN_NAIVE is enabled; MegDNN performance is degraded.")
  687. endif()
  688. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  689. set(MEGDNN_X86 1)
  690. if(MGE_ARCH STREQUAL "x86_64")
  691. set(MEGDNN_X86_64 1)
  692. set(MEGDNN_64_BIT 1)
  693. if(NOT MSVC)
  694. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
  695. endif()
  696. else()
  697. set(MEGDNN_X86_32 1)
  698. if(NOT MSVC)
  699. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
  700. endif()
  701. endif()
  702. if(NOT MSVC)
  703. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mfpmath=sse")
  704. endif()
  705. endif()
  706. # dotprod is not enable by default on APPLE, cpuinfo has some problem on APPLE
  707. if(NOT APPLE)
  708. CHECK_CXX_COMPILER_FLAG("-march=armv8.2-a+dotprod" CXX_COMPILER_SUPPORT_DOT)
  709. if(CXX_COMPILER_SUPPORT_DOT)
  710. message(STATUS "Enable dotprod feature in armv8.2-a using MGB_ENABLE_DOT")
  711. set(MGB_ENABLE_DOT 1)
  712. endif()
  713. endif()
  714. if(MGE_ARCH STREQUAL "armv7")
  715. # -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.
  716. if(ANDROID)
  717. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon")
  718. endif()
  719. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funsafe-math-optimizations")
  720. set (MARCH "-march=armv7-a")
  721. set (MEGDNN_ARMV7 1)
  722. endif()
  723. if(MGE_ARCH STREQUAL "aarch64")
  724. set(MEGDNN_AARCH64 1)
  725. set(MEGDNN_64_BIT 1)
  726. set(MARCH "-march=armv8-a")
  727. set(MGB_AARCH64 1)
  728. if(MGE_ARMV8_2_FEATURE_FP16)
  729. message(STATUS "Enable fp16 feature support in armv8.2")
  730. if(NOT ${MGE_DISABLE_FLOAT16})
  731. set(MEGDNN_ENABLE_FP16_NEON 1)
  732. endif()
  733. set(MARCH "-march=armv8.2-a+fp16")
  734. endif()
  735. if(MGE_WITH_CUDA)
  736. message(WARNING "aarch64 ld will add -mfix-cortex-a53-843419 and -mfix-cortex-a53-835769,\
  737. when cuda enable and CMAKE with DEBUG build type,ld will take about 14min+,\
  738. for save link time(14min->1min), you may open below flags if not deploy on\
  739. arm a53 platform, or just build release type!")
  740. #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-fix-cortex-a53-843419 -mno-fix-cortex-a53-835769")
  741. endif()
  742. endif()
  743. if(MGE_ARCH STREQUAL "riscv64")
  744. set(MEGDNN_RISCV64 1)
  745. set(MEGDNN_64_BIT 1)
  746. endif()
  747. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MARCH}")
  748. set(MGE_VERSION_SCRIPT ${PROJECT_SOURCE_DIR}/src/version.ld CACHE INTERNAL "Path to linker version script")
  749. # Write out megbrain_build_config.h
  750. # It defines macros needed by both megbrain and dnn
  751. configure_file(src/megbrain_build_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h)
  752. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  753. add_subdirectory(dnn)
  754. list(APPEND MGB_OPR_PARAM_DEFS_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py)
  755. set(MGB_OPR_PARAM_DEFS_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/dnn/scripts/gen_param_defs.py)
  756. set(MGB_OPR_PARAM_DEFS_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/opr/include/)
  757. file(MAKE_DIRECTORY ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr)
  758. add_custom_command(
  759. OUTPUT
  760. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  761. COMMAND ${PYTHON_EXECUTABLE} ${MGB_OPR_PARAM_DEFS_SCRIPT} ${MGB_OPR_PARAM_DEFS_SRCS}
  762. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  763. DEPENDS ${MGB_OPR_PARAM_DEFS_SRCS} ${MGB_OPR_PARAM_DEFS_SCRIPT}
  764. VERBATIM
  765. )
  766. list(APPEND MGB_OPR_PARAM_DEFS_OUTS
  767. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  768. )
  769. install(FILES ${MGB_OPR_PARAM_DEFS_OUTS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/megbrain/opr/)
  770. list(APPEND MGB_OPR_PARAM_DEFS_INC ${MGB_OPR_PARAM_DEFS_OUT_DIR})
  771. add_custom_target(_mgb_opr_param_defs DEPENDS ${MGB_OPR_PARAM_DEFS_OUTS})
  772. add_library(mgb_opr_param_defs INTERFACE)
  773. target_include_directories(mgb_opr_param_defs
  774. INTERFACE
  775. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  776. $<BUILD_INTERFACE:${MGB_OPR_PARAM_DEFS_INC}>
  777. )
  778. add_dependencies(mgb_opr_param_defs _mgb_opr_param_defs)
  779. install(TARGETS mgb_opr_param_defs EXPORT ${MGE_EXPORT_TARGETS})
  780. if(MGE_WITH_JIT_MLIR OR MGE_BUILD_IMPERATIVE_RT)
  781. # generate param_defs.td
  782. set(MGE_GENFILE_DIR ${PROJECT_BINARY_DIR}/src/genfiles)
  783. set(MGE_GEN_IR_DIR ${PROJECT_BINARY_DIR}/src/core/include/megbrain/ir)
  784. set(OPR_PARAM_DEFS_SRCS ${MGE_GENFILE_DIR}/opr_param_defs.py)
  785. set(OPR_PARAM_DEFS_SCRIPT ${PROJECT_SOURCE_DIR}/dnn/scripts/gen_tablegen.py)
  786. set(OPR_PARAM_DEFS_OUT ${MGE_GEN_IR_DIR}/param_defs.td)
  787. file(COPY ${PROJECT_SOURCE_DIR}/dnn/scripts/opr_param_defs.py DESTINATION ${MGE_GENFILE_DIR})
  788. file(READ ${PROJECT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py CONTENTS)
  789. file(APPEND ${OPR_PARAM_DEFS_SRCS} ${CONTENTS})
  790. file(MAKE_DIRECTORY ${MGE_GEN_IR_DIR})
  791. add_custom_target(param_defs_tblgen
  792. COMMAND ${PYTHON_EXECUTABLE} ${OPR_PARAM_DEFS_SCRIPT} ${OPR_PARAM_DEFS_SRCS} ${OPR_PARAM_DEFS_OUT}
  793. DEPENDS ${OPR_PARAM_DEFS_SRCS} ${OPR_PARAM_DEFS_SCRIPT}
  794. VERBATIM
  795. )
  796. # mlir tblgen sources
  797. set(MGE_IR_DIR ${PROJECT_SOURCE_DIR}/src/core/include/megbrain/ir)
  798. set(MGE_IR_INCLUDE_DIRS ${MLIR_LLVM_INCLUDE_DIR} ${MGE_IR_DIR} ${MGE_GEN_IR_DIR})
  799. list(TRANSFORM MGE_IR_INCLUDE_DIRS PREPEND "-I")
  800. file(GLOB_RECURSE MGE_IR_TDS ${MGE_IR_DIR}/*.td)
  801. endif()
  802. if(MGE_WITH_DISTRIBUTED)
  803. set(MEGRAY_WITH_NCCL ${MGE_WITH_CUDA} CACHE BOOL "Override MegRay option" FORCE)
  804. set(MEGRAY_WITH_RCCL ${MGE_WITH_ROCM} CACHE BOOL "Override MegRay option" FORCE)
  805. add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/MegRay)
  806. endif()
  807. add_subdirectory(src)
  808. if(MGE_BUILD_SDK)
  809. add_subdirectory(sdk/load-and-run)
  810. endif()
  811. if(MGE_BUILD_IMPERATIVE_RT)
  812. add_subdirectory(imperative)
  813. message(STATUS "Enable imperative python wrapper runtime")
  814. endif()
  815. if(MGE_WITH_TEST AND MGE_ENABLE_RTTI)
  816. add_subdirectory(test)
  817. endif()
  818. if(TARGET _imperative_rt)
  819. add_custom_target(
  820. develop
  821. COMMAND ${CMAKE_COMMAND} -E create_symlink
  822. ${CMAKE_CURRENT_BINARY_DIR}/imperative/python/${PACKAGE_NAME}/core/$<TARGET_FILE_NAME:${MODULE_NAME}>
  823. ${CMAKE_CURRENT_SOURCE_DIR}/imperative/python/${PACKAGE_NAME}/core/$<TARGET_FILE_NAME:${MODULE_NAME}>
  824. COMMAND ${CMAKE_COMMAND} -E create_symlink
  825. ${CMAKE_CURRENT_BINARY_DIR}/imperative/python/${PACKAGE_NAME}/version.py
  826. ${CMAKE_CURRENT_SOURCE_DIR}/imperative/python/${PACKAGE_NAME}/version.py
  827. DEPENDS _imperative_rt
  828. VERBATIM
  829. )
  830. endif()
  831. # Configure and install pkg-config.
  832. # Note that unlike the Config.cmake modules, this is not relocatable (and not
  833. # really portable) because we have two dependencies without pkg-config
  834. # descriptions: FlatBuffers and MKL-DNN
  835. if (MGE_USE_SYSTEM_MKLDNN)
  836. set (MGE_PKGCONFIG_LIBS_PRIVATE "-ldnnl")
  837. endif()
  838. if (MGE_USE_SYSTEM_OPENBLAS)
  839. set (MGE_PKGCONFIG_LIBS_PRIVATE "${MGE_PKGCONFIG_LIBS_PRIVATE} -lopenblas")
  840. endif()
  841. configure_file(cmake/megengine.pc.in
  842. ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  843. @ONLY)
  844. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  845. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  846. # Do not export targets if MGE_WITH_DISTRIBUTED is on. MegRay is not ready.
  847. if (NOT MGE_WITH_DISTRIBUTED)
  848. include(CMakePackageConfigHelpers)
  849. set (MGE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/MegEngine)
  850. configure_package_config_file(cmake/MegEngineConfig.cmake.in
  851. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  852. INSTALL_DESTINATION ${MGE_INSTALL_CMAKEDIR}
  853. )
  854. write_basic_package_version_file(
  855. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  856. VERSION ${MGB_VER_MAJOR}.${MGB_VER_MINOR}.${MGB_VER_PATCH}
  857. COMPATIBILITY SameMajorVersion)
  858. install(EXPORT ${MGE_EXPORT_TARGETS} DESTINATION ${MGE_INSTALL_CMAKEDIR})
  859. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  860. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  861. DESTINATION ${MGE_INSTALL_CMAKEDIR})
  862. endif()
  863. if(MSVC OR WIN32)
  864. add_compile_options(
  865. $<$<CONFIG:>:/MT>
  866. $<$<CONFIG:Debug>:/MTd>
  867. $<$<CONFIG:Release>:/MT>
  868. )
  869. foreach (CompilerFlag
  870. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  871. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
  872. CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
  873. CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
  874. if(${CompilerFlag} MATCHES "/MD")
  875. string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
  876. set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
  877. message(VERBOSE "MSVC flags: ${CompilerFlag}:${${CompilerFlag}}")
  878. endif()
  879. endforeach()
  880. endif()
  881. if(MGE_WITH_JIT_MLIR)
  882. add_subdirectory(tools/mlir/mgb-opt)
  883. add_subdirectory(tools/mlir/mgb-file-check)
  884. endif()
  885. 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))
  886. 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\" ")
  887. 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\" ")
  888. 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\" ")
  889. endif()

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