LoadHIP.cmake 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. set(PYTORCH_FOUND_HIP FALSE)
  2. if(NOT DEFINED ENV{ROCM_PATH})
  3. set(ROCM_PATH /opt/rocm)
  4. else()
  5. set(ROCM_PATH $ENV{ROCM_PATH})
  6. endif()
  7. if(NOT DEFINED ENV{ROCM_INCLUDE_DIRS})
  8. set(ROCM_INCLUDE_DIRS ${ROCM_PATH}/include)
  9. else()
  10. set(ROCM_INCLUDE_DIRS $ENV{ROCM_INCLUDE_DIRS})
  11. endif()
  12. # HIP_PATH
  13. if(NOT DEFINED ENV{HIP_PATH})
  14. set(HIP_PATH ${ROCM_PATH}/hip)
  15. else()
  16. set(HIP_PATH $ENV{HIP_PATH})
  17. endif()
  18. if(NOT EXISTS ${HIP_PATH})
  19. return()
  20. endif()
  21. # HCC_PATH
  22. if(NOT DEFINED ENV{HCC_PATH})
  23. set(HCC_PATH ${ROCM_PATH}/hcc)
  24. else()
  25. set(HCC_PATH $ENV{HCC_PATH})
  26. endif()
  27. # HSA_PATH
  28. if(NOT DEFINED ENV{HSA_PATH})
  29. set(HSA_PATH ${ROCM_PATH}/hsa)
  30. else()
  31. set(HSA_PATH $ENV{HSA_PATH})
  32. endif()
  33. # ROCBLAS_PATH
  34. if(NOT DEFINED ENV{ROCBLAS_PATH})
  35. set(ROCBLAS_PATH ${ROCM_PATH}/rocblas)
  36. else()
  37. set(ROCBLAS_PATH $ENV{ROCBLAS_PATH})
  38. endif()
  39. # ROCFFT_PATH
  40. if(NOT DEFINED ENV{ROCFFT_PATH})
  41. set(ROCFFT_PATH ${ROCM_PATH}/rocfft)
  42. else()
  43. set(ROCFFT_PATH $ENV{ROCFFT_PATH})
  44. endif()
  45. # HIPFFT_PATH
  46. if(NOT DEFINED ENV{HIPFFT_PATH})
  47. set(HIPFFT_PATH ${ROCM_PATH}/hipfft)
  48. else()
  49. set(HIPFFT_PATH $ENV{HIPFFT_PATH})
  50. endif()
  51. # HIPSPARSE_PATH
  52. if(NOT DEFINED ENV{HIPSPARSE_PATH})
  53. set(HIPSPARSE_PATH ${ROCM_PATH}/hipsparse)
  54. else()
  55. set(HIPSPARSE_PATH $ENV{HIPSPARSE_PATH})
  56. endif()
  57. # THRUST_PATH
  58. if(DEFINED ENV{THRUST_PATH})
  59. set(THRUST_PATH $ENV{THRUST_PATH})
  60. else()
  61. set(THRUST_PATH ${ROCM_PATH}/include)
  62. endif()
  63. # HIPRAND_PATH
  64. if(NOT DEFINED ENV{HIPRAND_PATH})
  65. set(HIPRAND_PATH ${ROCM_PATH}/hiprand)
  66. else()
  67. set(HIPRAND_PATH $ENV{HIPRAND_PATH})
  68. endif()
  69. # ROCRAND_PATH
  70. if(NOT DEFINED ENV{ROCRAND_PATH})
  71. set(ROCRAND_PATH ${ROCM_PATH}/rocrand)
  72. else()
  73. set(ROCRAND_PATH $ENV{ROCRAND_PATH})
  74. endif()
  75. # MIOPEN_PATH
  76. if(NOT DEFINED ENV{MIOPEN_PATH})
  77. set(MIOPEN_PATH ${ROCM_PATH}/miopen)
  78. else()
  79. set(MIOPEN_PATH $ENV{MIOPEN_PATH})
  80. endif()
  81. # RCCL_PATH
  82. if(NOT DEFINED ENV{RCCL_PATH})
  83. set(RCCL_PATH ${ROCM_PATH}/rccl)
  84. else()
  85. set(RCCL_PATH $ENV{RCCL_PATH})
  86. endif()
  87. # ROCPRIM_PATH
  88. if(NOT DEFINED ENV{ROCPRIM_PATH})
  89. set(ROCPRIM_PATH ${ROCM_PATH}/rocprim)
  90. else()
  91. set(ROCPRIM_PATH $ENV{ROCPRIM_PATH})
  92. endif()
  93. # HIPCUB_PATH
  94. if(NOT DEFINED ENV{HIPCUB_PATH})
  95. set(HIPCUB_PATH ${ROCM_PATH}/hipcub)
  96. else()
  97. set(HIPCUB_PATH $ENV{HIPCUB_PATH})
  98. endif()
  99. # ROCTHRUST_PATH
  100. if(NOT DEFINED ENV{ROCTHRUST_PATH})
  101. set(ROCTHRUST_PATH ${ROCM_PATH}/rocthrust)
  102. else()
  103. set(ROCTHRUST_PATH $ENV{ROCTHRUST_PATH})
  104. endif()
  105. # ROCTRACER_PATH
  106. if(NOT DEFINED ENV{ROCTRACER_PATH})
  107. set(ROCTRACER_PATH ${ROCM_PATH}/roctracer)
  108. else()
  109. set(ROCTRACER_PATH $ENV{ROCTRACER_PATH})
  110. endif()
  111. # MAGMA_HOME
  112. if(NOT DEFINED ENV{MAGMA_HOME})
  113. set(MAGMA_HOME ${ROCM_PATH}/magma)
  114. set(ENV{MAGMA_HOME} ${ROCM_PATH}/magma)
  115. else()
  116. set(MAGMA_HOME $ENV{MAGMA_HOME})
  117. endif()
  118. torch_hip_get_arch_list(PYTORCH_ROCM_ARCH)
  119. if(PYTORCH_ROCM_ARCH STREQUAL "")
  120. message(FATAL_ERROR "No GPU arch specified for ROCm build. Please use PYTORCH_ROCM_ARCH environment variable to specify GPU archs to build for.")
  121. endif()
  122. message("Building PyTorch for GPU arch: ${PYTORCH_ROCM_ARCH}")
  123. # Add HIP to the CMAKE Module Path
  124. set(CMAKE_MODULE_PATH ${HIP_PATH}/cmake ${CMAKE_MODULE_PATH})
  125. macro(find_package_and_print_version PACKAGE_NAME)
  126. find_package("${PACKAGE_NAME}" ${ARGN})
  127. message("${PACKAGE_NAME} VERSION: ${${PACKAGE_NAME}_VERSION}")
  128. endmacro()
  129. # Find the HIP Package
  130. find_package_and_print_version(HIP 1.0)
  131. if(HIP_FOUND)
  132. set(PYTORCH_FOUND_HIP TRUE)
  133. # Find ROCM version for checks
  134. # ROCM 5.0 and later will have header api for version management
  135. if(EXISTS ${ROCM_INCLUDE_DIRS}/rocm_version.h)
  136. set(PROJECT_RANDOM_BINARY_DIR "${PROJECT_BINARY_DIR}")
  137. set(file "${PROJECT_BINARY_DIR}/detect_rocm_version.cc")
  138. file(WRITE ${file} ""
  139. "#include <rocm_version.h>\n"
  140. "#include <cstdio>\n"
  141. "#ifndef ROCM_VERSION_PATCH\n"
  142. "#define ROCM_VERSION_PATCH 0\n"
  143. "#endif\n"
  144. "#define STRINGIFYHELPER(x) #x\n"
  145. "#define STRINGIFY(x) STRINGIFYHELPER(x)\n"
  146. "int main() {\n"
  147. " printf(\"%d.%d.%s\", ROCM_VERSION_MAJOR, ROCM_VERSION_MINOR, STRINGIFY(ROCM_VERSION_PATCH));\n"
  148. " return 0;\n"
  149. "}\n"
  150. )
  151. try_run(run_result compile_result ${PROJECT_RANDOM_BINARY_DIR} ${file}
  152. CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${ROCM_INCLUDE_DIRS}"
  153. RUN_OUTPUT_VARIABLE rocm_version_from_header
  154. COMPILE_OUTPUT_VARIABLE output_var
  155. )
  156. # We expect the compile to be successful if the include directory exists.
  157. if(NOT compile_result)
  158. message(FATAL_ERROR "Caffe2: Couldn't determine version from header: " ${output_var})
  159. endif()
  160. message(STATUS "Caffe2: Header version is: " ${rocm_version_from_header})
  161. set(ROCM_VERSION_DEV_RAW ${rocm_version_from_header})
  162. message("\n***** ROCm version from rocm_version.h ****\n")
  163. # ROCM < 4.5, we don't have the header api file, use flat file
  164. else()
  165. file(READ "${ROCM_PATH}/.info/version-dev" ROCM_VERSION_DEV_RAW)
  166. message("\n***** ROCm version from ${ROCM_PATH}/.info/version-dev ****\n")
  167. endif()
  168. string(REGEX MATCH "^([0-9]+)\.([0-9]+)\.([0-9]+).*$" ROCM_VERSION_DEV_MATCH ${ROCM_VERSION_DEV_RAW})
  169. if(ROCM_VERSION_DEV_MATCH)
  170. set(ROCM_VERSION_DEV_MAJOR ${CMAKE_MATCH_1})
  171. set(ROCM_VERSION_DEV_MINOR ${CMAKE_MATCH_2})
  172. set(ROCM_VERSION_DEV_PATCH ${CMAKE_MATCH_3})
  173. set(ROCM_VERSION_DEV "${ROCM_VERSION_DEV_MAJOR}.${ROCM_VERSION_DEV_MINOR}.${ROCM_VERSION_DEV_PATCH}")
  174. math(EXPR ROCM_VERSION_DEV_INT "(${ROCM_VERSION_DEV_MAJOR}*10000) + (${ROCM_VERSION_DEV_MINOR}*100) + ${ROCM_VERSION_DEV_PATCH}")
  175. endif()
  176. message("ROCM_VERSION_DEV: ${ROCM_VERSION_DEV}")
  177. message("ROCM_VERSION_DEV_MAJOR: ${ROCM_VERSION_DEV_MAJOR}")
  178. message("ROCM_VERSION_DEV_MINOR: ${ROCM_VERSION_DEV_MINOR}")
  179. message("ROCM_VERSION_DEV_PATCH: ${ROCM_VERSION_DEV_PATCH}")
  180. message("ROCM_VERSION_DEV_INT: ${ROCM_VERSION_DEV_INT}")
  181. math(EXPR TORCH_HIP_VERSION "(${HIP_VERSION_MAJOR} * 100) + ${HIP_VERSION_MINOR}")
  182. message("HIP_VERSION_MAJOR: ${HIP_VERSION_MAJOR}")
  183. message("HIP_VERSION_MINOR: ${HIP_VERSION_MINOR}")
  184. message("TORCH_HIP_VERSION: ${TORCH_HIP_VERSION}")
  185. message("\n***** Library versions from dpkg *****\n")
  186. execute_process(COMMAND dpkg -l COMMAND grep rocm-dev COMMAND awk "{print $2 \" VERSION: \" $3}")
  187. execute_process(COMMAND dpkg -l COMMAND grep rocm-libs COMMAND awk "{print $2 \" VERSION: \" $3}")
  188. execute_process(COMMAND dpkg -l COMMAND grep hsakmt-roct COMMAND awk "{print $2 \" VERSION: \" $3}")
  189. execute_process(COMMAND dpkg -l COMMAND grep rocr-dev COMMAND awk "{print $2 \" VERSION: \" $3}")
  190. execute_process(COMMAND dpkg -l COMMAND grep -w hcc COMMAND awk "{print $2 \" VERSION: \" $3}")
  191. execute_process(COMMAND dpkg -l COMMAND grep hip-base COMMAND awk "{print $2 \" VERSION: \" $3}")
  192. execute_process(COMMAND dpkg -l COMMAND grep hip_hcc COMMAND awk "{print $2 \" VERSION: \" $3}")
  193. message("\n***** Library versions from cmake find_package *****\n")
  194. set(CMAKE_HCC_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
  195. set(CMAKE_HCC_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
  196. ### Remove setting of Flags when FindHIP.CMake PR #558 is accepted.###
  197. # As of ROCm 5.1.x, all *.cmake files are under /opt/rocm/lib/cmake/<package>
  198. if(ROCM_VERSION_DEV VERSION_GREATER_EQUAL "5.1.0")
  199. set(hip_DIR ${ROCM_PATH}/lib/cmake/hip)
  200. set(hsa-runtime64_DIR ${ROCM_PATH}/lib/cmake/hsa-runtime64)
  201. set(AMDDeviceLibs_DIR ${ROCM_PATH}/lib/cmake/AMDDeviceLibs)
  202. set(amd_comgr_DIR ${ROCM_PATH}/lib/cmake/amd_comgr)
  203. set(rocrand_DIR ${ROCM_PATH}/lib/cmake/rocrand)
  204. set(hiprand_DIR ${ROCM_PATH}/lib/cmake/hiprand)
  205. set(rocblas_DIR ${ROCM_PATH}/lib/cmake/rocblas)
  206. set(miopen_DIR ${ROCM_PATH}/lib/cmake/miopen)
  207. set(rocfft_DIR ${ROCM_PATH}/lib/cmake/rocfft)
  208. set(hipfft_DIR ${ROCM_PATH}/lib/cmake/hipfft)
  209. set(hipsparse_DIR ${ROCM_PATH}/lib/cmake/hipsparse)
  210. set(rccl_DIR ${ROCM_PATH}/lib/cmake/rccl)
  211. set(rocprim_DIR ${ROCM_PATH}/lib/cmake/rocprim)
  212. set(hipcub_DIR ${ROCM_PATH}/lib/cmake/hipcub)
  213. set(rocthrust_DIR ${ROCM_PATH}/lib/cmake/rocthrust)
  214. else()
  215. set(hip_DIR ${HIP_PATH}/lib/cmake/hip)
  216. set(hsa-runtime64_DIR ${ROCM_PATH}/lib/cmake/hsa-runtime64)
  217. set(AMDDeviceLibs_DIR ${ROCM_PATH}/lib/cmake/AMDDeviceLibs)
  218. set(amd_comgr_DIR ${ROCM_PATH}/lib/cmake/amd_comgr)
  219. set(rocrand_DIR ${ROCRAND_PATH}/lib/cmake/rocrand)
  220. set(hiprand_DIR ${HIPRAND_PATH}/lib/cmake/hiprand)
  221. set(rocblas_DIR ${ROCBLAS_PATH}/lib/cmake/rocblas)
  222. set(miopen_DIR ${MIOPEN_PATH}/lib/cmake/miopen)
  223. set(rocfft_DIR ${ROCFFT_PATH}/lib/cmake/rocfft)
  224. set(hipfft_DIR ${HIPFFT_PATH}/lib/cmake/hipfft)
  225. set(hipsparse_DIR ${HIPSPARSE_PATH}/lib/cmake/hipsparse)
  226. set(rccl_DIR ${RCCL_PATH}/lib/cmake/rccl)
  227. set(rocprim_DIR ${ROCPRIM_PATH}/lib/cmake/rocprim)
  228. set(hipcub_DIR ${HIPCUB_PATH}/lib/cmake/hipcub)
  229. set(rocthrust_DIR ${ROCTHRUST_PATH}/lib/cmake/rocthrust)
  230. endif()
  231. find_package_and_print_version(hip REQUIRED)
  232. find_package_and_print_version(hsa-runtime64 REQUIRED)
  233. find_package_and_print_version(amd_comgr REQUIRED)
  234. find_package_and_print_version(rocrand REQUIRED)
  235. find_package_and_print_version(hiprand REQUIRED)
  236. find_package_and_print_version(rocblas REQUIRED)
  237. find_package_and_print_version(miopen REQUIRED)
  238. if(ROCM_VERSION_DEV VERSION_GREATER_EQUAL "4.1.0")
  239. find_package_and_print_version(hipfft REQUIRED)
  240. else()
  241. find_package_and_print_version(rocfft REQUIRED)
  242. endif()
  243. find_package_and_print_version(hipsparse REQUIRED)
  244. find_package_and_print_version(rccl)
  245. find_package_and_print_version(rocprim REQUIRED)
  246. find_package_and_print_version(hipcub REQUIRED)
  247. find_package_and_print_version(rocthrust REQUIRED)
  248. if(HIP_COMPILER STREQUAL clang)
  249. set(hip_library_name amdhip64)
  250. else()
  251. set(hip_library_name hip_hcc)
  252. endif()
  253. message("HIP library name: ${hip_library_name}")
  254. # TODO: hip_hcc has an interface include flag "-hc" which is only
  255. # recognizable by hcc, but not gcc and clang. Right now in our
  256. # setup, hcc is only used for linking, but it should be used to
  257. # compile the *_hip.cc files as well.
  258. find_library(PYTORCH_HIP_HCC_LIBRARIES ${hip_library_name} HINTS ${HIP_PATH}/lib)
  259. # TODO: miopen_LIBRARIES should return fullpath to the library file,
  260. # however currently it's just the lib name
  261. if(TARGET ${miopen_LIBRARIES})
  262. set(PYTORCH_MIOPEN_LIBRARIES ${miopen_LIBRARIES})
  263. else()
  264. find_library(PYTORCH_MIOPEN_LIBRARIES ${miopen_LIBRARIES} HINTS ${MIOPEN_PATH}/lib)
  265. endif()
  266. # TODO: rccl_LIBRARIES should return fullpath to the library file,
  267. # however currently it's just the lib name
  268. if(TARGET ${rccl_LIBRARIES})
  269. set(PYTORCH_RCCL_LIBRARIES ${rccl_LIBRARIES})
  270. else()
  271. find_library(PYTORCH_RCCL_LIBRARIES ${rccl_LIBRARIES} HINTS ${RCCL_PATH}/lib)
  272. endif()
  273. # hiprtc is part of HIP
  274. find_library(ROCM_HIPRTC_LIB ${hip_library_name} HINTS ${HIP_PATH}/lib)
  275. # roctx is part of roctracer
  276. find_library(ROCM_ROCTX_LIB roctx64 HINTS ${ROCTRACER_PATH}/lib)
  277. set(roctracer_INCLUDE_DIRS ${ROCTRACER_PATH}/include)
  278. endif()