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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. cmake_minimum_required(VERSION 3.15.2)
  2. include (cmake/FetchMegBrainVersion.cmake)
  3. project(MegEngine LANGUAGES C CXX VERSION ${MGB_VER_STRING})
  4. set(CMAKE_CXX_STANDARD 14)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_CXX_EXTENSIONS OFF)
  7. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  8. set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
  9. set(CMAKE_POLICY_DEFAULT_CMP0048 NEW)
  10. if(NOT MSVC AND NOT APPLE AND NOT WIN32)
  11. set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Dqc <TARGET> <LINK_FLAGS> <OBJECTS>")
  12. set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> Dq <TARGET> <LINK_FLAGS> <OBJECTS>")
  13. set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
  14. endif()
  15. include(GNUInstallDirs)
  16. include(CheckCXXCompilerFlag)
  17. CHECK_CXX_COMPILER_FLAG(-Wclass-memaccess CXX_SUPPORT_WCLASS_MEMACCESS)
  18. set(MGE_ARCH AUTO CACHE STRING "Architecture on which MegEngine to be built.")
  19. set_property(CACHE MGE_ARCH PROPERTY STRINGS AUTO
  20. x86_64 i386
  21. armv7 aarch64
  22. naive fallback
  23. )
  24. set (MGE_EXPORT_TARGETS MegEngine-targets)
  25. option(MGE_WITH_JIT "Build MegEngine with JIT." ON)
  26. option(MGE_WITH_HALIDE "Build MegEngine with Halide JIT" ON)
  27. option(MGE_WITH_MIDOUT_PROFILE "Build MegEngine with Midout profile." OFF)
  28. 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)
  29. option(MGE_ARMV8_2_FEATURE_FP16 "Enable armv8.2-a+fp16 support" OFF)
  30. option(MGE_ARMV8_2_FEATURE_DOTPROD "enable armv8.2-a+dotprod support" OFF)
  31. option(MGE_DISABLE_FLOAT16 "Disable MegEngine float16 support." OFF)
  32. option(MGE_WITH_CUDA "Enable MegEngine CUDA support." ON)
  33. option(MGE_CUDA_USE_STATIC "Enable MegEngine CUDA static linking." ON)
  34. option(MGE_WITH_TRT "Build MegEngine with TensorRT." ON)
  35. option(MGE_USE_SYSTEM_LIB "Build MegEngine with system libraries." OFF)
  36. option(MGB_WITH_FLATBUFFERS "Build MegBrain with FlatBuffers serialization support." ON)
  37. option(MGE_WITH_CAMBRICON "Build MegEngine with Cambricon support" OFF)
  38. option(BUILD_SHARED_LIBS "Build shared libraries" ON)
  39. option(MGE_WITH_ATLAS "Build MegEngine with Atlas support" OFF)
  40. option(MGE_ENABLE_RTTI "Build with RTTI" ON)
  41. option(MGE_ENABLE_LOGGING "Build with logging" ON)
  42. option(MGE_DEBUG_UTIL "Enable debug utility" ON)
  43. option(MGE_ENABLE_EXCEPTIONS "Build with exceptions" ON)
  44. option(MGE_WITH_TEST "Enable test for MegEngine." OFF)
  45. option(MGE_WITH_DISTRIBUTED "Build with distributed support" ON)
  46. option(MGE_BUILD_IMPERATIVE_RT "Build _imperative_rt Python Module " ON)
  47. option(MGE_BUILD_SDK "Build load_and_run" ON)
  48. option(MGE_INFERENCE_ONLY "Build inference only library." OFF)
  49. option(MGE_WITH_MKLDNN "Enable Intel MKL_DNN support," ON)
  50. option(MGE_WITH_ROCM "Enable ROCM support" OFF)
  51. if(NOT ${MGE_BIN_REDUCE} STREQUAL "")
  52. message("build with BIN REDUCE")
  53. if(MGE_WITH_MINIMUM_SIZE)
  54. set(MGE_ENABLE_RTTI OFF)
  55. set(MGE_ENABLE_LOGGING OFF)
  56. set(MGE_ENABLE_EXCEPTIONS OFF)
  57. set(MGE_INFERENCE_ONLY ON)
  58. endif()
  59. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include ${MGE_BIN_REDUCE}")
  60. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -include ${MGE_BIN_REDUCE}")
  61. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto=full")
  62. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flto=full")
  63. endif()
  64. if(MGE_WITH_MIDOUT_PROFILE)
  65. message("build with MIDOUT PROFILE")
  66. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMIDOUT_PROFILING")
  67. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMIDOUT_PROFILING")
  68. endif()
  69. if (APPLE)
  70. set (BUILD_SHARED_LIBS OFF)
  71. message("build static for xcode framework require")
  72. endif()
  73. if (MGE_USE_SYSTEM_LIB)
  74. set (MGE_CUDA_USE_STATIC OFF)
  75. endif()
  76. if (MGB_WITH_FLATBUFFERS)
  77. set(MGB_ENABLE_FBS_SERIALIZATION ON)
  78. endif()
  79. if(CMAKE_TOOLCHAIN_FILE)
  80. message("We are cross compiling.")
  81. message("config FLATBUFFERS_FLATC_EXECUTABLE to: ${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  82. set(FLATBUFFERS_FLATC_EXECUTABLE "${PROJECT_SOURCE_DIR}/build_dir/host_flatc/install/bin/flatc")
  83. if(ANDROID_TOOLCHAIN_ROOT)
  84. if(NOT "${ANDROID_ARCH_NAME}" STREQUAL "")
  85. set(ANDROID_ARCH ${ANDROID_ARCH_NAME})
  86. endif()
  87. if(${ANDROID_ARCH} STREQUAL "arm")
  88. set(MGE_ARCH "armv7")
  89. elseif(${ANDROID_ARCH} STREQUAL "arm64")
  90. set(MGE_ARCH "aarch64")
  91. else()
  92. message(FATAL_ERROR "DO NOT SUPPORT ANDROID ARCH NOW")
  93. endif()
  94. elseif(IOS_TOOLCHAIN_ROOT)
  95. if(${IOS_ARCH} STREQUAL "armv7")
  96. set(MGE_ARCH "armv7")
  97. elseif(${IOS_ARCH} STREQUAL "arm64")
  98. set(MGE_ARCH "aarch64")
  99. elseif(${IOS_ARCH} STREQUAL "armv7k")
  100. set(MGE_ARCH "armv7")
  101. elseif(${IOS_ARCH} STREQUAL "arm64e")
  102. set(MGE_ARCH "aarch64")
  103. elseif(${IOS_ARCH} STREQUAL "armv7s")
  104. set(MGE_ARCH "armv7")
  105. else()
  106. message(FATAL_ERROR "Unsupported IOS_ARCH.")
  107. endif()
  108. elseif(RISCV_TOOLCHAIN_ROOT)
  109. set(MGE_ARCH "riscv64")
  110. elseif(NOT "${ARM_CROSS_BUILD_ARCH}" STREQUAL "")
  111. set(MGE_ARCH ${ARM_CROSS_BUILD_ARCH})
  112. else()
  113. message(FATAL_ERROR "Unknown cross-compiling settings.")
  114. endif()
  115. message("CONFIG MGE_ARCH TO ${MGE_ARCH}")
  116. endif()
  117. if(${MGE_ARCH} STREQUAL "AUTO")
  118. if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
  119. set(MGE_ARCH "x86_64")
  120. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
  121. set(MGE_ARCH "i386")
  122. elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
  123. set(MGE_ARCH "aarch64")
  124. elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm")
  125. set(MGE_ARCH "armv7")
  126. else()
  127. message(FATAL "Unknown machine architecture for MegEngine.")
  128. endif()
  129. endif()
  130. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386" OR ${MGE_ARCH} STREQUAL "armv7" OR ${MGE_ARCH} STREQUAL "aarch64")
  131. option(MGE_ENABLE_CPUINFO "Build cpuinfo library for check runtime." ON)
  132. if(MGE_ENABLE_CPUINFO)
  133. message("-- Enable cpuinfo runtime check and little kernel optimize.")
  134. add_definitions(-DMGB_ENABLE_CPUINFO_CHECK)
  135. include(cmake/cpuinfo.cmake)
  136. endif()
  137. endif()
  138. if(MSVC OR WIN32)
  139. add_compile_definitions(NOMINMAX=1 _USE_MATH_DEFINES=1 WIN32=1)
  140. message("-- into windows build...")
  141. message("-- CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}")
  142. if (${CMAKE_C_COMPILER_ID} STREQUAL "Clang-cl")
  143. message(FATAL_ERROR "only support clang-cl for windows build, pls check detail: scripts/cmake-build/BUILD_README.md")
  144. endif()
  145. # add flags for enable sse instruction optimize for X86, enable avx header to compile avx code
  146. set(WIN_FLAGS "-msse4.2 -O2 -D_AVX_ -D_AVX2_ -D__AVX__ -D__AVX2__ -D__FMA__")
  147. # if u CPU is cascadelake series, u can enable for performance
  148. # set(WIN_FLAGS "{WIN_FLAGS} -march=cascadelake -mtune=cascadelake")
  149. # set(WIN_FLAGS "{WIN_FLAGS} -mavx512cd -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi -mavx512vnni")
  150. # for windows build
  151. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=implicit-int-conversion -Wno-error=double-promotion")
  152. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=zero-as-null-pointer-constant -Wno-error=implicit-int-conversion")
  153. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=float-conversion -Wno-error=shadow-field -Wno-error=covered-switch-default")
  154. set(WIN_FLAGS "${WIN_FLAGS} -Wno-error=deprecated -Wno-error=documentation -Wno-error=unreachable-code-break")
  155. set(WIN_FLAGS "${WIN_FLAGS} /DWIN32 -Wno-macro-redefined /D_WIN32_WINNT=0x0601 /wd4819")
  156. set(WIN_FLAGS "${WIN_FLAGS} /D_CRT_SECURE_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /DNOGDI /D_USE_MATH_DEFINES /bigobj")
  157. set(WIN_FLAGS "${WIN_FLAGS} /Zm500 /EHs /wd4351 /wd4291 /wd4250 /wd4996 /wd4819 -Wno-inconsistent-dllimport")
  158. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WIN_FLAGS}")
  159. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WIN_FLAGS}")
  160. #FIXME: fix halide JIT on windows
  161. message("-- disable jit and halide on windows host build...")
  162. set(MGE_WITH_HALIDE OFF)
  163. set(MGE_WITH_JIT OFF)
  164. #FIXME: fix MegRay on windows
  165. message("-- Disable distributed build on windows host build...")
  166. set(MGE_WITH_DISTRIBUTED OFF)
  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. set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Ofast -DNDEBUG -g")
  173. else()
  174. set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
  175. set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -DNDEBUG -g")
  176. endif()
  177. endif()
  178. CHECK_CXX_COMPILER_FLAG(-fuse-ld=gold CXX_SUPPORT_GOLD)
  179. if(CXX_SUPPORT_GOLD AND NOT ANDROID AND NOT APPLE AND NOT MSVC AND NOT WIN32)
  180. message("-- Using GNU gold linker.")
  181. set(MGE_COMMON_LINKER_FLAGS "-fuse-ld=gold")
  182. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MGE_COMMON_LINKER_FLAGS}")
  183. set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MGE_COMMON_LINKER_FLAGS}")
  184. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MGE_COMMON_LINKER_FLAGS}")
  185. endif()
  186. if(NOT MGE_WITH_JIT)
  187. if(MGE_WITH_HALIDE)
  188. message(WARNING "MGE_WITH_HALIDE is set to OFF with MGE_WITH_JIT disabled")
  189. set(MGE_WITH_HALIDE OFF)
  190. endif()
  191. endif()
  192. if(MGE_WITH_CUDA)
  193. include(CheckLanguage)
  194. check_language(CUDA)
  195. if(NOT CMAKE_CUDA_COMPILER)
  196. message(FATAL_ERROR "CUDA compiler not found in PATH")
  197. endif()
  198. enable_language(CUDA)
  199. set(CMAKE_CUDA_STANDARD 14)
  200. set(CMAKE_CUDA_STANDARD_REQUIRED ON)
  201. endif()
  202. if(NOT MGE_WITH_CUDA)
  203. message("-- Disable JIT support, as CUDA is not enabled.")
  204. set(MGE_WITH_JIT OFF)
  205. set(MGE_WITH_HALIDE OFF)
  206. message("-- Disable TensorRT support, as CUDA is not enabled.")
  207. set(MGE_WITH_TRT OFF)
  208. endif()
  209. find_package(PythonInterp 3 REQUIRED)
  210. set(THREADS_PREFER_PTHREAD_FLAG ON)
  211. find_package(Threads)
  212. if(NOT "${CMAKE_THREAD_LIBS_INIT}" STREQUAL "")
  213. if(${CMAKE_THREAD_LIBS_INIT} STREQUAL "-pthread" AND MGE_WITH_CUDA)
  214. set_property(TARGET Threads::Threads
  215. PROPERTY INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-pthread>"
  216. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-pthread>")
  217. endif()
  218. endif()
  219. set(MGE_BLAS MKL CACHE STRING "BLAS implementaion used by MegEngine.")
  220. set_property(CACHE MGE_BLAS PROPERTY STRINGS MKL OpenBLAS)
  221. set(MGE_CUDA_GENCODE "" CACHE STRING "Overwrite -gencode specifications for CUDA")
  222. if(NOT CMAKE_CUDA_HOST_COMPILER)
  223. set(CMAKE_CUDA_HOST_COMPILER $(CMAKE_CXX_COMPILER))
  224. endif()
  225. if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
  226. message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
  227. set(CMAKE_BUILD_TYPE RelWithDebInfo)
  228. endif()
  229. if(NOT MGE_ENABLE_RTTI)
  230. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
  231. endif()
  232. if(NOT MGE_ENABLE_EXCEPTIONS)
  233. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
  234. endif()
  235. if(MGE_WITH_TEST)
  236. include(cmake/gtest.cmake)
  237. endif()
  238. if(MGE_BUILD_IMPERATIVE_RT)
  239. add_compile_definitions(MGB_ENABLE_IMPERATIVE_RUNTIME)
  240. set(CMAKE_CXX_STANDARD 17)
  241. endif()
  242. if(NOT MGE_WITH_CUDA)
  243. message("-- Disable distributed support, as CUDA is not enabled.")
  244. set(MGE_WITH_DISTRIBUTED OFF)
  245. endif()
  246. if(MGE_INFERENCE_ONLY)
  247. message("-- Disable distributed support for inference only build.")
  248. set(MGE_WITH_DISTRIBUTED OFF)
  249. message("-- Disable imperative_rt python module for inference only build.")
  250. set(MGE_BUILD_IMPERATIVE_RT OFF)
  251. endif()
  252. if(MGE_WITH_DISTRIBUTED)
  253. include(cmake/protobuf.cmake)
  254. include(cmake/zmq.cmake)
  255. endif()
  256. if(MGB_WITH_FLATBUFFERS)
  257. include(cmake/flatbuffers.cmake)
  258. endif()
  259. if(MGE_WITH_CUDA)
  260. include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
  261. foreach(path ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  262. get_filename_component(_NAME ${path} NAME)
  263. if(NOT ${_NAME} STREQUAL "stubs")
  264. list(APPEND CUDA_LINK_DIRECTORIES ${path})
  265. endif()
  266. endforeach()
  267. link_directories(${CUDA_LINK_DIRECTORIES})
  268. set(CMAKE_CUDA_FLAGS_DEBUG "-O0 -g")
  269. set(CMAKE_CUDA_FLAGS_RELEASE "-O3")
  270. set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-O3 -g")
  271. set(CMAKE_CUDA_FLAGS_MINSIZEREL "-Os")
  272. if(MSVC OR WIN32)
  273. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xfatbin -compress-all")
  274. set(CCBIN_FLAG "${CCBIN_FLAG} /wd4819 /wd4334 /wd4267 /wd4002 /wd4244 /wd4068")
  275. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  276. set(CCBIN_FLAG "${CCBIN_FLAG} -D_ITERATOR_DEBUG_LEVEL=2 -MTd")
  277. endif()
  278. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --compiler-options \" ${CCBIN_FLAG} \" ")
  279. else()
  280. set(CMAKE_CUDA_FLAGS "-Xcompiler -Wall,-Wextra -Xfatbin -compress-all")
  281. endif()
  282. if(NOT MGE_ENABLE_RTTI)
  283. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-rtti")
  284. endif()
  285. if(NOT MGE_ENABLE_EXCEPTIONS)
  286. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler -fno-exceptions")
  287. endif()
  288. if(NOT MGE_CUDA_GENCODE)
  289. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  290. set(MEGDNN_THREADS_512 0)
  291. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.0.0")
  292. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  293. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  294. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  295. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  296. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=sm_75")
  297. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_75,code=compute_75")
  298. elseif(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "9.0.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "9.0.0")
  299. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  300. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  301. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  302. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=sm_70")
  303. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_70,code=compute_70")
  304. else()
  305. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_35,code=sm_35")
  306. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_52,code=sm_52")
  307. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_60,code=sm_60")
  308. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=sm_61")
  309. set(MGE_CUDA_GENCODE "${MGE_CUDA_GENCODE} -gencode arch=compute_61,code=compute_61")
  310. endif()
  311. else()
  312. message(FATAL_ERROR "Unsupported CUDA host arch.")
  313. endif()
  314. else()
  315. set(MEGDNN_THREADS_512 1)
  316. endif()
  317. set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} ${MGE_CUDA_GENCODE}")
  318. include(cmake/cudnn.cmake)
  319. if(MGE_WITH_TRT)
  320. include(cmake/tensorrt.cmake)
  321. endif()
  322. if(MGE_CUDA_USE_STATIC)
  323. if(MGE_WITH_TRT)
  324. if(MSVC OR WIN32)
  325. list(APPEND MGE_CUDA_LIBS ${TRT_LIBRARY} ${CUDNN_LIBRARY})
  326. message("-- windows TRT_LIBRARY: ${TRT_LIBRARY}")
  327. message("-- windows CUDNN_LIBRARY: ${CUDNN_LIBRARY}")
  328. else()
  329. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libnvinfer libcudnn -Wl,--no-whole-archive)
  330. endif()
  331. else()
  332. list(APPEND MGE_CUDA_LIBS -Wl,--whole-archive libcudnn -Wl,--no-whole-archive)
  333. endif()
  334. if(MSVC OR WIN32)
  335. list(APPEND MGE_CUDA_LIBS cusolver.lib cublas.lib curand.lib cudart_static.lib cusparse.lib)
  336. else()
  337. list(APPEND MGE_CUDA_LIBS cusolver_static cublas_static curand_static culibos cudart_static cusparse_static)
  338. endif()
  339. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  340. if(MSVC OR WIN32)
  341. list(APPEND MGE_CUDA_LIBS cublasLt.lib)
  342. else()
  343. list(APPEND MGE_CUDA_LIBS cublasLt_static)
  344. endif()
  345. endif()
  346. 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)
  347. # mark all symbols from liblapack_static.a as weak to avoid
  348. # duplicated definition with mkl
  349. find_library(
  350. LAPACK_STATIC_PATH lapack_static
  351. HINTS ${CMAKE_CUDA_HOST_IMPLICIT_LINK_DIRECTORIES})
  352. if(NOT LAPACK_STATIC_PATH)
  353. message(FATAL_ERROR "liblapack_static.a not found")
  354. endif()
  355. set(LAPACK_STATIC_COPY_PATH ${CMAKE_CURRENT_BINARY_DIR}/liblapack_static_copy.a)
  356. # add a target that run objcopy
  357. add_custom_command(
  358. OUTPUT ${LAPACK_STATIC_COPY_PATH}
  359. COMMAND ${CMAKE_OBJCOPY} -w -W* ${LAPACK_STATIC_PATH} ${LAPACK_STATIC_COPY_PATH}
  360. VERBATIM)
  361. add_custom_target(lapack_static_weak_target DEPENDS ${LAPACK_STATIC_COPY_PATH})
  362. # create a library named "lapack_static_weak"
  363. add_library(lapack_static_weak STATIC IMPORTED GLOBAL)
  364. add_dependencies(lapack_static_weak lapack_static_weak_target)
  365. set_target_properties(
  366. lapack_static_weak PROPERTIES
  367. IMPORTED_LOCATION ${LAPACK_STATIC_COPY_PATH})
  368. list(APPEND MGE_CUDA_LIBS lapack_static_weak ${LAPACK_STATIC_COPY_PATH})
  369. endif()
  370. else()
  371. if(MGE_WITH_TRT)
  372. list(APPEND MGE_CUDA_LIBS libnvinfer)
  373. endif()
  374. list(APPEND MGE_CUDA_LIBS libcudnn)
  375. if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER "10.1.0" OR ${CMAKE_CUDA_COMPILER_VERSION} VERSION_EQUAL "10.1.0")
  376. list(APPEND MGE_CUDA_LIBS cublasLt cusolver cublas curand)
  377. endif()
  378. endif()
  379. add_subdirectory(dnn/cuda-stub)
  380. if(MSVC OR WIN32)
  381. list(APPEND MGE_CUDA_LIBS nvrtc.lib cuda-stub)
  382. else()
  383. list(APPEND MGE_CUDA_LIBS nvrtc cuda-stub nvToolsExt)
  384. endif()
  385. set(MGE_CUDA_LIBS "${MGE_CUDA_LIBS}")
  386. endif()
  387. if(MGE_WITH_CAMBRICON)
  388. include_directories("$ENV{NEUWARE_HOME}/include")
  389. link_directories("$ENV{NEUWARE_HOME}/lib64")
  390. include(cmake/FindBANG/FindBANG.cmake)
  391. if (${MGE_MLU_ARCH} STREQUAL "MLU100")
  392. set(BANG_ARCH "100")
  393. elseif (${MGE_MLU_ARCH} STREQUAL "MLU1h8")
  394. set(BANG_ARCH "110")
  395. elseif (${MGE_MLU_ARCH} STREQUAL "MLU220")
  396. set(BANG_ARCH "220")
  397. elseif (${MGE_MLU_ARCH} STREQUAL "MLU270")
  398. set(BANG_ARCH "270")
  399. elseif (${MGE_MLU_ARCH} STREQUAL "MLU290")
  400. set(BANG_ARCH "290")
  401. elseif (${MGE_MLU_ARCH} STREQUAL "MLU200")
  402. set(BANG_ARCH "200")
  403. else()
  404. message (FATAL_ERROR "Unsupported MLU arch.")
  405. endif()
  406. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} --bang-mlu-arch=${MGE_MLU_ARCH}")
  407. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -std=c++11 -Werror")
  408. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__BANG_ARCH__=${BANG_ARCH}")
  409. if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
  410. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -g -O0")
  411. elseif (${CMAKE_BUILD_TYPE} STREQUAL "Release")
  412. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -O3")
  413. elseif (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  414. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -g -O3")
  415. elseif (${CMAKE_BUILD_TYPE} STREQUAL "MinSizeRel")
  416. set(BANG_CNCC_FLAGS "${BANG_CNCC_FLAGS} -Os")
  417. endif()
  418. include(cmake/cnrt.cmake)
  419. include(cmake/cndev.cmake)
  420. include(cmake/cnml.cmake)
  421. list(APPEND MGE_CAMBRICON_LIBS libcnrt libcndev libcnml)
  422. set(MGE_CAMBRICON_LIBS "${MGE_CAMBRICON_LIBS}")
  423. endif()
  424. if (MGE_WITH_ROCM)
  425. include(cmake/rocm.cmake)
  426. endif ()
  427. if(MGE_WITH_ATLAS)
  428. include(cmake/aclrt.cmake)
  429. list(APPEND MGE_ATLAS_LIBS libascendcl)
  430. set(MGE_ATLAS_LIBS "${MGE_ATLAS_LIBS}")
  431. set(MGB_ATLAS ${MGE_WITH_ATLAS})
  432. endif()
  433. find_program(CCACHE_BIN ccache)
  434. if(CCACHE_BIN)
  435. set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BIN})
  436. if(MGE_WITH_CUDA AND NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
  437. message("-- Using ccache as CMAKE_CUDA_COMPILER_LAUNCHER")
  438. set(CMAKE_CUDA_COMPILER_LAUNCHER ${CCACHE_BIN})
  439. endif()
  440. endif()
  441. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  442. if(${MGE_BLAS} STREQUAL "MKL")
  443. include(cmake/mkl.cmake)
  444. set(MGE_BLAS_LIBS libmkl)
  445. elseif(${MGE_BLAS} STREQUAL "OpenBLAS")
  446. include(cmake/OpenBLAS.cmake)
  447. set(MGE_BLAS_LIBS libopenblas)
  448. else()
  449. message(FATAL_ERROR "Unknown BLAS implementation ${MGE_BLAS}")
  450. endif()
  451. endif()
  452. # MKLDNN build
  453. if(MGE_WITH_MKLDNN AND ${MGE_ARCH} STREQUAL "x86_64")
  454. include(cmake/MKL_DNN.cmake)
  455. set(MEGDNN_X86_WITH_MKL_DNN 1)
  456. endif()
  457. # RTTI
  458. if(MGE_ENABLE_RTTI)
  459. set(MEGDNN_ENABLE_MANGLING 0)
  460. set(MEGDNN_ENABLE_RTTI 1)
  461. else()
  462. set(MEGDNN_ENABLE_MANGLING 1)
  463. set(MEGDNN_ENABLE_RTTI 0)
  464. endif()
  465. set(MGB_VERBOSE_TYPEINFO_NAME ${MGE_ENABLE_RTTI})
  466. # Logging
  467. set(MGB_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  468. set(MEGDNN_ENABLE_LOGGING ${MGE_ENABLE_LOGGING})
  469. set(MGB_ENABLE_JSON ${MGE_ENABLE_LOGGING})
  470. # Exception
  471. if(NOT MGE_ENABLE_EXCEPTIONS)
  472. message(STATUS "Exceptions disabled; MegEngine would kill itself when it is supposed to throw an exception.")
  473. endif()
  474. set(MGB_ENABLE_EXCEPTION ${MGE_ENABLE_EXCEPTIONS})
  475. set(MEGDNN_ENABLE_EXCEPTIONS ${MGE_ENABLE_EXCEPTIONS})
  476. # JIT
  477. if(MGE_WITH_JIT AND MGE_WITH_HALIDE)
  478. set(HALIDE_SHARED_LIBRARY OFF CACHE BOOL "Build as a shared library")
  479. include(cmake/Halide.cmake)
  480. endif()
  481. set(MGB_JIT ${MGE_WITH_JIT})
  482. set(MGB_JIT_HALIDE ${MGE_WITH_HALIDE})
  483. # Thread
  484. IF(APPLE)
  485. set(CMAKE_THREAD_LIBS_INIT "-lpthread")
  486. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  487. set(CMAKE_USE_WIN32_THREADS_INIT 0)
  488. set(CMAKE_USE_PTHREADS_INIT 1)
  489. set(THREADS_PREFER_PTHREAD_FLAG ON)
  490. ENDIF()
  491. if(MSVC OR WIN32)
  492. set(CMAKE_HAVE_THREADS_LIBRARY 1)
  493. set(CMAKE_USE_WIN32_THREADS_INIT 1)
  494. set(CMAKE_USE_PTHREADS_INIT 1)
  495. set(THREADS_PREFER_PTHREAD_FLAG ON)
  496. endif()
  497. if(CMAKE_THREAD_LIBS_INIT OR CMAKE_USE_WIN32_THREADS_INIT)
  498. set(MGB_HAVE_THREAD 1)
  499. endif()
  500. if(MGE_WITH_TEST)
  501. # use intra-op multi threads
  502. set(MEGDNN_ENABLE_MULTI_THREADS 1)
  503. endif()
  504. # CUDA
  505. set(MGB_CUDA ${MGE_WITH_CUDA})
  506. set(MEGDNN_WITH_CUDA ${MGE_WITH_CUDA})
  507. #ROCM
  508. set(MGB_ROCM ${MGE_WITH_ROCM})
  509. set(MEGDNN_WITH_ROCM ${MGE_WITH_ROCM})
  510. # CAMBRICON
  511. set(MGB_CAMBRICON ${MGE_WITH_CAMBRICON})
  512. set(MEGDNN_WITH_CAMBRICON ${MGE_WITH_CAMBRICON})
  513. # Debug info
  514. if(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
  515. set(MGB_ASSERT_LOC 1)
  516. set(MGB_ENABLE_DEBUG_UTIL 1)
  517. else()
  518. set(MGB_ASSERT_LOC 0)
  519. set(MGB_ENABLE_DEBUG_UTIL 0)
  520. endif()
  521. # TensorRT
  522. set(MGB_ENABLE_TENSOR_RT ${MGE_WITH_TRT})
  523. # Inference only
  524. if(MGE_INFERENCE_ONLY AND NOT MGE_WITH_TEST)
  525. set(MGB_ENABLE_GRAD 0)
  526. set(MGB_BUILD_SLIM_SERVING 1)
  527. else()
  528. set(MGB_ENABLE_GRAD 1)
  529. set(MGB_BUILD_SLIM_SERVING 0)
  530. endif()
  531. # Distributed communication
  532. set(MGB_ENABLE_OPR_MM ${MGE_WITH_DISTRIBUTED})
  533. # MGE_ARCH related flags
  534. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  535. if(MGE_BLAS STREQUAL "MKL")
  536. set(MEGDNN_X86_WITH_MKL 1)
  537. elseif(MGE_BLAS STREQUAL "OpenBLAS")
  538. set(MEGDNN_X86_WITH_OPENBLAS 1)
  539. endif()
  540. endif()
  541. # Enable Naive
  542. if(MGE_ARCH STREQUAL "naive")
  543. set(MEGDNN_NAIVE 1)
  544. message(WARNING "MEGDNN_NAIVE is enabled; MegDNN performance is degraded.")
  545. endif()
  546. if(MGE_ARCH STREQUAL "x86_64" OR MGE_ARCH STREQUAL "i386")
  547. set(MEGDNN_X86 1)
  548. if(MGE_ARCH STREQUAL "x86_64")
  549. set(MEGDNN_X86_64 1)
  550. set(MEGDNN_64_BIT 1)
  551. if(NOT MSVC)
  552. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
  553. endif()
  554. else()
  555. set(MEGDNN_X86_32 1)
  556. if(NOT MSVC)
  557. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
  558. endif()
  559. endif()
  560. if(NOT MSVC)
  561. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mfpmath=sse")
  562. endif()
  563. endif()
  564. if(MGE_ARCH STREQUAL "armv7")
  565. # -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.
  566. if(ANDROID)
  567. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon")
  568. endif()
  569. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funsafe-math-optimizations")
  570. set (MARCH "-march=armv7-a")
  571. set (MEGDNN_ARMV7 1)
  572. endif()
  573. if(MGE_ARCH STREQUAL "aarch64")
  574. set(MEGDNN_AARCH64 1)
  575. set(MEGDNN_64_BIT 1)
  576. set(MARCH "-march=armv8-a")
  577. if(MGE_ARMV8_2_FEATURE_FP16)
  578. message("Enable fp16 feature support in armv8.2")
  579. if(NOT ${MGE_DISABLE_FLOAT16})
  580. set(MEGDNN_ENABLE_FP16_NEON 1)
  581. endif()
  582. set(MARCH "-march=armv8.2-a+fp16")
  583. endif()
  584. if(MGE_ARMV8_2_FEATURE_DOTPROD)
  585. message("Enable dotprod feature support in armv8.2")
  586. if(MGE_ARMV8_2_FEATURE_FP16)
  587. set(MARCH "-march=armv8.2-a+fp16+dotprod")
  588. else()
  589. set(MARCH "-march=armv8.2-a+dotprod")
  590. endif()
  591. endif()
  592. endif()
  593. if(MGE_ARCH STREQUAL "riscv64")
  594. set(MEGDNN_RISCV64 1)
  595. set(MEGDNN_64_BIT 1)
  596. endif()
  597. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MARCH}")
  598. set(MGB_ENABLE_IMPERATIVE ${MGE_BUILD_IMPERATIVE_RT})
  599. # Write out megbrain_build_config.h
  600. # It defines macros needed by both megbrain and dnn
  601. configure_file(src/megbrain_build_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h)
  602. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/genfiles/megbrain_build_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  603. add_subdirectory(dnn)
  604. list(APPEND MGB_OPR_PARAM_DEFS_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py)
  605. set(MGB_OPR_PARAM_DEFS_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/dnn/scripts/gen_param_defs.py)
  606. set(MGB_OPR_PARAM_DEFS_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/opr/include/)
  607. file(MAKE_DIRECTORY ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr)
  608. add_custom_command(
  609. OUTPUT
  610. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  611. COMMAND ${PYTHON_EXECUTABLE} ${MGB_OPR_PARAM_DEFS_SCRIPT} ${MGB_OPR_PARAM_DEFS_SRCS}
  612. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  613. DEPENDS ${MGB_OPR_PARAM_DEFS_SRCS} ${MGB_OPR_PARAM_DEFS_SCRIPT}
  614. VERBATIM
  615. )
  616. list(APPEND MGB_OPR_PARAM_DEFS_OUTS
  617. ${MGB_OPR_PARAM_DEFS_OUT_DIR}/megbrain/opr/param_defs.h
  618. )
  619. install(FILES ${MGB_OPR_PARAM_DEFS_OUTS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/megbrain/opr/)
  620. list(APPEND MGB_OPR_PARAM_DEFS_INC ${MGB_OPR_PARAM_DEFS_OUT_DIR})
  621. add_custom_target(_mgb_opr_param_defs DEPENDS ${MGB_OPR_PARAM_DEFS_OUTS})
  622. add_library(mgb_opr_param_defs INTERFACE)
  623. target_include_directories(mgb_opr_param_defs
  624. INTERFACE
  625. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  626. $<BUILD_INTERFACE:${MGB_OPR_PARAM_DEFS_INC}>
  627. )
  628. add_dependencies(mgb_opr_param_defs _mgb_opr_param_defs)
  629. install(TARGETS mgb_opr_param_defs EXPORT ${MGE_EXPORT_TARGETS})
  630. if(MGE_WITH_DISTRIBUTED)
  631. add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/MegRay)
  632. endif()
  633. add_subdirectory(src)
  634. if(MGE_BUILD_SDK)
  635. add_subdirectory(sdk/load-and-run)
  636. endif()
  637. if(MGE_BUILD_IMPERATIVE_RT)
  638. add_subdirectory(imperative)
  639. message("-- Enable imperative python wrapper runtime")
  640. endif()
  641. if(MGE_WITH_TEST AND MGE_ENABLE_RTTI)
  642. add_subdirectory(test)
  643. endif()
  644. if(TARGET _imperative_rt)
  645. add_custom_target(
  646. develop
  647. COMMAND ${CMAKE_COMMAND} -E create_symlink
  648. ${CMAKE_CURRENT_BINARY_DIR}/imperative/python/${PACKAGE_NAME}/core/$<TARGET_FILE_NAME:${MODULE_NAME}>
  649. ${CMAKE_CURRENT_SOURCE_DIR}/imperative/python/${PACKAGE_NAME}/core/$<TARGET_FILE_NAME:${MODULE_NAME}>
  650. COMMAND ${CMAKE_COMMAND} -E create_symlink
  651. ${CMAKE_CURRENT_BINARY_DIR}/imperative/python/${PACKAGE_NAME}/core/ops/_internal/generated_ops.py
  652. ${CMAKE_CURRENT_SOURCE_DIR}/imperative/python/${PACKAGE_NAME}/core/ops/_internal/generated_ops.py
  653. COMMAND ${CMAKE_COMMAND} -E create_symlink
  654. ${CMAKE_CURRENT_BINARY_DIR}/imperative/python/${PACKAGE_NAME}/core/ops/_internal/param_defs.py
  655. ${CMAKE_CURRENT_SOURCE_DIR}/imperative/python/${PACKAGE_NAME}/core/ops/_internal/param_defs.py
  656. DEPENDS _imperative_rt
  657. VERBATIM
  658. )
  659. endif()
  660. # Configure and install pkg-config.
  661. # Note that unlike the Config.cmake modules, this is not relocatable (and not
  662. # really portable) because we have two dependencies without pkg-config
  663. # descriptions: FlatBuffers and MKL-DNN
  664. if (MGE_USE_SYSTEM_MKLDNN)
  665. set (MGE_PKGCONFIG_LIBS_PRIVATE "-ldnnl")
  666. endif()
  667. if (MGE_USE_SYSTEM_OPENBLAS)
  668. set (MGE_PKGCONFIG_LIBS_PRIVATE "${MGE_PKGCONFIG_LIBS_PRIVATE} -lopenblas")
  669. endif()
  670. configure_file(cmake/megengine.pc.in
  671. ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  672. @ONLY)
  673. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/megengine.pc
  674. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  675. # Do not export targets if MGE_WITH_DISTRIBUTED is on. MegRay is not ready.
  676. if (NOT MGE_WITH_DISTRIBUTED)
  677. include(CMakePackageConfigHelpers)
  678. set (MGE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/MegEngine)
  679. configure_package_config_file(cmake/MegEngineConfig.cmake.in
  680. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  681. INSTALL_DESTINATION ${MGE_INSTALL_CMAKEDIR}
  682. )
  683. write_basic_package_version_file(
  684. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  685. VERSION ${MGB_VER_MAJOR}.${MGB_VER_MINOR}.${MGB_VER_PATCH}
  686. COMPATIBILITY SameMajorVersion)
  687. install(EXPORT ${MGE_EXPORT_TARGETS} DESTINATION ${MGE_INSTALL_CMAKEDIR})
  688. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfig.cmake
  689. ${CMAKE_CURRENT_BINARY_DIR}/MegEngineConfigVersion.cmake
  690. DESTINATION ${MGE_INSTALL_CMAKEDIR})
  691. endif()
  692. if(MSVC OR WIN32)
  693. add_compile_options(
  694. $<$<CONFIG:>:/MT>
  695. $<$<CONFIG:Debug>:/MTd>
  696. $<$<CONFIG:Release>:/MT>
  697. )
  698. foreach (CompilerFlag
  699. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  700. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
  701. CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
  702. CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
  703. if(${CompilerFlag} MATCHES "/MD")
  704. string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
  705. set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
  706. message("MSVC flags: ${CompilerFlag}:${${CompilerFlag}}")
  707. endif()
  708. endforeach()
  709. endif()

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