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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. cmake_minimum_required(VERSION 3.9.0)
  2. project(MegEngine)
  3. set(CMAKE_CXX_STANDARD 14)
  4. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  5. set(CMAKE_CXX_EXTENSIONS OFF)
  6. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  7. set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
  8. if(NOT MSVC AND NOT APPLE)
  9. set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Dqc <TARGET> <LINK_FLAGS> <OBJECTS>")
  10. set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> Dq <TARGET> <LINK_FLAGS> <OBJECTS>")
  11. set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
  12. endif()
  13. include(CheckCXXCompilerFlag)
  14. CHECK_CXX_COMPILER_FLAG(-Wclass-memaccess CXX_SUPPORT_WCLASS_MEMACCESS)
  15. set(MGE_ARCH AUTO CACHE STRING "Architecture on which MegEngine to be built.")
  16. set_property(CACHE MGE_ARCH PROPERTY STRINGS AUTO
  17. x86_64 i386
  18. armv7 aarch64
  19. naive fallback
  20. )
  21. option(MGE_WITH_JIT "Build MegEngine with JIT." ON)
  22. option(MGE_WITH_HALIDE "Build MegEngine with Halide JIT" ON)
  23. option(MGE_ARMV8_2_FEATURE_FP16 "Enable armv8.2-a+fp16 support" OFF)
  24. option(MGE_ARMV8_2_FEATURE_DOTPROD "enable armv8.2-a+dotprod support" OFF)
  25. option(MGE_DISABLE_FLOAT16 "Disable MegEngine float16 support." OFF)
  26. option(MGE_WITH_CUDA "Enable MegEngine CUDA support." ON)
  27. option(MGE_CUDA_USE_STATIC "Enable MegEngine CUDA static linking." ON)
  28. option(MGE_WITH_TRT "Build MegEngine with TensorRT." ON)
  29. option(MGE_USE_SYSTEM_LIB "Build MegEngine with system libraries." OFF)
  30. option(MGB_WITH_FLATBUFFERS "Build MegBrain with FlatBuffers serialization support." ON)
  31. if(CMAKE_TOOLCHAIN_FILE)
  32. message("We are cross compiling.")
  33. message("config FLATBUFFERS_FLATC_EXECUTABLE to: ${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  34. set(FLATBUFFERS_FLATC_EXECUTABLE "${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  35. if(ANDROID_TOOLCHAIN_ROOT)
  36. if(NOT "${ANDROID_ARCH_NAME}" STREQUAL "")
  37. set(ANDROID_ARCH ${ANDROID_ARCH_NAME})
  38. endif()
  39. if(${ANDROID_ARCH} STREQUAL "arm")
  40. set(MGE_ARCH "armv7")
  41. elseif(${ANDROID_ARCH} STREQUAL "arm64")
  42. set(MGE_ARCH "aarch64")
  43. else()
  44. message(FATAL_ERROR "DO NOT SUPPORT ANDROID ARCH NOW")
  45. endif()
  46. elseif(IOS_TOOLCHAIN_ROOT)
  47. if(${IOS_ARCH} STREQUAL "armv7")
  48. set(MGE_ARCH "armv7")
  49. elseif(${IOS_ARCH} STREQUAL "arm64")
  50. set(MGE_ARCH "aarch64")
  51. elseif(${IOS_ARCH} STREQUAL "armv7k")
  52. set(MGE_ARCH "armv7")
  53. elseif(${IOS_ARCH} STREQUAL "arm64e")
  54. set(MGE_ARCH "aarch64")
  55. elseif(${IOS_ARCH} STREQUAL "armv7s")
  56. set(MGE_ARCH "armv7")
  57. else()
  58. message(FATAL_ERROR "Unsupported IOS_ARCH.")
  59. endif()
  60. elseif(NOT "${ARM_CROSS_BUILD_ARCH}" STREQUAL "")
  61. set(MGE_ARCH ${ARM_CROSS_BUILD_ARCH})
  62. else()
  63. message(FATAL_ERROR "Unknown cross-compiling settings.")
  64. endif()
  65. message("CONFIG MGE_ARCH TO ${MGE_ARCH}")
  66. endif()
  67. if(${MGE_ARCH} STREQUAL "AUTO")
  68. if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  69. set(MGE_ARCH "x86_64")
  70. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
  71. set(MGE_ARCH "i386")
  72. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
  73. set(MGE_ARCH "aarch64")
  74. elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm")
  75. set(MGE_ARCH "armv7")
  76. else()
  77. message(FATAL "Unknown machine architecture for MegEngine.")
  78. endif()
  79. endif()
  80. CHECK_CXX_COMPILER_FLAG(-fuse-ld=gold CXX_SUPPORT_GOLD)
  81. if(CXX_SUPPORT_GOLD AND NOT ANDROID AND NOT APPLE)
  82. message("-- Using GNU gold linker.")
  83. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold")
  84. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold")
  85. endif()
  86. if(NOT MGE_WITH_JIT)
  87. if(MGE_WITH_HALIDE)
  88. message(WARNING "MGE_WITH_HALIDE is set to OFF with MGE_WITH_JIT disabled")
  89. set(MGE_WITH_HALIDE OFF)
  90. endif()
  91. endif()
  92. if(MGE_WITH_CUDA)
  93. include(CheckLanguage)
  94. check_language(CUDA)
  95. if(NOT CMAKE_CUDA_COMPILER)
  96. message(FATAL_ERROR "CUDA compiler not found in PATH")
  97. endif()
  98. enable_language(CUDA)
  99. set(CMAKE_CUDA_STANDARD 14)
  100. set(CMAKE_CUDA_STANDARD_REQUIRED ON)
  101. endif()
  102. if(NOT MGE_WITH_CUDA)
  103. message("-- Disable JIT support, as CUDA is not enabled.")
  104. set(MGE_WITH_JIT OFF)
  105. set(MGE_WITH_HALIDE OFF)
  106. message("-- Disable TensorRT support, as CUDA is not enabled.")
  107. set(MGE_WITH_TRT OFF)
  108. endif()
  109. find_package(PythonInterp 3 REQUIRED)
  110. set(THREADS_PREFER_PTHREAD_FLAG ON)
  111. find_package(Threads)
  112. if(NOT "${CMAKE_THREAD_LIBS_INIT}" STREQUAL "")
  113. if(${CMAKE_THREAD_LIBS_INIT} STREQUAL "-pthread" AND MGE_WITH_CUDA)
  114. set_property(TARGET Threads::Threads
  115. PROPERTY INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-pthread>"
  116. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-pthread>")
  117. endif()
  118. endif()
  119. set(MGE_BLAS MKL CACHE STRING "BLAS implementaion used by MegEngine.")
  120. set_property(CACHE MGE_BLAS PROPERTY STRINGS MKL OpenBLAS)
  121. set(MGE_CUDA_GENCODE "" CACHE STRING "Overwrite -gencode specifications for CUDA")
  122. if(NOT CMAKE_CUDA_HOST_COMPILER)
  123. set(CMAKE_CUDA_HOST_COMPILER $(CMAKE_CXX_COMPILER))
  124. endif()
  125. option(MGE_ENABLE_RTTI "Build with RTTI" ON)
  126. option(MGE_ENABLE_LOGGING "Build with logging" ON)
  127. option(MGE_DEBUG_UTIL "Enable debug utility" ON)
  128. if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  129. message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
  130. set(CMAKE_BUILD_TYPE RelWithDebInfo)
  131. endif()
  132. if(NOT MGE_ENABLE_RTTI)
  133. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
  134. endif()
  135. option(MGE_ENABLE_EXCEPTIONS "Build with exceptions" ON)
  136. if(NOT MGE_ENABLE_EXCEPTIONS)
  137. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exception")
  138. endif()
  139. option(MGE_WITH_TEST "Enable test for MegEngine." OFF)
  140. if(MGE_WITH_TEST)
  141. include(cmake/gtest.cmake)
  142. endif()
  143. option(MGE_WITH_DISTRIBUTED "Build with distributed support" ON)
  144. if(NOT MGE_WITH_CUDA)
  145. message("-- Disable distributed support, as CUDA is not enabled.")
  146. set(MGE_WITH_DISTRIBUTED OFF)
  147. endif()
  148. option(MGE_INFERENCE_ONLY "Build inference only library." OFF)
  149. option(MGE_WITH_PYTHON_MODULE "Build MegEngine Python Module." ON)
  150. if(MGE_INFERENCE_ONLY)
  151. message("-- Disable distributed support for inference only build.")
  152. set(MGE_WITH_DISTRIBUTED OFF)
  153. message("-- Disable python module for inference only build.")
  154. set(MGE_WITH_PYTHON_MODULE OFF)
  155. message("-- Disable tests for inference only build.")
  156. set(MGE_WITH_TEST OFF)
  157. endif()
  158. if(MGE_WITH_DISTRIBUTED)
  159. include(cmake/protobuf.cmake)
  160. include(cmake/zmq.cmake)
  161. endif()
  162. if(MGB_WITH_FLATBUFFERS)
  163. include(cmake/flatbuffers.cmake)
  164. endif()
  165. if(MSVC)
  166. add_compile_definitions(NOMINMAX=1 _USE_MATH_DEFINES=1 WIN32=1)
  167. else()
  168. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
  169. set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
  170. if(ANDROID)
  171. set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -DNDEBUG")
  172. else()
  173. set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
  174. endif()
  175. endif()
  176. if(MGE_WITH_CUDA)
  177. include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
  178. foreach(path ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  179. get_filename_component(_NAME ${path} NAME)
  180. if(NOT ${_NAME} STREQUAL "stubs")
  181. list(APPEND CUDA_LINK_DIRECTORIES ${path})
  182. endif()
  183. endforeach()
  184. link_directories(${CUDA_LINK_DIRECTORIES})
  185. set(CMAKE_CUDA_FLAGS_DEBUG "-O0 -g")
  186. set(CMAKE_CUDA_FLAGS_RELEASE "-O3")
  187. set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-O3 -g")
  188. set(CMAKE_CUDA_FLAGS_MINSIZEREL "-Os")
  189. set(CMAKE_CUDA_FLAGS "-Xcompiler -Wall,-Wextra -Xfatbin -compress-all")
  190. if(NOT MGE_ENABLE_RTTI)
  191. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-rtti")
  192. endif()
  193. if(NOT MGE_ENABLE_EXCEPTIONS)
  194. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-exception")
  195. endif()
  196. if(NOT MGE_CUDA_GENCODE)
  197. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  198. set(MEGDNN_THREADS_512 0)
  199. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0")
  200. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  201. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  202. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  203. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  204. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  205. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=compute_75")
  206. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "9.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "9.0.0")
  207. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  208. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  209. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  210. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  211. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=compute_70")
  212. else()
  213. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_35,code=sm_35")
  214. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  215. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  216. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  217. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=compute_61")
  218. endif()
  219. else()
  220. message(FATAL_ERROR "Unsupported CUDA host arch.")
  221. endif()
  222. else()
  223. set(MEGDNN_THREADS_512 1)
  224. endif()
  225. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} ${MGE_CUDA_GENCODE}")
  226. include(cmake/cudnn.cmake)
  227. if(MGE_WITH_TRT)
  228. include(cmake/tensorrt.cmake)
  229. endif()
  230. if(MGE_CUDA_USE_STATIC)
  231. if(MGE_WITH_TRT)
  232. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libnvinfer libcudnn -Wl,--no-whole-archive)
  233. else()
  234. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libcudnn -Wl,--no-whole-archive)
  235. endif()
  236. list(APPEND MGE_CUDA_LIBS cusolver_static cublas_static curand_static culibos cudart_static cusparse_static)
  237. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  238. list(APPEND MGE_CUDA_LIBS cublasLt_static)
  239. endif()
  240. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0")
  241. # mark all symbols from liblapack_static.a as weak to avoid
  242. # duplicated definition with mkl
  243. find_library(
  244. LAPACK_STATIC_PATH lapack_static
  245. HINTS ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  246. if(NOT LAPACK_STATIC_PATH)
  247. message(FATAL_ERROR "liblapack_static.a not found")
  248. endif()
  249. set(LAPACK_STATIC_COPY_PATH ${CMAKE_CURRENT_BINARY_DIR}/liblapack_static_copy.a)
  250. # add a target that run objcopy
  251. add_custom_command(
  252. OUTPUT ${LAPACK_STATIC_COPY_PATH}
  253. COMMAND ${CMAKE_OBJCOPY} -w -W* ${LAPACK_STATIC_PATH} ${LAPACK_STATIC_COPY_PATH}
  254. VERBATIM)
  255. add_custom_target(lapack_static_weak_target DEPENDS ${LAPACK_STATIC_COPY_PATH})
  256. # create a library named "lapack_static_weak"
  257. add_library(lapack_static_weak STATIC IMPORTED GLOBAL)
  258. add_dependencies(lapack_static_weak lapack_static_weak_target)
  259. set_target_properties(
  260. lapack_static_weak PROPERTIES
  261. IMPORTED_LOCATION ${LAPACK_STATIC_COPY_PATH})
  262. list(APPEND MGE_CUDA_LIBS lapack_static_weak ${LAPACK_STATIC_COPY_PATH})
  263. endif()
  264. else()
  265. if(MGE_WITH_TRT)
  266. list(APPEND MGE_CUDA_LIBS libnvinfer)
  267. endif()
  268. list(APPEND MGE_CUDA_LIBS libcudnn)
  269. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  270. list(APPEND MGE_CUDA_LIBS cublasLt cusolver cublas curand)
  271. endif()
  272. endif()
  273. add_subdirectory(dnn/cuda-stub)
  274. list(APPEND MGE_CUDA_LIBS nvrtc cuda-stub nvToolsExt)
  275. set(MGE_CUDA_LIBS "${MGE_CUDA_LIBS}")
  276. endif()
  277. find_program(CCACHE_BIN ccache)
  278. if(CCACHE_BIN)
  279. set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BIN})
  280. if(MGE_WITH_CUDA AND NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
  281. message("-- Using ccache as CMAKE_CUDA_COMPILER_LAUNCHER")
  282. set(CMAKE_CUDA_COMPILER_LAUNCHER ${CCACHE_BIN})
  283. endif()
  284. endif()
  285. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  286. if(${MGE_BLAS} STREQUAL "MKL")
  287. include(cmake/mkl.cmake)
  288. set(MGE_BLAS_LIBS libmkl)
  289. elseif(${MGE_BLAS} STREQUAL "OpenBLAS")
  290. include(cmake/OpenBLAS.cmake)
  291. set(MGE_BLAS_LIBS libopenblas)
  292. else()
  293. message(FATAL_ERROR "Unknown BLAS implementation ${MGE_BLAS}")
  294. endif()
  295. endif()
  296. option(MGE_WITH_MKLDNN "Enable Intel MKL_DNN support," ON)
  297. # MKLDNN build
  298. if(MGE_WITH_MKLDNN AND ${MGE_ARCH} STREQUAL "x86_64")
  299. include(cmake/MKL_DNN.cmake)
  300. set(MEGDNN_X86_WITH_MKL_DNN 1)
  301. endif()
  302. # RTTI
  303. if(MGE_ENABLE_RTTI)
  304. set(MEGDNN_ENABLE_MANGLING 0)
  305. set(MEGDNN_ENABLE_RTTI 1)
  306. else()
  307. set(MEGDNN_ENABLE_MANGLING 1)
  308. set(MEGDNN_ENABLE_RTTI 0)
  309. endif()
  310. set(MGB_VERBOSE_TYPEINFO_NAME ${MGE_ENABLE_RTTI})
  311. # Logging
  312. set(MGB_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  313. set(MEGDNN_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  314. set(MGB_ENABLE_JSON ${MGE_ENABLE_LOGGING})
  315. # Exception
  316. if(NOT MGE_ENABLE_EXCEPTIONS)
  317. message(STATUS "Exceptions disabled; MegEngine would kill itself when it is supposed to throw an exception.")
  318. endif()
  319. set(MGB_ENABLE_EXCEPTION ${MGE_ENABLE_EXCEPTIONS})
  320. set(MEGDNN_ENABLE_EXCEPTIONS ${MGE_ENABLE_EXCEPTIONS})
  321. # JIT
  322. if(MGE_WITH_JIT AND MGE_WITH_HALIDE)
  323. set(HALIDE_SHARED_LIBRARY OFF CACHE BOOL "Build as a shared library")
  324. include(cmake/Halide.cmake)
  325. endif()
  326. set(MGB_JIT ${MGE_WITH_JIT})
  327. set(MGB_JIT_HALIDE ${MGE_WITH_HALIDE})
  328. # Thread
  329. if(CMAKE_THREAD_LIBS_INIT)
  330. set(MGB_HAVE_THREAD 1)
  331. endif()
  332. if(MGE_WITH_TEST)
  333. # use intra-op multi threads
  334. set(MEGDNN_ENABLE_MULTI_THREADS 1)
  335. endif()
  336. # CUDA
  337. set(MGB_CUDA ${MGE_WITH_CUDA})
  338. set(MEGDNN_WITH_CUDA ${MGE_WITH_CUDA})
  339. # Debug info
  340. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  341. set(MGB_ASSERT_LOC 1)
  342. set(MGB_ENABLE_DEBUG_UTIL 1)
  343. else()
  344. set(MGB_ASSERT_LOC 0)
  345. set(MGB_ENABLE_DEBUG_UTIL 0)
  346. endif()
  347. # TensorRT
  348. set(MGB_ENABLE_TENSOR_RT ${MGE_WITH_TRT})
  349. # Inference only
  350. if(MGE_INFERENCE_ONLY)
  351. set(MGB_ENABLE_GRAD 0)
  352. set(MGB_BUILD_SLIM_SERVING 1)
  353. else()
  354. set(MGB_ENABLE_GRAD 1)
  355. set(MGB_BUILD_SLIM_SERVING 0)
  356. endif()
  357. # Distributed communication
  358. set(MGB_ENABLE_OPR_MM ${MGE_WITH_DISTRIBUTED})
  359. # MGE_ARCH related flags
  360. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  361. if(MGE_BLAS STREQUAL "MKL")
  362. set(MEGDNN_X86_WITH_MKL 1)
  363. elseif(MGE_BLAS STREQUAL "OpenBLAS")
  364. set(MEGDNN_X86_WITH_OPENBLAS 1)
  365. endif()
  366. endif()
  367. # Enable Naive
  368. if(MGE_ARCH STREQUAL "naive")
  369. set(MEGDNN_NAIVE 1)
  370. message(WARNING "MEGDNN_NAIVE is enabled; MegDNN performance is degraded.")
  371. endif()
  372. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  373. set(MEGDNN_X86 1)
  374. if(MGE_ARCH STREQUAL "x86_64")
  375. set(MEGDNN_X86_64 1)
  376. set(MEGDNN_64_BIT 1)
  377. if(NOT MSVC)
  378. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
  379. endif()
  380. else()
  381. set(MEGDNN_X86_32 1)
  382. if(NOT MSVC)
  383. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
  384. endif()
  385. endif()
  386. if(NOT MSVC)
  387. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mfpmath=sse")
  388. endif()
  389. endif()
  390. if(MGE_ARCH STREQUAL "armv7")
  391. # -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.
  392. if(ANDROID)
  393. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon")
  394. endif()
  395. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funsafe-math-optimizations")
  396. set (MARCH "-march=armv7-a")
  397. set (MEGDNN_ARMV7 1)
  398. endif()
  399. if(MGE_ARCH STREQUAL "aarch64")
  400. set(MEGDNN_AARCH64 1)
  401. set(MEGDNN_64_BIT 1)
  402. set(MARCH "-march=armv8-a")
  403. if(MGE_ARMV8_2_FEATURE_FP16)
  404. message("Enable fp16 feature support in armv8.2")
  405. if(NOT ${MGE_DISABLE_FLOAT16})
  406. set(MEGDNN_ENABLE_FP16_NEON 1)
  407. endif()
  408. set(MARCH "-march=armv8.2-a+fp16")
  409. endif()
  410. if(MGE_ARMV8_2_FEATURE_DOTPROD)
  411. message("Enable dotprod feature support in armv8.2")
  412. if(MGE_ARMV8_2_FEATURE_FP16)
  413. set(MARCH "-march=armv8.2-a+fp16+dotprod")
  414. else()
  415. set(MARCH "-march=armv8.2-a+dotprod")
  416. endif()
  417. endif()
  418. endif()
  419. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MARCH}")
  420. # Write out megbrain_build_config.h
  421. # It defines macros needed by both megbrain and dnn
  422. configure_file(src/megbrain_build_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h)
  423. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h DESTINATION include)
  424. add_subdirectory(dnn)
  425. list(APPEND MGB_OPR_PARAM_DEFS_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py)
  426. set(MGB_OPR_PARAM_DEFS_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/dnn/scripts/gen_param_defs.py)
  427. set(MGB_OPR_PARAM_DEFS_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/opr/include/)
  428. file(MAKE_DIRECTORY ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr)
  429. add_custom_command(
  430. OUTPUT
  431. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  432. COMMAND ${PYTHON_EXECUTABLE} ${MGB_OPR_PARAM_DEFS_SCRIPT} ${MGB_OPR_PARAM_DEFS_SRCS}
  433. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  434. DEPENDS ${MGB_OPR_PARAM_DEFS_SRCS} ${MGB_OPR_PARAM_DEFS_SCRIPT}
  435. VERBATIM
  436. )
  437. list(APPEND MGB_OPR_PARAM_DEFS_OUTS
  438. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  439. )
  440. install(FILES ${MGB_OPR_PARAM_DEFS_OUTS} DESTINATION include/megbrain/opr/)
  441. list(APPEND MGB_OPR_PARAM_DEFS_INC ${MGB_OPR_PARAM_DEFS_OUT_DIR})
  442. add_custom_target(_mgb_opr_param_defs DEPENDS ${MGB_OPR_PARAM_DEFS_OUTS})
  443. add_library(mgb_opr_param_defs INTERFACE)
  444. target_include_directories(mgb_opr_param_defs INTERFACE ${MGB_OPR_PARAM_DEFS_INC})
  445. add_dependencies(mgb_opr_param_defs _mgb_opr_param_defs)
  446. if(MGE_WITH_DISTRIBUTED)
  447. add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/MegRay)
  448. endif()
  449. add_subdirectory(src)
  450. add_subdirectory(sdk/load-and-run)
  451. if(MGE_WITH_PYTHON_MODULE)
  452. add_subdirectory(python_module)
  453. endif()
  454. if(MGE_WITH_TEST AND MGE_ENABLE_RTTI)
  455. add_subdirectory(test)
  456. endif()
  457. if(TARGET _mgb)
  458. add_custom_target(
  459. develop
  460. COMMAND ${CMAKE_COMMAND} -E create_symlink
  461. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/$<TARGET_FILE_NAME:_mgb>
  462. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/$<TARGET_FILE_NAME:_mgb>
  463. COMMAND ${CMAKE_COMMAND} -E create_symlink
  464. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/mgb.py
  465. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/mgb.py
  466. COMMAND ${CMAKE_COMMAND} -E create_symlink
  467. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/opr.py
  468. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/opr.py
  469. COMMAND ${CMAKE_COMMAND} -E create_symlink
  470. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/opr_param_defs.py
  471. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/opr_param_defs.py
  472. COMMAND ${CMAKE_COMMAND} -E create_symlink
  473. ${CMAKE_CURRENT_BINARY_DIR}/python_module/megengine/_internal/include
  474. ${CMAKE_CURRENT_SOURCE_DIR}/python_module/megengine/_internal/include
  475. DEPENDS _mgb
  476. VERBATIM
  477. )
  478. endif()
  479. IF(APPLE)
  480. set(CMAKE_THREAD_LIBS_INIT "-lpthread")
  481. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  482. set(CMAKE_USE_WIN32_THREADS_INIT 0)
  483. set(CMAKE_USE_PTHREADS_INIT 1)
  484. set(THREADS_PREFER_PTHREAD_FLAG ON)
  485. ENDIF()

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