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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. if(MGE_WITH_JIT_MLIR)
  2. add_subdirectory(jit/include/megbrain/jit/mlir/ir)
  3. endif()
  4. file(GLOB_RECURSE SOURCES core/impl/*.cpp gopt/impl/*.cpp opr/impl/*.cpp opr/impl/nvof/*.cpp plugin/impl/*.cpp serialization/impl/*.cpp core/impl/*.inl gopt/impl/*.inl opr/impl/*.inl plugin/impl/*.inl serialization/impl/*.inl)
  5. if(MGE_WITH_JIT)
  6. file(GLOB_RECURSE SOURCES_ jit/impl/*.cpp jit/impl/*.inl)
  7. if(MGE_WITH_JIT_MLIR)
  8. file(GLOB_RECURSE MLIR_SOURCES_ jit/impl/mlir/ir/*.cpp jit/impl/mlir/*.cpp)
  9. list(APPEND SOURCES_ ${MLIR_SOURCES_})
  10. endif()
  11. list(APPEND SOURCES ${SOURCES_})
  12. endif()
  13. if(MGE_WITH_DISTRIBUTED)
  14. file(GLOB_RECURSE SOURCES_ opr-mm/impl/*.cpp opr-mm/impl/*.inl)
  15. list(APPEND SOURCES ${SOURCES_})
  16. file(GLOB_RECURSE PROTO_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "../src/opr-mm/proto/*.proto")
  17. PROTOBUF_GENERATE_CPP_WITH_ROOT(GRPC_SRCS GRPC_HDRS ${CMAKE_CURRENT_SOURCE_DIR} ${PROTO_FILES})
  18. add_custom_target(mgb_proto_target DEPENDS ${GRPC_SRCS} ${GRPC_HDRS} ${PROTOBUF_PROTOC_EXECUTABLE})
  19. list(APPEND SOURCES ${GRPC_SRCS})
  20. endif()
  21. set(MGB_INC ${PROJECT_BINARY_DIR}/genfiles ${CMAKE_CURRENT_LIST_DIR}/core/include ${CMAKE_CURRENT_LIST_DIR}/gopt/include ${CMAKE_CURRENT_LIST_DIR}/opr/include ${CMAKE_CURRENT_LIST_DIR}/plugin/include ${CMAKE_CURRENT_LIST_DIR}/serialization/include)
  22. if(MGE_WITH_JIT)
  23. list(APPEND MGB_INC ${CMAKE_CURRENT_LIST_DIR}/jit/include)
  24. if(MGE_WITH_CUDA)
  25. list(APPEND MGB_INC ${CMAKE_CURRENT_LIST_DIR}/jit/impl/cuda)
  26. endif()
  27. endif()
  28. if(MGE_WITH_DISTRIBUTED)
  29. list(APPEND MGB_INC ${CMAKE_CURRENT_LIST_DIR}/opr-mm/include)
  30. endif()
  31. if(MGE_WITH_CUDA AND MGE_WITH_TRT)
  32. list(APPEND MGB_INC ${CMAKE_CURRENT_LIST_DIR}/tensorrt/include)
  33. file(GLOB_RECURSE SOURCES_ tensorrt/impl/*.cpp tensorrt/impl/*.inl)
  34. list(APPEND SOURCES ${SOURCES_})
  35. endif()
  36. if(MGE_WITH_CAMBRICON)
  37. list(APPEND MGB_INC ${CMAKE_CURRENT_LIST_DIR}/cambricon/include)
  38. file(GLOB_RECURSE SOURCES_ cambricon/impl/*.cpp cambricon/impl/*.inl)
  39. list(APPEND SOURCES ${SOURCES_})
  40. endif()
  41. set(MGB_CAMBRICON ${MGE_WITH_CAMBRICON})
  42. set(MGB_ATLAS ${MGE_WITH_ATLAS})
  43. if(MGE_WITH_CUDA)
  44. file(GLOB_RECURSE SOURCES_ opr/impl/standalone/*.cu)
  45. list(APPEND SOURCES ${SOURCES_})
  46. endif()
  47. if(MGE_WITH_CUSTOM_OP)
  48. list(APPEND MGB_INC ${CMAKE_CURRENT_LIST_DIR}/custom/include)
  49. file(GLOB_RECURSE SOURCES_ custom/impl/*.cpp)
  50. list(APPEND SOURCES ${SOURCES_})
  51. endif()
  52. add_library(megbrain OBJECT ${SOURCES})
  53. target_link_libraries(megbrain PUBLIC mgb_opr_param_defs)
  54. if(MGE_WITH_CUDA)
  55. target_include_directories(megbrain PUBLIC ${TRT_INCLUDE_DIR})
  56. target_include_directories(megbrain PRIVATE ${CUDNN_INCLUDE_DIR})
  57. find_path(NVTX3_INCLUDE
  58. NAMES nvToolsExtCudaRt.h
  59. HINTS $ENV{CUDA_ROOT_DIR} $ENV{CUDA_PATH} $ENV{CUDA_BIN_PATH}
  60. PATH_SUFFIXES include/nvtx3
  61. DOC "NVTX3_INCLUDE" )
  62. if(NVTX3_INCLUDE STREQUAL "NVTX3_INCLUDE-NOTFOUND")
  63. message(FATAL_ERROR "Can not find NVTX3 INCLUDE, please export cuda sdk path to CUDA_ROOT_DIR or CUDA_PATH or CUDA_BIN_PATH")
  64. endif()
  65. target_include_directories(megbrain PRIVATE ${NVTX3_INCLUDE})
  66. endif()
  67. target_include_directories(megbrain
  68. PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  69. PRIVATE ${PROJECT_SOURCE_DIR}/third_party/midout/src
  70. )
  71. foreach (INCPATH IN LISTS MGB_INC)
  72. target_include_directories(megbrain
  73. PUBLIC $<BUILD_INTERFACE:${INCPATH}>
  74. )
  75. endforeach()
  76. if(MGE_WITH_CUDA)
  77. if(NOT WIN32 AND NOT MSVC)
  78. target_compile_options(megbrain PRIVATE "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-unused-parameter>"
  79. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-Wno-unused-parameter>")
  80. endif()
  81. else()
  82. target_compile_options(megbrain PRIVATE "-Wno-unused-parameter")
  83. endif()
  84. if(CXX_SUPPORT_WCLASS_MEMACCESS)
  85. if(MGE_WITH_CUDA)
  86. target_compile_options(megbrain PRIVATE "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-class-memaccess>"
  87. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-Wno-class-memaccess>")
  88. else()
  89. target_compile_options(megbrain PRIVATE "-Wno-class-memaccess")
  90. endif()
  91. endif()
  92. target_link_libraries(megbrain PUBLIC megdnn)
  93. if(MGE_WITH_DISTRIBUTED)
  94. add_dependencies(megbrain mgb_proto_target)
  95. target_link_libraries (megbrain PRIVATE libprotobuf libzmq)
  96. set(CPPZMQ_INC ${PROJECT_SOURCE_DIR}/third_party/cppzmq)
  97. # FIXME: add CMAKE_CURRENT_BINARY_DIR for including mm_handler.pb.h
  98. target_include_directories(megbrain PRIVATE ${CPPZMQ_INC} ${CMAKE_CURRENT_BINARY_DIR})
  99. target_link_libraries (megbrain PRIVATE megray)
  100. endif()
  101. target_link_libraries(megbrain PUBLIC ${MGE_CAMBRICON_LIBS})
  102. target_link_libraries(megbrain PUBLIC ${MGE_ATLAS_LIBS})
  103. if(MGE_WITH_JIT AND MGE_WITH_HALIDE)
  104. target_link_libraries(megbrain PRIVATE libhalide)
  105. target_link_libraries(megbrain PRIVATE ${HALIDE_LLVM_LIBS})
  106. endif()
  107. if(MGE_WITH_JIT_MLIR)
  108. target_include_directories(megbrain PRIVATE ${MLIR_LLVM_INCLUDE_DIR})
  109. target_link_libraries(megbrain PRIVATE ${MLIR_LLVM_LIBS})
  110. add_dependencies(megbrain mgb_dialect)
  111. target_include_directories(megbrain PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/jit/include)
  112. endif()
  113. if (MGB_WITH_FLATBUFFERS)
  114. set (GEN_FLATBUFFERS_SCHEMA_PY ${PROJECT_SOURCE_DIR}/dnn/scripts/gen_flatbuffers_schema.py)
  115. set (OPR_PARAM_DEFS_PY ${PROJECT_SOURCE_DIR}/dnn/scripts/opr_param_defs.py)
  116. set (MGB_PARAM_DEFS_PY ${PROJECT_SOURCE_DIR}/tools/param_defs/mgb_opr_param_defs.py)
  117. file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl)
  118. add_custom_command(
  119. OUTPUT
  120. ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl/opr_param_defs.fbs
  121. COMMAND
  122. ${PYTHON_EXECUTABLE} ${GEN_FLATBUFFERS_SCHEMA_PY} ${OPR_PARAM_DEFS_PY} ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl/opr_param_defs.fbs
  123. DEPENDS ${GEN_FLATBUFFERS_SCHEMA_PY} ${OPR_PARAM_DEFS_PY}
  124. VERBATIM
  125. )
  126. add_custom_command(
  127. OUTPUT
  128. ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl/mgb_opr_param_defs.fbs
  129. COMMAND
  130. ${PYTHON_EXECUTABLE} ${GEN_FLATBUFFERS_SCHEMA_PY} ${MGB_PARAM_DEFS_PY} ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl/mgb_opr_param_defs.fbs
  131. DEPENDS ${GEN_FLATBUFFERS_SCHEMA_PY} ${MGB_PARAM_DEFS_PY}
  132. VERBATIM
  133. )
  134. list(APPEND FLATBUFFERS_SCHEMA_FILES
  135. ${CMAKE_CURRENT_SOURCE_DIR}/serialization/impl/dtype.fbs
  136. ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl/opr_param_defs.fbs
  137. ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl/mgb_opr_param_defs.fbs
  138. ${CMAKE_CURRENT_SOURCE_DIR}/opr/impl/mgb_cpp_opr.fbs
  139. ${CMAKE_CURRENT_SOURCE_DIR}/serialization/impl/schema.fbs
  140. )
  141. list(APPEND FLATBUFFERS_SCHEMA_INCLUDE_DIR
  142. ${CMAKE_CURRENT_SOURCE_DIR}/serialization/impl
  143. ${CMAKE_CURRENT_BINARY_DIR}/serialization/impl
  144. ${CMAKE_CURRENT_SOURCE_DIR}/opr/impl
  145. )
  146. build_flatbuffers(
  147. "${FLATBUFFERS_SCHEMA_FILES}"
  148. "${FLATBUFFERS_SCHEMA_INCLUDE_DIR}"
  149. mgb_serialization_schema_fbs
  150. "${FLATBUFFERS_SCHEMA_FILES}"
  151. "${CMAKE_CURRENT_BINARY_DIR}/serialization/include/megbrain/serialization/internal"
  152. ""
  153. ""
  154. )
  155. add_dependencies(megbrain mgb_serialization_schema_fbs)
  156. target_include_directories(megbrain PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/serialization/include)
  157. target_compile_definitions(megbrain PUBLIC MGB_ENABLE_FBS_SERIALIZATION=1)
  158. target_link_libraries(megbrain PUBLIC flatbuffers)
  159. set (GENERATED_FLATBUFFERS_CONVERTER_PATH ${CMAKE_CURRENT_BINARY_DIR}/genfiles)
  160. set (GEN_FLATBUFFERS_CONVERTER_PY ${PROJECT_SOURCE_DIR}/dnn/scripts/gen_flatbuffers_converter.py)
  161. file (MAKE_DIRECTORY ${GENERATED_FLATBUFFERS_CONVERTER_PATH})
  162. add_custom_command(
  163. OUTPUT
  164. ${GENERATED_FLATBUFFERS_CONVERTER_PATH}/opr_param_defs_converter.inl
  165. COMMAND
  166. ${PYTHON_EXECUTABLE} ${GEN_FLATBUFFERS_CONVERTER_PY} ${OPR_PARAM_DEFS_PY} ${GENERATED_FLATBUFFERS_CONVERTER_PATH}/opr_param_defs_converter.inl
  167. DEPENDS ${GEN_FLATBUFFERS_CONVERTER_PY} ${OPR_PARAM_DEFS_PY}
  168. VERBATIM
  169. )
  170. add_custom_command(
  171. OUTPUT
  172. ${GENERATED_FLATBUFFERS_CONVERTER_PATH}/mgb_opr_param_defs_converter.inl
  173. COMMAND
  174. ${PYTHON_EXECUTABLE} ${GEN_FLATBUFFERS_CONVERTER_PY} ${MGB_PARAM_DEFS_PY} ${GENERATED_FLATBUFFERS_CONVERTER_PATH}/mgb_opr_param_defs_converter.inl
  175. DEPENDS ${GEN_FLATBUFFERS_CONVERTER_PY} ${MGB_PARAM_DEFS_PY}
  176. VERBATIM
  177. )
  178. target_sources(megbrain PRIVATE ${GENERATED_FLATBUFFERS_CONVERTER_PATH}/opr_param_defs_converter.inl)
  179. target_sources(megbrain PRIVATE ${GENERATED_FLATBUFFERS_CONVERTER_PATH}/mgb_opr_param_defs_converter.inl)
  180. target_include_directories(megbrain PRIVATE ${GENERATED_FLATBUFFERS_CONVERTER_PATH})
  181. endif()
  182. if(UNIX AND NOT ANDROID AND NOT APPLE)
  183. target_link_libraries(megbrain PUBLIC dl rt atomic)
  184. endif()
  185. if(ANDROID)
  186. target_link_libraries(megbrain PUBLIC log)
  187. endif()
  188. set (_VER_FILE ${PROJECT_SOURCE_DIR}/src/version.ld)
  189. # Windows does not support implicitly importing data members from DLL.
  190. # on Windows:
  191. # depends on megdnn/megbrain target, refs to sdk/load-and-run/CMakeLists.txt
  192. # depends on megengine lite_share or lite_static
  193. if(NOT WIN32)
  194. message(VERBOSE "create a export SHARED lib for python use")
  195. add_library(megengine_export SHARED)
  196. target_link_libraries(megengine_export PUBLIC megbrain megdnn)
  197. target_link_libraries(megengine_export PRIVATE ${MGE_CUDA_LIBS})
  198. if (MGE_WITH_DISTRIBUTED)
  199. message(VERBOSE "megengine_export configured to link megray")
  200. target_link_libraries(megengine_export PUBLIC megray)
  201. endif()
  202. # Build as SHARED or STATIC depending on BUILD_SHARED_LIBS=ON/OFF
  203. add_library(megengine)
  204. target_link_libraries(megengine PRIVATE ${MGE_CUDA_LIBS})
  205. target_link_libraries(megengine PUBLIC megbrain megdnn)
  206. if (UNIX AND NOT APPLE)
  207. target_link_options(megengine PRIVATE -Wl,--no-undefined -Wl,--version-script=${_VER_FILE})
  208. set_target_properties(megengine PROPERTIES LINK_DEPENDS ${_VER_FILE})
  209. endif()
  210. # Do not export targets if MGE_WITH_DISTRIBUTED is on. MegRay is not ready
  211. # for this.
  212. install(TARGETS megengine
  213. EXPORT ${MGE_EXPORT_TARGETS}
  214. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  215. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
  216. endif()
  217. if (NOT MGE_WITH_DISTRIBUTED)
  218. install(TARGETS megbrain
  219. EXPORT ${MGE_EXPORT_TARGETS}
  220. )
  221. endif()
  222. foreach(_PATH ${MGB_INC})
  223. install(DIRECTORY ${_PATH}/megbrain DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h")
  224. endforeach()

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