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.

miopen_wrapper.cpp 4.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /**
  2. * \file dnn/src/rocm/miopen_wrapper.cpp
  3. * MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
  4. *
  5. * Copyright (c) 2014-2020 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 implied.
  10. */
  11. #include "hcc_detail/hcc_defs_prologue.h"
  12. #include "src/rocm/miopen_wrapper.h"
  13. #include "src/common/utils.h"
  14. #include "src/rocm/utils.h"
  15. namespace {
  16. using namespace megdnn;
  17. miopenDataType_t to_miopen_dtype(DType type,
  18. const param::Convolution::Format format = {}) {
  19. MEGDNN_MARK_USED_VAR(format);
  20. //! TODO check quantized type
  21. switch (type.enumv()) {
  22. case DTypeEnum::Float32:
  23. return miopenFloat;
  24. #if !MEGDNN_DISABLE_FLOAT16
  25. case DTypeEnum::Float16:
  26. return miopenHalf;
  27. #endif
  28. case DTypeEnum::Int32:
  29. case DTypeEnum::QuantizedS32:
  30. return miopenInt32;
  31. case DTypeEnum::QuantizedS8:
  32. case DTypeEnum::Int8:
  33. return miopenInt8;
  34. default:
  35. megdnn_throw(
  36. megdnn_mangle("dtype must be float16/float32/int8/int32"));
  37. }
  38. }
  39. } // namespace
  40. namespace megdnn {
  41. namespace rocm {
  42. TensorDesc::TensorDesc() {
  43. miopen_check(miopenCreateTensorDescriptor(&desc));
  44. }
  45. TensorDesc::~TensorDesc() {
  46. miopen_check(miopenDestroyTensorDescriptor(desc));
  47. }
  48. void TensorDesc::set(const TensorLayout& layout,
  49. const param::Convolution::Format format) {
  50. megdnn_assert(format == param::Convolution::Format::NCHW,
  51. "for now, miopen only support NCHW format");
  52. megdnn_assert_eq_size_t(layout.ndim, 4_z);
  53. int n = layout[0];
  54. int c = layout[1];
  55. int h = layout[2];
  56. int w = layout[3];
  57. miopen_check(miopenSet4dTensorDescriptor(
  58. desc, to_miopen_dtype(layout.dtype), n, c, h, w));
  59. }
  60. ConvDesc::ConvDesc() {
  61. miopen_check(miopenCreateConvolutionDescriptor(&desc));
  62. }
  63. ConvDesc::~ConvDesc() {
  64. miopen_check(miopenDestroyConvolutionDescriptor(desc));
  65. }
  66. void ConvDesc::set(const param::Convolution& param, const size_t nr_group,
  67. const bool is_depthwise) {
  68. miopenConvolutionMode_t mode;
  69. if (param.mode == param::Convolution::Mode::CROSS_CORRELATION) {
  70. mode = miopenConvolution;
  71. if (param.sparse == param::Convolution::Sparse::GROUP) {
  72. mode = is_depthwise ? miopenDepthwise : miopenGroupConv;
  73. }
  74. } else {
  75. megdnn_throw(megdnn_mangle(
  76. "for now, miopen do not support non xcorr convolution"));
  77. }
  78. miopen_check(miopenInitConvolutionDescriptor(
  79. desc, mode, param.pad_h, param.pad_w, param.stride_h,
  80. param.stride_w, param.dilate_h, param.dilate_w));
  81. if (mode == miopenGroupConv || mode == miopenDepthwise) {
  82. miopen_check(miopenSetConvolutionGroupCount(desc, nr_group));
  83. }
  84. //! miopen do not support set compute_type, so mixed precision training is
  85. //! not supported
  86. }
  87. PoolingDesc::PoolingDesc() {
  88. miopen_check(miopenCreatePoolingDescriptor(&desc));
  89. }
  90. PoolingDesc::~PoolingDesc() {
  91. miopen_check(miopenDestroyPoolingDescriptor(desc));
  92. }
  93. void PoolingDesc::set(const param::Pooling& param) {
  94. miopenPoolingMode_t mode;
  95. switch (param.mode) {
  96. case param::Pooling::Mode::MAX:
  97. mode = miopenPoolingMax;
  98. break;
  99. case param::Pooling::Mode::AVERAGE_COUNT_EXCLUDE_PADDING:
  100. mode = miopenPoolingAverage;
  101. break;
  102. default:
  103. megdnn_throw(megdnn_mangle("Unsupported pooling mode for miopen"));
  104. }
  105. miopen_check(miopenSet2dPoolingDescriptor(
  106. desc, mode, param.window_h, param.window_w, param.pad_h,
  107. param.pad_w, param.stride_h, param.stride_w));
  108. }
  109. LRNDesc::LRNDesc() {
  110. miopen_check(miopenCreateLRNDescriptor(&desc));
  111. }
  112. LRNDesc::~LRNDesc() {
  113. miopen_check(miopenDestroyLRNDescriptor(desc));
  114. }
  115. void LRNDesc::set(const param::LRN& param) {
  116. MEGDNN_MARK_USED_VAR(param);
  117. //! TODO MIOpen has two LRN Mode, miopenLRNWithinChannel and
  118. //! miopenLRNCrossChannel, need to check what do these modes mean.
  119. }
  120. BNParamDesc::BNParamDesc() {
  121. miopen_check(miopenCreateTensorDescriptor(&desc));
  122. }
  123. void BNParamDesc::set(const miopenTensorDescriptor_t xDesc,
  124. miopenBatchNormMode_t mode) {
  125. miopen_check(miopenDeriveBNTensorDescriptor(desc, xDesc, mode));
  126. }
  127. BNParamDesc::~BNParamDesc() {
  128. miopen_check(miopenDestroyTensorDescriptor(desc));
  129. }
  130. } // namespace rocm
  131. } // namespace megdnn
  132. // vim: syntax=cpp.doxygen

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