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.

ge_utils.cmake 15 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. include(FetchContent)
  2. set(FETCHCONTENT_QUIET OFF)
  3. function(graphengine_add_submodule_obj des_submodule_objs sub_dir submodule_name_obj)
  4. add_subdirectory(${sub_dir})
  5. if(NOT TARGET ${submodule_name_obj})
  6. message(FATAL_ERROR "Can not find submodule '${submodule_name_obj}'. in ${CMAKE_CURRENT_LIST_FILE}")
  7. endif()
  8. if("$<TARGET_OBJECTS:${submodule_name_obj}>" IN_LIST ${des_submodule_objs})
  9. message(FATAL_ERROR "submodule '${submodule_name_obj}' added more than once. in ${CMAKE_CURRENT_LIST_FILE}")
  10. endif()
  11. set(${des_submodule_objs} ${${des_submodule_objs}} $<TARGET_OBJECTS:${submodule_name_obj}> PARENT_SCOPE)
  12. endfunction()
  13. if (DEFINED ENV{MSLIBS_CACHE_PATH})
  14. set(_MS_LIB_CACHE $ENV{MSLIBS_CACHE_PATH})
  15. else()
  16. set(_MS_LIB_CACHE ${CMAKE_BINARY_DIR}/.mslib)
  17. endif ()
  18. message("MS LIBS CACHE PATH: ${_MS_LIB_CACHE}")
  19. if (NOT EXISTS ${_MS_LIB_CACHE})
  20. file(MAKE_DIRECTORY ${_MS_LIB_CACHE})
  21. endif ()
  22. if (DEFINED ENV{MSLIBS_SERVER})
  23. set(LOCAL_LIBS_SERVER $ENV{MSLIBS_SERVER})
  24. message("LOCAL_LIBS_SERVER: ${LOCAL_LIBS_SERVER}")
  25. endif ()
  26. include(ProcessorCount)
  27. ProcessorCount(N)
  28. if (JOBS)
  29. set(THNUM ${JOBS})
  30. else()
  31. set(JOBS 8)
  32. if (${JOBS} GREATER ${N})
  33. set(THNUM ${N})
  34. endif()
  35. endif ()
  36. message("set make thread num: ${THNUM}")
  37. if(LOCAL_LIBS_SERVER)
  38. if (NOT ENV{no_proxy})
  39. set(ENV{no_proxy} "${LOCAL_LIBS_SERVER}")
  40. else()
  41. string(FIND $ENV{no_proxy} ${LOCAL_LIBS_SERVER} IP_POS)
  42. if (${IP_POS} EQUAL -1)
  43. set(ENV{no_proxy} "$ENV{no_proxy},${LOCAL_LIBS_SERVER}")
  44. endif ()
  45. endif ()
  46. endif()
  47. function(__download_pkg pkg_name pkg_url pkg_md5)
  48. if(LOCAL_LIBS_SERVER)
  49. get_filename_component(_URL_FILE_NAME ${pkg_url} NAME)
  50. set(pkg_url "http://${LOCAL_LIBS_SERVER}:8081/libs/${pkg_name}/${_URL_FILE_NAME}" ${pkg_url})
  51. endif()
  52. FetchContent_Declare(
  53. ${pkg_name}
  54. URL ${pkg_url}
  55. URL_HASH MD5=${pkg_md5}
  56. )
  57. FetchContent_GetProperties(${pkg_name})
  58. message("download: ${${pkg_name}_SOURCE_DIR} , ${pkg_name} , ${pkg_url}")
  59. if(NOT ${pkg_name}_POPULATED)
  60. FetchContent_Populate(${pkg_name})
  61. set(${pkg_name}_SOURCE_DIR ${${pkg_name}_SOURCE_DIR} PARENT_SCOPE)
  62. endif()
  63. endfunction()
  64. function(__download_pkg_with_git pkg_name pkg_url pkg_git_commit pkg_md5)
  65. if(LOCAL_LIBS_SERVER)
  66. set(pkg_url "http://${LOCAL_LIBS_SERVER}:8081/libs/${pkg_name}/${pkg_git_commit}")
  67. FetchContent_Declare(
  68. ${pkg_name}
  69. URL ${pkg_url}
  70. URL_HASH MD5=${pkg_md5}
  71. )
  72. else()
  73. FetchContent_Declare(
  74. ${pkg_name}
  75. GIT_REPOSITORY ${pkg_url}
  76. GIT_TAG ${pkg_git_commit})
  77. endif()
  78. FetchContent_GetProperties(${pkg_name})
  79. message("download: ${${pkg_name}_SOURCE_DIR} , ${pkg_name} , ${pkg_url}")
  80. if(NOT ${pkg_name}_POPULATED)
  81. FetchContent_Populate(${pkg_name})
  82. set(${pkg_name}_SOURCE_DIR ${${pkg_name}_SOURCE_DIR} PARENT_SCOPE)
  83. endif()
  84. endfunction()
  85. function(__find_pkg_then_add_target pkg_name pkg_exe)
  86. unset(${pkg_name}_LIBS)
  87. message("_FIND:${${pkg_name}_BASE_DIR}")
  88. if(pkg_exe)
  89. find_program(${pkg_exe}_EXE ${pkg_exe} PATHS ${${pkg_name}_BASE_DIR}/bin NO_DEFAULT_PATH)
  90. if(NOT ${pkg_exe}_EXE)
  91. return()
  92. endif()
  93. if (NOT TARGET ${pkg_name}::${pkg_exe})
  94. add_executable(${pkg_name}::${pkg_exe} IMPORTED GLOBAL)
  95. endif ()
  96. set_target_properties(${pkg_name}::${pkg_exe} PROPERTIES
  97. IMPORTED_LOCATION ${${pkg_exe}_EXE}
  98. )
  99. message("found ${${pkg_exe}_EXE}")
  100. endif()
  101. foreach(_LIB_NAME ${ARGN})
  102. set(_LIB_SEARCH_NAME ${_LIB_NAME})
  103. set(_LIB_TYPE SHARED)
  104. if (${pkg_name}_USE_STATIC_LIBS)
  105. set(_LIB_SEARCH_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}${_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
  106. set(_LIB_TYPE STATIC)
  107. endif ()
  108. set(${_LIB_NAME}_LIB ${_LIB_NAME}_LIB-NOTFOUND)
  109. find_library(${_LIB_NAME}_LIB ${_LIB_SEARCH_NAME} PATHS ${${pkg_name}_BASE_DIR}/lib NO_DEFAULT_PATH)
  110. if(NOT ${_LIB_NAME}_LIB)
  111. return()
  112. endif()
  113. add_library(${pkg_name}::${_LIB_NAME} ${_LIB_TYPE} IMPORTED GLOBAL)
  114. set_target_properties(${pkg_name}::${_LIB_NAME} PROPERTIES
  115. INTERFACE_INCLUDE_DIRECTORIES "${${pkg_name}_BASE_DIR}/include"
  116. IMPORTED_LOCATION ${${_LIB_NAME}_LIB}
  117. )
  118. list(APPEND ${pkg_name}_LIBS ${pkg_name}::${_LIB_NAME})
  119. message("found ${${_LIB_NAME}_LIB}")
  120. STRING( REGEX REPLACE "(.+)/(.+)" "\\1" LIBPATH ${${_LIB_NAME}_LIB})
  121. set(${pkg_name}_LIBPATH ${LIBPATH} CACHE STRING INTERNAL)
  122. endforeach(_LIB_NAME)
  123. set(${pkg_name}_LIBS ${${pkg_name}_LIBS} PARENT_SCOPE)
  124. endfunction()
  125. function(__exec_cmd)
  126. set(options )
  127. set(oneValueArgs WORKING_DIRECTORY)
  128. set(multiValueArgs COMMAND)
  129. cmake_parse_arguments(EXEC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
  130. execute_process(COMMAND ${EXEC_COMMAND}
  131. WORKING_DIRECTORY ${EXEC_WORKING_DIRECTORY}
  132. RESULT_VARIABLE RESULT)
  133. if(NOT RESULT EQUAL "0")
  134. message(FATAL_ERROR "error! when ${EXEC_COMMAND} in ${EXEC_WORKING_DIRECTORY}")
  135. endif()
  136. endfunction()
  137. function(__check_patches pkg_patches)
  138. # check patches
  139. if (PKG_PATCHES)
  140. file(TOUCH ${_MS_LIB_CACHE}/${pkg_name}_patch.md5)
  141. file(READ ${_MS_LIB_CACHE}/${pkg_name}_patch.md5 ${pkg_name}_PATCHES_MD5)
  142. message("patches md5:${${pkg_name}_PATCHES_MD5}")
  143. set(${pkg_name}_PATCHES_NEW_MD5 )
  144. foreach(_PATCH ${PKG_PATCHES})
  145. file(MD5 ${_PATCH} _PF_MD5)
  146. set(${pkg_name}_PATCHES_NEW_MD5 "${${pkg_name}_PATCHES_NEW_MD5},${_PF_MD5}")
  147. endforeach(_PATCH)
  148. if (NOT ${pkg_name}_PATCHES_MD5 STREQUAL ${pkg_name}_PATCHES_NEW_MD5)
  149. set(${pkg_name}_PATCHES ${PKG_PATCHES})
  150. file(REMOVE_RECURSE "${_MS_LIB_CACHE}/${pkg_name}-subbuild")
  151. file(WRITE ${_MS_LIB_CACHE}/${pkg_name}_patch.md5 ${${pkg_name}_PATCHES_NEW_MD5})
  152. message("patches changed : ${${pkg_name}_PATCHES_NEW_MD5}")
  153. endif ()
  154. endif ()
  155. endfunction()
  156. set(GE_FIND_NO_DEFAULT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH
  157. NO_CMAKE_BUILDS_PATH NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_SYSTEM_PATH
  158. NO_CMAKE_SYSTEM_PACKAGE_REGISTRY)
  159. set(GE_FIND_NO_DEFAULT_PATH ${GE_FIND_NO_DEFAULT_PATH} PARENT_SCOPE)
  160. function(graphengine_add_pkg pkg_name )
  161. set(options )
  162. set(oneValueArgs URL MD5 GIT_REPOSITORY GIT_TAG VER EXE DIR HEAD_ONLY CMAKE_PATH)
  163. set(multiValueArgs CMAKE_OPTION LIBS PRE_CONFIGURE_COMMAND CONFIGURE_COMMAND BUILD_OPTION INSTALL_INCS INSTALL_LIBS PATCHES)
  164. cmake_parse_arguments(PKG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
  165. if (NOT PKG_CMAKE_PATH)
  166. set(PKG_CMAKE_PATH ..)
  167. endif ()
  168. set(__FIND_PKG_NAME ${pkg_name})
  169. string(TOLOWER ${pkg_name} pkg_name)
  170. message("pkg name:${__FIND_PKG_NAME},${pkg_name}")
  171. set(${pkg_name}_PATCHES_HASH )
  172. foreach(_PATCH ${PKG_PATCHES})
  173. file(MD5 ${_PATCH} _PF_MD5)
  174. set(${pkg_name}_PATCHES_HASH "${${pkg_name}_PATCHES_HASH},${_PF_MD5}")
  175. endforeach(_PATCH)
  176. # check options
  177. set(${pkg_name}_CONFIG_TXT
  178. "${CMAKE_CXX_COMPILER_VERSION}-${CMAKE_C_COMPILER_VERSION}
  179. ${ARGN} - ${${pkg_name}_USE_STATIC_LIBS}- ${${pkg_name}_PATCHES_HASH}
  180. ${${pkg_name}_CXXFLAGS}--${${pkg_name}_CFLAGS}--${${pkg_name}_LDFLAGS}")
  181. string(REPLACE ";" "-" ${pkg_name}_CONFIG_TXT ${${pkg_name}_CONFIG_TXT})
  182. string(MD5 ${pkg_name}_CONFIG_HASH ${${pkg_name}_CONFIG_TXT})
  183. message("${pkg_name} config hash: ${${pkg_name}_CONFIG_HASH}")
  184. set(${pkg_name}_BASE_DIR ${_MS_LIB_CACHE}/${pkg_name}_${${pkg_name}_CONFIG_HASH})
  185. set(${pkg_name}_DIRPATH ${${pkg_name}_BASE_DIR} CACHE STRING INTERNAL)
  186. if(EXISTS ${${pkg_name}_BASE_DIR}/options.txt AND PKG_HEAD_ONLY)
  187. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/${PKG_HEAD_ONLY} PARENT_SCOPE)
  188. add_library(${pkg_name} INTERFACE)
  189. target_include_directories(${pkg_name} INTERFACE ${${pkg_name}_INC})
  190. return()
  191. endif ()
  192. if(NOT PKG_EXE)
  193. set(PKG_EXE 0)
  194. endif()
  195. set(${__FIND_PKG_NAME}_ROOT ${${pkg_name}_BASE_DIR})
  196. set(${__FIND_PKG_NAME}_ROOT ${${pkg_name}_BASE_DIR} PARENT_SCOPE)
  197. if (PKG_LIBS)
  198. __find_pkg_then_add_target(${pkg_name} ${PKG_EXE} ${PKG_LIBS})
  199. if(${pkg_name}_LIBS)
  200. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  201. message("Found libs: ${${pkg_name}_LIBS}")
  202. return()
  203. endif()
  204. elseif(NOT PKG_HEAD_ONLY)
  205. find_package(${__FIND_PKG_NAME} ${PKG_VER} ${GE_FIND_NO_DEFAULT_PATH})
  206. if (${__FIND_PKG_NAME}_FOUND)
  207. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  208. message("Found pkg: ${__FIND_PKG_NAME}")
  209. return()
  210. endif ()
  211. endif ()
  212. if (NOT PKG_DIR)
  213. if (PKG_GIT_REPOSITORY)
  214. __download_pkg_with_git(${pkg_name} ${PKG_GIT_REPOSITORY} ${PKG_GIT_TAG} ${PKG_MD5})
  215. else()
  216. __download_pkg(${pkg_name} ${PKG_URL} ${PKG_MD5})
  217. endif()
  218. else()
  219. set(${pkg_name}_SOURCE_DIR ${PKG_DIR})
  220. endif ()
  221. file(WRITE ${${pkg_name}_BASE_DIR}/options.txt ${${pkg_name}_CONFIG_TXT})
  222. message("${pkg_name}_SOURCE_DIR : ${${pkg_name}_SOURCE_DIR}")
  223. foreach(_PATCH_FILE ${PKG_PATCHES})
  224. message("patching ${${pkg_name}_SOURCE_DIR} -p1 < ${_PATCH_FILE}")
  225. execute_process(COMMAND patch -p1 INPUT_FILE ${_PATCH_FILE}
  226. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR}
  227. RESULT_VARIABLE Result)
  228. if(NOT Result EQUAL "0")
  229. message(FATAL_ERROR "Failed patch: ${_PATCH_FILE}")
  230. endif()
  231. endforeach(_PATCH_FILE)
  232. file(LOCK ${${pkg_name}_BASE_DIR} DIRECTORY GUARD FUNCTION RESULT_VARIABLE ${pkg_name}_LOCK_RET TIMEOUT 600)
  233. if(NOT ${pkg_name}_LOCK_RET EQUAL "0")
  234. message(FATAL_ERROR "error! when try lock ${${pkg_name}_BASE_DIR} : ${${pkg_name}_LOCK_RET}")
  235. endif()
  236. if(${pkg_name}_SOURCE_DIR)
  237. if (PKG_HEAD_ONLY)
  238. file(GLOB ${pkg_name}_SOURCE_SUBDIRS ${${pkg_name}_SOURCE_DIR}/*)
  239. file(COPY ${${pkg_name}_SOURCE_SUBDIRS} DESTINATION ${${pkg_name}_BASE_DIR})
  240. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/${PKG_HEAD_ONLY} PARENT_SCOPE)
  241. add_library(${pkg_name} INTERFACE)
  242. target_include_directories(${pkg_name} INTERFACE ${${pkg_name}_INC})
  243. elseif (PKG_CMAKE_OPTION)
  244. # in cmake
  245. file(MAKE_DIRECTORY ${${pkg_name}_SOURCE_DIR}/_build)
  246. if (${pkg_name}_CFLAGS)
  247. set(${pkg_name}_CMAKE_CFLAGS "-DCMAKE_C_FLAGS=${${pkg_name}_CFLAGS}")
  248. endif ()
  249. if (${pkg_name}_CXXFLAGS)
  250. set(${pkg_name}_CMAKE_CXXFLAGS "-DCMAKE_CXX_FLAGS=${${pkg_name}_CXXFLAGS}")
  251. endif ()
  252. if (${pkg_name}_LDFLAGS)
  253. if (${pkg_name}_USE_STATIC_LIBS)
  254. #set(${pkg_name}_CMAKE_LDFLAGS "-DCMAKE_STATIC_LINKER_FLAGS=${${pkg_name}_LDFLAGS}")
  255. else()
  256. set(${pkg_name}_CMAKE_LDFLAGS "-DCMAKE_SHARED_LINKER_FLAGS=${${pkg_name}_LDFLAGS}")
  257. endif ()
  258. endif ()
  259. __exec_cmd(COMMAND ${CMAKE_COMMAND} ${PKG_CMAKE_OPTION} -G ${CMAKE_GENERATOR}
  260. ${${pkg_name}_CMAKE_CFLAGS} ${${pkg_name}_CMAKE_CXXFLAGS} ${${pkg_name}_CMAKE_LDFLAGS}
  261. -DCMAKE_INSTALL_PREFIX=${${pkg_name}_BASE_DIR} ${PKG_CMAKE_PATH}
  262. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR}/_build)
  263. __exec_cmd(COMMAND ${CMAKE_COMMAND} --build . --target install -- -j${THNUM}
  264. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR}/_build)
  265. else()
  266. if (${pkg_name}_CFLAGS)
  267. set(${pkg_name}_MAKE_CFLAGS "CFLAGS=${${pkg_name}_CFLAGS}")
  268. endif ()
  269. if (${pkg_name}_CXXFLAGS)
  270. set(${pkg_name}_MAKE_CXXFLAGS "CXXFLAGS=${${pkg_name}_CXXFLAGS}")
  271. endif ()
  272. if (${pkg_name}_LDFLAGS)
  273. set(${pkg_name}_MAKE_LDFLAGS "LDFLAGS=${${pkg_name}_LDFLAGS}")
  274. endif ()
  275. # in configure && make
  276. if (PKG_PRE_CONFIGURE_COMMAND)
  277. __exec_cmd(COMMAND ${PKG_PRE_CONFIGURE_COMMAND}
  278. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  279. endif ()
  280. if (PKG_CONFIGURE_COMMAND)
  281. __exec_cmd(COMMAND ${PKG_CONFIGURE_COMMAND}
  282. ${${pkg_name}_MAKE_CFLAGS} ${${pkg_name}_MAKE_CXXFLAGS} ${${pkg_name}_MAKE_LDFLAGS}
  283. --prefix=${${pkg_name}_BASE_DIR}
  284. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  285. endif ()
  286. set(${pkg_name}_BUILD_OPTION ${PKG_BUILD_OPTION})
  287. if (NOT PKG_CONFIGURE_COMMAND)
  288. set(${pkg_name}_BUILD_OPTION ${${pkg_name}_BUILD_OPTION}
  289. ${${pkg_name}_MAKE_CFLAGS} ${${pkg_name}_MAKE_CXXFLAGS} ${${pkg_name}_MAKE_LDFLAGS})
  290. endif ()
  291. # build
  292. __exec_cmd(COMMAND ${CMAKE_MAKE_PROGRAM} ${${pkg_name}_BUILD_OPTION} -j${THNUM}
  293. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  294. if (PKG_INSTALL_INCS OR PKG_INSTALL_LIBS)
  295. file(GLOB ${pkg_name}_INSTALL_INCS ${${pkg_name}_SOURCE_DIR}/${PKG_INSTALL_INCS})
  296. file(GLOB ${pkg_name}_INSTALL_LIBS ${${pkg_name}_SOURCE_DIR}/${PKG_INSTALL_LIBS})
  297. file(COPY ${${pkg_name}_INSTALL_INCS} DESTINATION ${${pkg_name}_BASE_DIR}/include)
  298. file(COPY ${${pkg_name}_INSTALL_LIBS} DESTINATION ${${pkg_name}_BASE_DIR}/lib)
  299. else()
  300. __exec_cmd(COMMAND ${CMAKE_MAKE_PROGRAM} install WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  301. endif ()
  302. endif ()
  303. endif()
  304. if (PKG_LIBS)
  305. __find_pkg_then_add_target(${pkg_name} ${PKG_EXE} ${PKG_LIBS})
  306. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  307. if(NOT ${pkg_name}_LIBS)
  308. message(FATAL_ERROR "Can not find pkg: ${pkg_name}")
  309. endif()
  310. else()
  311. find_package(${__FIND_PKG_NAME} ${PKG_VER} QUIET)
  312. if (${__FIND_PKG_NAME}_FOUND)
  313. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  314. message("Found pkg: ${${__FIND_PKG_NAME}_LIBRARIES}")
  315. return()
  316. endif ()
  317. endif ()
  318. endfunction()

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示