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.

algo.cpp 8.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /**
  2. * \file dnn/src/rocm/pooling/algos.cpp
  3. * MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
  4. *
  5. * Copyright (c) 2014-2021 Megvii Inc. All rights reserved.
  6. *
  7. * Unless required by applicable law or agreed to in writing,
  8. * software distributed under the License is distributed on an
  9. * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or
  10. * implied.
  11. */
  12. #include "./algo.h"
  13. #include "hcc_detail/hcc_defs_prologue.h"
  14. #include "src/rocm/utils.h"
  15. using namespace megdnn;
  16. using namespace rocm;
  17. PoolingForwardImpl::AlgoPack::AlgoPack() {
  18. all_algos.push_back(&algo_miopen);
  19. for (auto&& algo : all_algos) {
  20. m_all_algos_map.emplace(algo->info().desc, algo);
  21. }
  22. }
  23. PoolingForwardImpl::AlgoPack PoolingForwardImpl::sm_algo_pack;
  24. MEGDNN_DEF_GET_ALGO_FROM_DESC(PoolingForwardImpl)
  25. PoolingForwardImpl::AlgoBase::SizeArgs::SizeArgs(PoolingForwardImpl* o,
  26. const TensorLayout& src,
  27. const TensorLayout& dst)
  28. : handle{concrete_handle(o->handle())},
  29. opr{o},
  30. layout_src{&src},
  31. layout_dst{&dst} {}
  32. PoolingForwardImpl::AlgoBase::ExecArgs::ExecArgs(PoolingForwardImpl* opr,
  33. _megdnn_tensor_in src,
  34. _megdnn_tensor_out dst,
  35. _megdnn_workspace workspace)
  36. : SizeArgs(opr, src.layout, dst.layout),
  37. src_tensor{&src},
  38. dst_tensor{&dst},
  39. workspace{workspace} {}
  40. std::string PoolingForwardImpl::AlgoBase::SizeArgs::to_string() const {
  41. return ssprintf("src=%s, dst=%s", layout_src->to_string().c_str(),
  42. layout_dst->to_string().c_str());
  43. }
  44. bool PoolingForwardImpl::AlgoMIOpen::is_available(const SizeArgs& args) const {
  45. return true;
  46. }
  47. void PoolingForwardImpl::AlgoMIOpen::init_mode(
  48. const ExecArgs& args, miopenPoolingMode_t& mode) const {
  49. switch (args.opr->param().mode) {
  50. case param::Pooling::Mode::MAX:
  51. mode = miopenPoolingMax;
  52. break;
  53. case param::Pooling::Mode::AVERAGE_COUNT_EXCLUDE_PADDING:
  54. mode = miopenPoolingAverage;
  55. break;
  56. case param::Pooling::Mode::AVERAGE:
  57. mode = miopenPoolingAverageInclusive;
  58. break;
  59. default:
  60. megdnn_throw(ssprintf("Unspport pooling mode : {%d}",
  61. static_cast<int>(args.opr->param().mode)));
  62. }
  63. }
  64. size_t PoolingForwardImpl::AlgoMIOpen::get_workspace_in_bytes(
  65. const SizeArgs& args) const {
  66. return 0;
  67. }
  68. void PoolingForwardImpl::AlgoMIOpen::exec(const ExecArgs& args) const {
  69. auto handle = miopen_handle(args.handle);
  70. TensorDesc src_desc, dst_desc;
  71. args.init_desc(src_desc, dst_desc);
  72. miopenPoolingMode_t mode;
  73. init_mode(args, mode);
  74. miopenPoolingDescriptor_t miopen_desc;
  75. miopen_check(miopenCreatePoolingDescriptor(&miopen_desc));
  76. miopen_check(miopenSet2dPoolingDescriptor(
  77. miopen_desc, mode, args.opr->param().window_h,
  78. args.opr->param().window_w, args.opr->param().pad_h,
  79. args.opr->param().pad_w, args.opr->param().stride_h,
  80. args.opr->param().stride_w));
  81. dt_float32 alpha = 1.0f, beta = 0.0f;
  82. miopen_check(miopenPoolingForward(
  83. handle, miopen_desc, &alpha, src_desc.desc,
  84. args.src_tensor->raw_ptr, &beta, dst_desc.desc,
  85. args.dst_tensor->raw_ptr, false, nullptr, 0_z));
  86. miopen_check(miopenDestroyPoolingDescriptor(miopen_desc));
  87. }
  88. PoolingBackwardImpl::AlgoPack::AlgoPack() {
  89. all_algos.push_back(&algo_miopen);
  90. for (auto&& algo : all_algos) {
  91. m_all_algos_map.emplace(algo->info().desc, algo);
  92. }
  93. }
  94. PoolingBackwardImpl::AlgoPack PoolingBackwardImpl::sm_algo_pack;
  95. MEGDNN_DEF_GET_ALGO_FROM_DESC(PoolingBackwardImpl)
  96. PoolingBackwardImpl::AlgoBase::SizeArgs::SizeArgs(PoolingBackwardImpl* o,
  97. const TensorLayout& src,
  98. const TensorLayout& dst,
  99. const TensorLayout& diff,
  100. const TensorLayout& grad)
  101. : handle{concrete_handle(o->handle())},
  102. opr{o},
  103. layout_src{&src},
  104. layout_dst{&dst},
  105. layout_diff{&diff},
  106. layout_grad{&grad} {}
  107. PoolingBackwardImpl::AlgoBase::ExecArgs::ExecArgs(PoolingBackwardImpl* opr,
  108. _megdnn_tensor_in src,
  109. _megdnn_tensor_in dst,
  110. _megdnn_tensor_in diff,
  111. _megdnn_tensor_out grad,
  112. _megdnn_workspace workspace)
  113. : SizeArgs(opr, src.layout, dst.layout, diff.layout, grad.layout),
  114. src_tensor{&src},
  115. dst_tensor{&dst},
  116. diff_tensor{&diff},
  117. grad_tensor{&grad},
  118. workspace{workspace} {}
  119. std::string PoolingBackwardImpl::AlgoBase::SizeArgs::to_string() const {
  120. return ssprintf(
  121. "src=%s, dst=%s, diff=%s, grad=%s", layout_src->to_string().c_str(),
  122. layout_dst->to_string().c_str(), layout_diff->to_string().c_str(),
  123. layout_grad->to_string().c_str());
  124. }
  125. bool PoolingBackwardImpl::AlgoMIOpen::is_available(const SizeArgs&) const {
  126. return true;
  127. }
  128. size_t PoolingBackwardImpl::AlgoMIOpen::get_workspace_in_bytes(
  129. const SizeArgs& args) const {
  130. TensorDesc dst_desc;
  131. dst_desc.set(*args.layout_dst);
  132. size_t ws_size = 0_z;
  133. miopenPoolingGetWorkSpaceSize(dst_desc.desc, &ws_size);
  134. return ws_size;
  135. }
  136. void PoolingBackwardImpl::AlgoMIOpen::init_mode(const ExecArgs& args,
  137. miopenPoolingMode_t& mode) const {
  138. switch (args.opr->param().mode) {
  139. case param::Pooling::Mode::MAX:
  140. mode = miopenPoolingMax;
  141. break;
  142. case param::Pooling::Mode::AVERAGE_COUNT_EXCLUDE_PADDING:
  143. mode = miopenPoolingAverage;
  144. break;
  145. case param::Pooling::Mode::AVERAGE:
  146. mode = miopenPoolingAverageInclusive;
  147. break;
  148. default:
  149. megdnn_throw(ssprintf("Unspport pooling mode : {%d}",
  150. static_cast<int>(args.opr->param().mode)));
  151. }
  152. }
  153. void PoolingBackwardImpl::AlgoMIOpen::exec(const ExecArgs& args) const {
  154. auto handle = miopen_handle(args.handle);
  155. TensorDesc src_desc, dst_desc, diff_desc, grad_desc;
  156. args.init_desc(src_desc, dst_desc, diff_desc, grad_desc);
  157. miopenPoolingMode_t mode;
  158. init_mode(args, mode);
  159. miopenPoolingDescriptor_t miopen_desc;
  160. miopen_check(miopenCreatePoolingDescriptor(&miopen_desc));
  161. miopen_check(miopenSet2dPoolingDescriptor(
  162. miopen_desc, mode, args.opr->param().window_h,
  163. args.opr->param().window_w, args.opr->param().pad_h,
  164. args.opr->param().pad_w, args.opr->param().stride_h,
  165. args.opr->param().stride_w));
  166. float alpha = 1.0f, beta = 0.0f;
  167. if (args.opr->param().mode == param::Pooling::Mode::MAX) {
  168. //! FIXME: when using max pooling opr, the backward opr need the indices
  169. //! of the forward opr which stored in workspace. We have to recompute
  170. //! the indices by calling miopenPoolingForward again.
  171. miopen_check(miopenPoolingForward(
  172. handle, miopen_desc, &alpha, src_desc.desc,
  173. args.src_tensor->raw_ptr, &beta, dst_desc.desc,
  174. args.dst_tensor->raw_ptr, true, args.workspace.raw_ptr,
  175. args.workspace.size));
  176. }
  177. miopen_check(miopenPoolingBackward(
  178. handle, miopen_desc, &alpha, dst_desc.desc,
  179. args.dst_tensor->raw_ptr, diff_desc.desc, args.diff_tensor->raw_ptr,
  180. src_desc.desc, args.src_tensor->raw_ptr, &beta, grad_desc.desc,
  181. args.grad_tensor->raw_ptr, args.workspace.raw_ptr));
  182. }

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