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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. cmake_minimum_required(VERSION 3.13.0)
  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_HALIDE "Build MegEngine with Halide JIT" ON)
  27. option(MGE_ARMV8_2_FEATURE_FP16 "Enable armv8.2-a+fp16 support" OFF)
  28. option(MGE_ARMV8_2_FEATURE_DOTPROD "enable armv8.2-a+dotprod support" OFF)
  29. option(MGE_DISABLE_FLOAT16 "Disable MegEngine float16 support." OFF)
  30. option(MGE_WITH_CUDA "Enable MegEngine CUDA support." ON)
  31. option(MGE_CUDA_USE_STATIC "Enable MegEngine CUDA static linking." ON)
  32. option(MGE_WITH_TRT "Build MegEngine with TensorRT." ON)
  33. option(MGE_USE_SYSTEM_LIB "Build MegEngine with system libraries." OFF)
  34. option(MGB_WITH_FLATBUFFERS "Build MegBrain with FlatBuffers serialization support." ON)
  35. option(BUILD_SHARED_LIBS "Build shared libraries" ON)
  36. if (MGE_USE_SYSTEM_LIB)
  37. set (MGE_CUDA_USE_STATIC OFF)
  38. endif()
  39. if (MGB_WITH_FLATBUFFERS)
  40. set(MGB_ENABLE_FBS_SERIALIZATION ON)
  41. endif()
  42. if(CMAKE_TOOLCHAIN_FILE)
  43. message("We are cross compiling.")
  44. message("config FLATBUFFERS_FLATC_EXECUTABLE to: ${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  45. set(FLATBUFFERS_FLATC_EXECUTABLE "${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  46. if(ANDROID_TOOLCHAIN_ROOT)
  47. if(NOT "${ANDROID_ARCH_NAME}" STREQUAL "")
  48. set(ANDROID_ARCH ${ANDROID_ARCH_NAME})
  49. endif()
  50. if(${ANDROID_ARCH} STREQUAL "arm")
  51. set(MGE_ARCH "armv7")
  52. elseif(${ANDROID_ARCH} STREQUAL "arm64")
  53. set(MGE_ARCH "aarch64")
  54. else()
  55. message(FATAL_ERROR "DO NOT SUPPORT ANDROID ARCH NOW")
  56. endif()
  57. elseif(IOS_TOOLCHAIN_ROOT)
  58. if(${IOS_ARCH} STREQUAL "armv7")
  59. set(MGE_ARCH "armv7")
  60. elseif(${IOS_ARCH} STREQUAL "arm64")
  61. set(MGE_ARCH "aarch64")
  62. elseif(${IOS_ARCH} STREQUAL "armv7k")
  63. set(MGE_ARCH "armv7")
  64. elseif(${IOS_ARCH} STREQUAL "arm64e")
  65. set(MGE_ARCH "aarch64")
  66. elseif(${IOS_ARCH} STREQUAL "armv7s")
  67. set(MGE_ARCH "armv7")
  68. else()
  69. message(FATAL_ERROR "Unsupported IOS_ARCH.")
  70. endif()
  71. elseif(NOT "${ARM_CROSS_BUILD_ARCH}" STREQUAL "")
  72. set(MGE_ARCH ${ARM_CROSS_BUILD_ARCH})
  73. else()
  74. message(FATAL_ERROR "Unknown cross-compiling settings.")
  75. endif()
  76. message("CONFIG MGE_ARCH TO ${MGE_ARCH}")
  77. endif()
  78. if(${MGE_ARCH} STREQUAL "AUTO")
  79. if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
  80. set(MGE_ARCH "x86_64")
  81. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
  82. set(MGE_ARCH "i386")
  83. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
  84. set(MGE_ARCH "aarch64")
  85. elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm")
  86. set(MGE_ARCH "armv7")
  87. else()
  88. message(FATAL "Unknown machine architecture for MegEngine.")
  89. endif()
  90. endif()
  91. if(MSVC OR WIN32)
  92. add_compile_definitions(NOMINMAX=1 _USE_MATH_DEFINES=1 WIN32=1)
  93. message("-- into windows build...")
  94. message(" -- CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}")
  95. if (${CMAKE_C_COMPILER_ID} STREQUAL "Clang-cl")
  96. message(FATAL_ERROR "only support clang-cl for windows build, pls check detail: scripts/cmake-build/BUILD_README.md")
  97. endif()
  98. # add flags for sse/avx for X86
  99. set(WIN_FLAGS "-msse4.2 -mavx -mavx2")
  100. # if u CPU is cascadelake series, u can enable for performance
  101. # set(WIN_FLAGS "{WIN_FLAGS} -march=cascadelake -mtune=cascadelake")
  102. # set(WIN_FLAGS "{WIN_FLAGS} -mavx512cd -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi -mavx512vnni")
  103. # for windows build
  104. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=implicit-int-conversion -Wno-error=double-promotion")
  105. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=zero-as-null-pointer-constant -Wno-error=implicit-int-conversion")
  106. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=float-conversion -Wno-error=shadow-field -Wno-error=covered-switch-default")
  107. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=deprecated -Wno-error=documentation -Wno-error=unreachable-code-break")
  108. set(WIN_FLAGS "${WIN_FLAGS} /DWIN32 -Wno-macro-redefined /D_WIN32_WINNT=0x0601")
  109. set(WIN_FLAGS "${WIN_FLAGS} /D_CRT_SECURE_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /DNOGDI /D_USE_MATH_DEFINES /bigobj")
  110. set(WIN_FLAGS "${WIN_FLAGS} /Zm500 /EHs /wd4351 /wd4291 /wd4250 /wd4996 /wd4819 -Wno-inconsistent-dllimport")
  111. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WIN_FLAGS}")
  112. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WIN_FLAGS}")
  113. else()
  114. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
  115. set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
  116. if(ANDROID)
  117. set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -DNDEBUG")
  118. else()
  119. set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
  120. endif()
  121. endif()
  122. CHECK_CXX_COMPILER_FLAG(-fuse-ld=gold CXX_SUPPORT_GOLD)
  123. if(CXX_SUPPORT_GOLD AND NOT ANDROID AND NOT APPLE AND NOT MSVC AND NOT WIN32)
  124. message("-- Using GNU gold linker.")
  125. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold")
  126. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold")
  127. endif()
  128. if(NOT MGE_WITH_JIT)
  129. if(MGE_WITH_HALIDE)
  130. message(WARNING "MGE_WITH_HALIDE is set to OFF with MGE_WITH_JIT disabled")
  131. set(MGE_WITH_HALIDE OFF)
  132. endif()
  133. endif()
  134. if(MGE_WITH_CUDA)
  135. include(CheckLanguage)
  136. check_language(CUDA)
  137. if(NOT CMAKE_CUDA_COMPILER)
  138. message(FATAL_ERROR "CUDA compiler not found in PATH")
  139. endif()
  140. enable_language(CUDA)
  141. set(CMAKE_CUDA_STANDARD 14)
  142. set(CMAKE_CUDA_STANDARD_REQUIRED ON)
  143. endif()
  144. if(NOT MGE_WITH_CUDA)
  145. message("-- Disable JIT support, as CUDA is not enabled.")
  146. set(MGE_WITH_JIT OFF)
  147. set(MGE_WITH_HALIDE OFF)
  148. message("-- Disable TensorRT support, as CUDA is not enabled.")
  149. set(MGE_WITH_TRT OFF)
  150. endif()
  151. find_package(PythonInterp 3 REQUIRED)
  152. set(THREADS_PREFER_PTHREAD_FLAG ON)
  153. find_package(Threads)
  154. if(NOT "${CMAKE_THREAD_LIBS_INIT}" STREQUAL "")
  155. if(${CMAKE_THREAD_LIBS_INIT} STREQUAL "-pthread" AND MGE_WITH_CUDA)
  156. set_property(TARGET Threads::Threads
  157. PROPERTY INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-pthread>"
  158. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-pthread>")
  159. endif()
  160. endif()
  161. set(MGE_BLAS MKL CACHE STRING "BLAS implementaion used by MegEngine.")
  162. set_property(CACHE MGE_BLAS PROPERTY STRINGS MKL OpenBLAS)
  163. set(MGE_CUDA_GENCODE "" CACHE STRING "Overwrite -gencode specifications for CUDA")
  164. if(NOT CMAKE_CUDA_HOST_COMPILER)
  165. set(CMAKE_CUDA_HOST_COMPILER $(CMAKE_CXX_COMPILER))
  166. endif()
  167. option(MGE_ENABLE_RTTI "Build with RTTI" ON)
  168. option(MGE_ENABLE_LOGGING "Build with logging" ON)
  169. option(MGE_DEBUG_UTIL "Enable debug utility" ON)
  170. if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  171. message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
  172. set(CMAKE_BUILD_TYPE RelWithDebInfo)
  173. endif()
  174. if(NOT MGE_ENABLE_RTTI)
  175. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
  176. endif()
  177. option(MGE_ENABLE_EXCEPTIONS "Build with exceptions" ON)
  178. if(NOT MGE_ENABLE_EXCEPTIONS)
  179. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exception")
  180. endif()
  181. option(MGE_WITH_TEST "Enable test for MegEngine." OFF)
  182. if(MGE_WITH_TEST)
  183. include(cmake/gtest.cmake)
  184. endif()
  185. option(MGE_WITH_DISTRIBUTED "Build with distributed support" ON)
  186. if(NOT MGE_WITH_CUDA)
  187. message("-- Disable distributed support, as CUDA is not enabled.")
  188. set(MGE_WITH_DISTRIBUTED OFF)
  189. endif()
  190. option(MGE_INFERENCE_ONLY "Build inference only library." OFF)
  191. option(MGE_WITH_PYTHON_MODULE "Build MegEngine Python Module." ON)
  192. if(MGE_INFERENCE_ONLY)
  193. message("-- Disable distributed support for inference only build.")
  194. set(MGE_WITH_DISTRIBUTED OFF)
  195. message("-- Disable python module for inference only build.")
  196. set(MGE_WITH_PYTHON_MODULE OFF)
  197. message("-- Disable tests for inference only build.")
  198. set(MGE_WITH_TEST OFF)
  199. endif()
  200. if(MGE_WITH_DISTRIBUTED)
  201. include(cmake/protobuf.cmake)
  202. include(cmake/zmq.cmake)
  203. endif()
  204. if(MGB_WITH_FLATBUFFERS)
  205. include(cmake/flatbuffers.cmake)
  206. endif()
  207. if(MGE_WITH_CUDA)
  208. include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
  209. foreach(path ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  210. get_filename_component(_NAME ${path} NAME)
  211. if(NOT ${_NAME} STREQUAL "stubs")
  212. list(APPEND CUDA_LINK_DIRECTORIES ${path})
  213. endif()
  214. endforeach()
  215. link_directories(${CUDA_LINK_DIRECTORIES})
  216. set(CMAKE_CUDA_FLAGS_DEBUG "-O0 -g")
  217. set(CMAKE_CUDA_FLAGS_RELEASE "-O3")
  218. set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-O3 -g")
  219. set(CMAKE_CUDA_FLAGS_MINSIZEREL "-Os")
  220. set(CMAKE_CUDA_FLAGS "-Xcompiler -Wall,-Wextra -Xfatbin -compress-all")
  221. if(NOT MGE_ENABLE_RTTI)
  222. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-rtti")
  223. endif()
  224. if(NOT MGE_ENABLE_EXCEPTIONS)
  225. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-exception")
  226. endif()
  227. if(NOT MGE_CUDA_GENCODE)
  228. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  229. set(MEGDNN_THREADS_512 0)
  230. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0")
  231. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  232. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  233. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  234. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  235. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  236. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=compute_75")
  237. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "9.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "9.0.0")
  238. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  239. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  240. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  241. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  242. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=compute_70")
  243. else()
  244. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_35,code=sm_35")
  245. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  246. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  247. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  248. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=compute_61")
  249. endif()
  250. else()
  251. message(FATAL_ERROR "Unsupported CUDA host arch.")
  252. endif()
  253. else()
  254. set(MEGDNN_THREADS_512 1)
  255. endif()
  256. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} ${MGE_CUDA_GENCODE}")
  257. include(cmake/cudnn.cmake)
  258. if(MGE_WITH_TRT)
  259. include(cmake/tensorrt.cmake)
  260. endif()
  261. if(MGE_CUDA_USE_STATIC)
  262. if(MGE_WITH_TRT)
  263. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libnvinfer libcudnn -Wl,--no-whole-archive)
  264. else()
  265. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libcudnn -Wl,--no-whole-archive)
  266. endif()
  267. list(APPEND MGE_CUDA_LIBS cusolver_static cublas_static curand_static culibos cudart_static cusparse_static)
  268. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  269. list(APPEND MGE_CUDA_LIBS cublasLt_static)
  270. endif()
  271. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0")
  272. # mark all symbols from liblapack_static.a as weak to avoid
  273. # duplicated definition with mkl
  274. find_library(
  275. LAPACK_STATIC_PATH lapack_static
  276. HINTS ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  277. if(NOT LAPACK_STATIC_PATH)
  278. message(FATAL_ERROR "liblapack_static.a not found")
  279. endif()
  280. set(LAPACK_STATIC_COPY_PATH ${CMAKE_CURRENT_BINARY_DIR}/liblapack_static_copy.a)
  281. # add a target that run objcopy
  282. add_custom_command(
  283. OUTPUT ${LAPACK_STATIC_COPY_PATH}
  284. COMMAND ${CMAKE_OBJCOPY} -w -W* ${LAPACK_STATIC_PATH} ${LAPACK_STATIC_COPY_PATH}
  285. VERBATIM)
  286. add_custom_target(lapack_static_weak_target DEPENDS ${LAPACK_STATIC_COPY_PATH})
  287. # create a library named "lapack_static_weak"
  288. add_library(lapack_static_weak STATIC IMPORTED GLOBAL)
  289. add_dependencies(lapack_static_weak lapack_static_weak_target)
  290. set_target_properties(
  291. lapack_static_weak PROPERTIES
  292. IMPORTED_LOCATION ${LAPACK_STATIC_COPY_PATH})
  293. list(APPEND MGE_CUDA_LIBS lapack_static_weak ${LAPACK_STATIC_COPY_PATH})
  294. endif()
  295. else()
  296. if(MGE_WITH_TRT)
  297. list(APPEND MGE_CUDA_LIBS libnvinfer)
  298. endif()
  299. list(APPEND MGE_CUDA_LIBS libcudnn)
  300. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  301. list(APPEND MGE_CUDA_LIBS cublasLt cusolver cublas curand)
  302. endif()
  303. endif()
  304. add_subdirectory(dnn/cuda-stub)
  305. list(APPEND MGE_CUDA_LIBS nvrtc cuda-stub nvToolsExt)
  306. set(MGE_CUDA_LIBS "${MGE_CUDA_LIBS}")
  307. endif()
  308. find_program(CCACHE_BIN ccache)
  309. if(CCACHE_BIN)
  310. set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BIN})
  311. if(MGE_WITH_CUDA AND NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
  312. message("-- Using ccache as CMAKE_CUDA_COMPILER_LAUNCHER")
  313. set(CMAKE_CUDA_COMPILER_LAUNCHER ${CCACHE_BIN})
  314. endif()
  315. endif()
  316. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  317. if(${MGE_BLAS} STREQUAL "MKL")
  318. include(cmake/mkl.cmake)
  319. set(MGE_BLAS_LIBS libmkl)
  320. elseif(${MGE_BLAS} STREQUAL "OpenBLAS")
  321. include(cmake/OpenBLAS.cmake)
  322. set(MGE_BLAS_LIBS libopenblas)
  323. else()
  324. message(FATAL_ERROR "Unknown BLAS implementation ${MGE_BLAS}")
  325. endif()
  326. endif()
  327. option(MGE_WITH_MKLDNN "Enable Intel MKL_DNN support," ON)
  328. # MKLDNN build
  329. if(MGE_WITH_MKLDNN AND ${MGE_ARCH} STREQUAL "x86_64")
  330. include(cmake/MKL_DNN.cmake)
  331. set(MEGDNN_X86_WITH_MKL_DNN 1)
  332. endif()
  333. # RTTI
  334. if(MGE_ENABLE_RTTI)
  335. set(MEGDNN_ENABLE_MANGLING 0)
  336. set(MEGDNN_ENABLE_RTTI 1)
  337. else()
  338. set(MEGDNN_ENABLE_MANGLING 1)
  339. set(MEGDNN_ENABLE_RTTI 0)
  340. endif()
  341. set(MGB_VERBOSE_TYPEINFO_NAME ${MGE_ENABLE_RTTI})
  342. # Logging
  343. set(MGB_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  344. set(MEGDNN_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  345. set(MGB_ENABLE_JSON ${MGE_ENABLE_LOGGING})
  346. # Exception
  347. if(NOT MGE_ENABLE_EXCEPTIONS)
  348. message(STATUS "Exceptions disabled; MegEngine would kill itself when it is supposed to throw an exception.")
  349. endif()
  350. set(MGB_ENABLE_EXCEPTION ${MGE_ENABLE_EXCEPTIONS})
  351. set(MEGDNN_ENABLE_EXCEPTIONS ${MGE_ENABLE_EXCEPTIONS})
  352. # JIT
  353. if(MGE_WITH_JIT AND MGE_WITH_HALIDE)
  354. set(HALIDE_SHARED_LIBRARY OFF CACHE BOOL "Build as a shared library")
  355. include(cmake/Halide.cmake)
  356. endif()
  357. set(MGB_JIT ${MGE_WITH_JIT})
  358. set(MGB_JIT_HALIDE ${MGE_WITH_HALIDE})
  359. # Thread
  360. if(CMAKE_THREAD_LIBS_INIT)
  361. set(MGB_HAVE_THREAD 1)
  362. endif()
  363. if(MGE_WITH_TEST)
  364. # use intra-op multi threads
  365. set(MEGDNN_ENABLE_MULTI_THREADS 1)
  366. endif()
  367. # CUDA
  368. set(MGB_CUDA ${MGE_WITH_CUDA})
  369. set(MEGDNN_WITH_CUDA ${MGE_WITH_CUDA})
  370. # Debug info
  371. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  372. set(MGB_ASSERT_LOC 1)
  373. set(MGB_ENABLE_DEBUG_UTIL 1)
  374. else()
  375. set(MGB_ASSERT_LOC 0)
  376. set(MGB_ENABLE_DEBUG_UTIL 0)
  377. endif()
  378. # FIXME: remove this after imp DEBUG UTIL for windows
  379. if(MSVC OR WIN32)
  380. set(MGB_ENABLE_DEBUG_UTIL 0)
  381. message(" -- disable MGB_ENABLE_DEBUG_UTIL in windows build")
  382. endif()
  383. # TensorRT
  384. set(MGB_ENABLE_TENSOR_RT ${MGE_WITH_TRT})
  385. # Inference only
  386. if(MGE_INFERENCE_ONLY)
  387. set(MGB_ENABLE_GRAD 0)
  388. set(MGB_BUILD_SLIM_SERVING 1)
  389. else()
  390. set(MGB_ENABLE_GRAD 1)
  391. set(MGB_BUILD_SLIM_SERVING 0)
  392. endif()
  393. # Distributed communication
  394. set(MGB_ENABLE_OPR_MM ${MGE_WITH_DISTRIBUTED})
  395. # MGE_ARCH related flags
  396. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  397. if(MGE_BLAS STREQUAL "MKL")
  398. set(MEGDNN_X86_WITH_MKL 1)
  399. elseif(MGE_BLAS STREQUAL "OpenBLAS")
  400. set(MEGDNN_X86_WITH_OPENBLAS 1)
  401. endif()
  402. endif()
  403. # Enable Naive
  404. if(MGE_ARCH STREQUAL "naive")
  405. set(MEGDNN_NAIVE 1)
  406. message(WARNING "MEGDNN_NAIVE is enabled; MegDNN performance is degraded.")
  407. endif()
  408. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  409. set(MEGDNN_X86 1)
  410. if(MGE_ARCH STREQUAL "x86_64")
  411. set(MEGDNN_X86_64 1)
  412. set(MEGDNN_64_BIT 1)
  413. if(NOT MSVC)
  414. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
  415. endif()
  416. else()
  417. set(MEGDNN_X86_32 1)
  418. if(NOT MSVC)
  419. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
  420. endif()
  421. endif()
  422. if(NOT MSVC)
  423. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mfpmath=sse")
  424. endif()
  425. endif()
  426. if(MGE_ARCH STREQUAL "armv7")
  427. # -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.
  428. if(ANDROID)
  429. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon")
  430. endif()
  431. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funsafe-math-optimizations")
  432. set (MARCH "-march=armv7-a")
  433. set (MEGDNN_ARMV7 1)
  434. endif()
  435. if(MGE_ARCH STREQUAL "aarch64")
  436. set(MEGDNN_AARCH64 1)
  437. set(MEGDNN_64_BIT 1)
  438. set(MARCH "-march=armv8-a")
  439. if(MGE_ARMV8_2_FEATURE_FP16)
  440. message("Enable fp16 feature support in armv8.2")
  441. if(NOT ${MGE_DISABLE_FLOAT16})
  442. set(MEGDNN_ENABLE_FP16_NEON 1)
  443. endif()
  444. set(MARCH "-march=armv8.2-a+fp16")
  445. endif()
  446. if(MGE_ARMV8_2_FEATURE_DOTPROD)
  447. message("Enable dotprod feature support in armv8.2")
  448. if(MGE_ARMV8_2_FEATURE_FP16)
  449. set(MARCH "-march=armv8.2-a+fp16+dotprod")
  450. else()
  451. set(MARCH "-march=armv8.2-a+dotprod")
  452. endif()
  453. endif()
  454. endif()
  455. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MARCH}")
  456. # Write out megbrain_build_config.h
  457. # It defines macros needed by both megbrain and dnn
  458. configure_file(src/megbrain_build_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h)
  459. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  460. add_subdirectory(dnn)
  461. list(APPEND MGB_OPR_PARAM_DEFS_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py)
  462. set(MGB_OPR_PARAM_DEFS_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/dnn/scripts/gen_param_defs.py)
  463. set(MGB_OPR_PARAM_DEFS_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/opr/include/)
  464. file(MAKE_DIRECTORY ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr)
  465. add_custom_command(
  466. OUTPUT
  467. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  468. COMMAND ${PYTHON_EXECUTABLE} ${MGB_OPR_PARAM_DEFS_SCRIPT} ${MGB_OPR_PARAM_DEFS_SRCS}
  469. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  470. DEPENDS ${MGB_OPR_PARAM_DEFS_SRCS} ${MGB_OPR_PARAM_DEFS_SCRIPT}
  471. VERBATIM
  472. )
  473. list(APPEND MGB_OPR_PARAM_DEFS_OUTS
  474. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  475. )
  476. install(FILES ${MGB_OPR_PARAM_DEFS_OUTS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/megbrain/opr/)
  477. list(APPEND MGB_OPR_PARAM_DEFS_INC ${MGB_OPR_PARAM_DEFS_OUT_DIR})
  478. add_custom_target(_mgb_opr_param_defs DEPENDS ${MGB_OPR_PARAM_DEFS_OUTS})
  479. add_library(mgb_opr_param_defs INTERFACE)
  480. target_include_directories(mgb_opr_param_defs
  481. INTERFACE
  482. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  483. $<BUILD_INTERFACE:${MGB_OPR_PARAM_DEFS_INC}>
  484. )
  485. add_dependencies(mgb_opr_param_defs _mgb_opr_param_defs)
  486. install(TARGETS mgb_opr_param_defs EXPORT ${MGE_EXPORT_TARGETS})
  487. if(MGE_WITH_DISTRIBUTED)
  488. add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/MegRay)
  489. endif()
  490. add_subdirectory(src)
  491. add_subdirectory(sdk/load-and-run)
  492. if(MGE_WITH_PYTHON_MODULE)
  493. add_subdirectory(python_module)
  494. endif()
  495. if(MGE_WITH_TEST AND MGE_ENABLE_RTTI)
  496. add_subdirectory(test)
  497. endif()
  498. if(TARGET mgb)
  499. add_custom_target(
  500. develop
  501. COMMAND ${CMAKE_COMMAND} -E create_symlink
  502. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/$<TARGET_FILE_NAME:mgb>
  503. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/$<TARGET_FILE_NAME:mgb>
  504. COMMAND ${CMAKE_COMMAND} -E create_symlink
  505. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/mgb.py
  506. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/mgb.py
  507. COMMAND ${CMAKE_COMMAND} -E create_symlink
  508. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/opr.py
  509. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/opr.py
  510. COMMAND ${CMAKE_COMMAND} -E create_symlink
  511. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/opr_param_defs.py
  512. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/opr_param_defs.py
  513. COMMAND ${CMAKE_COMMAND} -E create_symlink
  514. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/include
  515. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/include
  516. DEPENDS mgb
  517. VERBATIM
  518. )
  519. endif()
  520. IF(APPLE)
  521. set(CMAKE_THREAD_LIBS_INIT "-lpthread")
  522. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  523. set(CMAKE_USE_WIN32_THREADS_INIT 0)
  524. set(CMAKE_USE_PTHREADS_INIT 1)
  525. set(THREADS_PREFER_PTHREAD_FLAG ON)
  526. ENDIF()
  527. # Configure and install pkg-config.
  528. # Note that unlike the Config.cmake modules, this is not relocatable (and not
  529. # really portable) because we have two dependencies without pkg-config
  530. # descriptions: FlatBuffers and MKL-DNN
  531. if (MGE_USE_SYSTEM_MKLDNN)
  532. set (MGE_PKGCONFIG_LIBS_PRIVATE "-ldnnl")
  533. endif()
  534. if (MGE_USE_SYSTEM_OPENBLAS)
  535. set (MGE_PKGCONFIG_LIBS_PRIVATE "${MGE_PKGCONFIG_LIBS_PRIVATE} -lopenblas")
  536. endif()
  537. configure_file(cmake/megengine.pc.in
  538. ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  539. @ONLY)
  540. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  541. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  542. # Do not export targets if MGE_WITH_DISTRIBUTED is on. MegRay is not ready.
  543. if (NOT MGE_WITH_DISTRIBUTED)
  544. include(CMakePackageConfigHelpers)
  545. set (MGE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/MegEngine)
  546. configure_package_config_file(cmake/MegEngineConfig.cmake.in
  547. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  548. INSTALL_DESTINATION ${MGE_INSTALL_CMAKEDIR}
  549. )
  550. write_basic_package_version_file(
  551. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  552. VERSION ${MGB_VER_MAJOR}.${MGB_VER_MINOR}.${MGB_VER_PATCH}
  553. COMPATIBILITY SameMajorVersion)
  554. install(EXPORT ${MGE_EXPORT_TARGETS} DESTINATION ${MGE_INSTALL_CMAKEDIR})
  555. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  556. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  557. DESTINATION ${MGE_INSTALL_CMAKEDIR})
  558. endif()

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