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

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