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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. set(LIBMEGDNN_DEF)
  2. file(GLOB_RECURSE SOURCES common/*.cpp naive/*.cpp)
  3. # Build configure
  4. list(APPEND SOURCES ${PROJECT_BINARY_DIR}/genfiles/megbrain_build_config.h)
  5. if(NOT ${MGE_ARCH} STREQUAL "naive")
  6. file(GLOB_RECURSE SOURCES_ fallback/*.cpp)
  7. list(APPEND SOURCES ${SOURCES_})
  8. if(${MGE_ARCH} STREQUAL "fallback")
  9. message(WARNING "build only with fallback")
  10. elseif(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386")
  11. file(GLOB_RECURSE SOURCES_ x86/*.cpp)
  12. list(APPEND SOURCES ${SOURCES_})
  13. if(NOT MSVC)
  14. file(GLOB_RECURSE SOURCES_ x86/*.S)
  15. set_source_files_properties(${SOURCES_} PROPERTIES LANGUAGE C)
  16. list(APPEND SOURCES ${SOURCES_})
  17. endif()
  18. elseif(${MGE_ARCH} STREQUAL "armv7")
  19. file(GLOB_RECURSE SOURCES_ armv7/*.cpp)
  20. list(APPEND SOURCES ${SOURCES_})
  21. file(GLOB_RECURSE SOURCES_ arm_common/*.cpp)
  22. list(APPEND SOURCES ${SOURCES_})
  23. file(GLOB_RECURSE SOURCES_ armv7/*.S)
  24. set_source_files_properties(${SOURCES_} PROPERTIES LANGUAGE C)
  25. list(APPEND SOURCES ${SOURCES_})
  26. elseif(${MGE_ARCH} STREQUAL "aarch64")
  27. file(GLOB_RECURSE SOURCES_ aarch64/*.cpp)
  28. list(APPEND SOURCES ${SOURCES_})
  29. file(GLOB_RECURSE SOURCES_ arm_common/*.cpp)
  30. list(APPEND SOURCES ${SOURCES_})
  31. file(GLOB_RECURSE SOURCES_ aarch64/*.S)
  32. set_source_files_properties(${SOURCES_} PROPERTIES LANGUAGE C)
  33. list(APPEND SOURCES ${SOURCES_})
  34. endif()
  35. endif()
  36. if(MGE_WITH_MIDOUT_PROFILE)
  37. list(APPEND SOURCES ${PROJECT_SOURCE_DIR}/third_party/midout/src/midout.cpp)
  38. endif()
  39. ###############################################################################
  40. # HIP_COMPILE
  41. ###############################################################################
  42. macro (HIP_COMPILE _hip_target _hip_objs)
  43. # Separate the sources from the options
  44. HIP_GET_SOURCES_AND_OPTIONS(_sources
  45. _cmake_options
  46. _hipcc_options
  47. _hcc_options
  48. _nvcc_options
  49. ${ARGN})
  50. HIP_PREPARE_TARGET_COMMANDS(${_hip_target}
  51. OBJ _generated_files _source_files ${_sources} ${_cmake_options}
  52. HIPCC_OPTIONS ${_hipcc_options}
  53. HCC_OPTIONS ${_hcc_options}
  54. NVCC_OPTIONS ${_nvcc_options})
  55. if(_source_files)
  56. list(REMOVE_ITEM _sources ${_source_files})
  57. endif()
  58. add_custom_target(${_hip_target})
  59. # set return value
  60. set(${_hip_objs} ${_generated_files})
  61. endmacro()
  62. if (MGE_WITH_ROCM)
  63. file (GLOB_RECURSE SOURCES_ rocm/*.cpp)
  64. list (APPEND SOURCES ${SOURCES_})
  65. # FIXME rocm may lost the first hip file, so currently we just create an
  66. # empty file to bypass this error.
  67. file(GLOB start.cpp.hip "" )
  68. list(APPEND HIP_SOURCES start.cpp.hip)
  69. configure_file(
  70. ${PROJECT_SOURCE_DIR}/dnn/include/hcc_detail/hcc_defs_prologue.h.in
  71. ${PROJECT_BINARY_DIR}/dnn/include/hcc_detail/hcc_defs_prologue.h)
  72. configure_file(
  73. ${PROJECT_SOURCE_DIR}/dnn/include/hcc_detail/hcc_defs_epilogue.h.in
  74. ${PROJECT_BINARY_DIR}/dnn/include/hcc_detail/hcc_defs_epilogue.h)
  75. file(GLOB_RECURSE HIP_SOURCES_ rocm/*.cpp.hip)
  76. set(HIP_TARGET_NAME megdnn_hip_kernel)
  77. set(_HIPCC_OPTIONS "-fPIC")
  78. set(_HCC_OPTIONS "-fPIC")
  79. set(_NVCC_OPTIONS "-fPIC")
  80. list(APPEND HIP_SOURCES ${HIP_SOURCES_})
  81. set_source_files_properties(${HIP_SOURCES} PROPERTIES HIP_SOURCE_PROPERTY_FORMAT 1)
  82. HIP_INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/dnn
  83. ${PROJECT_SOURCE_DIR}/dnn/include
  84. ${PROJECT_BINARY_DIR}/dnn
  85. ${PROJECT_BINARY_DIR}/genfiles
  86. ${PROJECT_BINARY_DIR}/dnn/include
  87. ${HIP_INCLUDE_DIR}
  88. ${MIOPEN_INCLUDE_DIR}
  89. ${ROCBLAS_INCLUDE_DIR}
  90. ${ROCRAND_INCLUDE_DIR}
  91. ${AMDOCL_INCLUDE_DIR})
  92. hip_compile(
  93. ${HIP_TARGET_NAME} HIPOBJS ${HIP_SOURCES}
  94. HIPCC_OPTIONS ${_HIPCC_OPTIONS}
  95. HCC_OPTIONS ${_HCC_OPTIONS}
  96. NVCC_OPTIONS ${_NVCC_OPTIONS})
  97. list(APPEND SOURCES ${HIPOBJS})
  98. endif ()
  99. if(MGE_WITH_CUDA)
  100. file(GLOB_RECURSE SOURCES_ cuda/*.cpp)
  101. list(APPEND SOURCES ${SOURCES_})
  102. file(GLOB_RECURSE CUSOURCES cuda/*.cu)
  103. set(CUTLASS_GEN_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/cutlass_generator/generator.py)
  104. set(CUTLASS_GEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/cuda/cutlass/generated)
  105. function(gen_cutlass_kimpl op type)
  106. set(CURRENT_CUTLASS_GEN_DIR ${CUTLASS_GEN_DIR}/${op}_${type})
  107. file(MAKE_DIRECTORY ${CURRENT_CUTLASS_GEN_DIR})
  108. execute_process(
  109. COMMAND ${PYTHON3_EXECUTABLE_WITHOUT_VERSION} ${CUTLASS_GEN_SCRIPT} --operations ${op} --type ${type} ${CURRENT_CUTLASS_GEN_DIR}
  110. RESULT_VARIABLE gen_cutlass_result
  111. OUTPUT_FILE ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log
  112. ERROR_FILE ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log
  113. )
  114. if (NOT gen_cutlass_result EQUAL 0)
  115. message(FATAL_ERROR "Error generating library instances. See ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log")
  116. endif()
  117. endfunction()
  118. gen_cutlass_kimpl(gemm simt)
  119. gen_cutlass_kimpl(gemv simt)
  120. gen_cutlass_kimpl(deconv simt)
  121. gen_cutlass_kimpl(conv2d simt)
  122. gen_cutlass_kimpl(conv2d tensorop8816)
  123. gen_cutlass_kimpl(conv2d tensorop8832)
  124. file(GLOB_RECURSE CUTLASS_SOURCES ${CUTLASS_GEN_DIR}/*.cu)
  125. list(APPEND SOURCES ${CUTLASS_SOURCES})
  126. list(APPEND SOURCES ${CUSOURCES})
  127. endif()
  128. if(MGE_WITH_CAMBRICON)
  129. file(GLOB_RECURSE SOURCES_ cambricon/*.cpp)
  130. list(APPEND SOURCES ${SOURCES_})
  131. file(GLOB_RECURSE BANG_SOURCES cambricon/*.mlu)
  132. list(APPEND MEGDNN_INCLUDES "${PROJECT_SOURCE_DIR}/dnn/include")
  133. list(APPEND MEGDNN_INCLUDES "${PROJECT_SOURCE_DIR}/dnn")
  134. list(APPEND MEGDNN_INCLUDES "${PROJECT_BINARY_DIR}/genfiles")
  135. bang_compile(BANG_OBJS "${BANG_SOURCES}" "${MEGDNN_INCLUDES}")
  136. list(APPEND SOURCES ${BANG_OBJS})
  137. endif()
  138. if(MGE_WITH_ATLAS)
  139. file(GLOB_RECURSE SOURCES_ atlas/*.cpp)
  140. list(APPEND SOURCES ${SOURCES_})
  141. list(APPEND LIBMEGDNN_DEF -DMEGDNN_WITH_ATLAS=1)
  142. endif()
  143. add_definitions(${LIBMEGDNN_DEF})
  144. add_library(megdnn EXCLUDE_FROM_ALL OBJECT ${SOURCES})
  145. target_link_libraries(megdnn PUBLIC opr_param_defs)
  146. if(MGE_WITH_CUDA)
  147. target_link_libraries(megdnn PRIVATE $<BUILD_INTERFACE:cutlass>)
  148. target_include_directories(megdnn PRIVATE ${CUDNN_INCLUDE_DIR})
  149. endif()
  150. if(MGE_WITH_ROCM)
  151. target_include_directories(megdnn PUBLIC
  152. ${HIP_INCLUDE_DIR}
  153. ${MIOPEN_INCLUDE_DIR}
  154. ${ROCBLAS_INCLUDE_DIR}
  155. ${ROCRAND_INCLUDE_DIR}
  156. ${AMDOCL_INCLUDE_DIR})
  157. target_link_directories(megdnn PUBLIC
  158. ${HIP_LIBRARY_DIR}
  159. ${MIOPEN_LIBRARY_DIR}
  160. ${ROCBLAS_LIBRARY_DIR}
  161. ${ROCRAND_LIBRARY_DIR}
  162. ${AMDOCL_LIBRARY_DIR})
  163. endif()
  164. if(${MGE_ARCH} STREQUAL "x86_64" OR ${MGE_ARCH} STREQUAL "i386" OR ${MGE_ARCH} STREQUAL "armv7" OR ${MGE_ARCH} STREQUAL "aarch64")
  165. if(MGE_ENABLE_CPUINFO)
  166. target_link_libraries(megdnn PRIVATE $<BUILD_INTERFACE:cpuinfo>)
  167. endif()
  168. endif()
  169. target_include_directories(megdnn
  170. PUBLIC
  171. $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/genfiles>
  172. $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/dnn/include>
  173. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  174. PRIVATE
  175. ${PROJECT_SOURCE_DIR}/dnn
  176. ${PROJECT_SOURCE_DIR}/third_party/midout/src
  177. )
  178. install(DIRECTORY ${PROJECT_SOURCE_DIR}/dnn/include DESTINATION . FILES_MATCHING PATTERN "*.h*")
  179. if(CXX_SUPPORT_WCLASS_MEMACCESS)
  180. if(MGE_WITH_CUDA)
  181. target_compile_options(megdnn PRIVATE "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-class-memaccess>"
  182. "$<$<NOT:$<COMPILE_LANGUAGE:CUDA>>:-Wno-class-memaccess>")
  183. else()
  184. target_compile_options(megdnn PRIVATE "-Wno-class-memaccess")
  185. endif()
  186. endif()
  187. target_compile_definitions(megdnn INTERFACE ${LIBMEGDNN_DEF})
  188. if(MGE_WITH_MKLDNN AND ${MGE_ARCH} STREQUAL "x86_64")
  189. if (BUILD_SHARED_LIBS)
  190. target_link_libraries(megdnn PRIVATE $<BUILD_INTERFACE:dnnl>)
  191. else()
  192. target_link_libraries(megdnn PRIVATE dnnl)
  193. endif()
  194. endif()
  195. if (BUILD_SHARED_LIBS)
  196. target_link_libraries(megdnn PRIVATE $<BUILD_INTERFACE:${MGE_BLAS_LIBS}>)
  197. else()
  198. target_link_libraries(megdnn PRIVATE ${MGE_BLAS_LIBS})
  199. endif()
  200. if (MGE_WITH_ROCM)
  201. target_link_libraries(megdnn PRIVATE ${HIPOBJS} ${MGE_ROCM_LIBS})
  202. endif ()
  203. if(MGE_WITH_ATLAS)
  204. if (BUILD_SHARED_LIBS)
  205. target_link_libraries(megdnn PRIVATE $<BUILD_INTERFACE:${MGE_ATLAS_LIBS}>)
  206. else()
  207. target_link_libraries(megdnn PRIVATE ${MGE_ATLAS_LIBS})
  208. endif()
  209. endif()
  210. if(CMAKE_THREAD_LIBS_INIT)
  211. target_link_libraries(megdnn PRIVATE Threads::Threads)
  212. endif()
  213. if(MGE_WITH_CAMBRICON)
  214. target_link_libraries(megdnn PRIVATE ${BANG_OBJS} ${MGE_CAMBRICON_LIBS})
  215. endif()
  216. install(TARGETS megdnn EXPORT ${MGE_EXPORT_TARGETS})

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