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.

algos.h 6.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * \file dnn/src/fallback/conv_bias/algos.h
  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 implied.
  10. */
  11. #pragma once
  12. #include "src/fallback/conv_bias/opr_impl.h"
  13. #include "src/fallback/matrix_mul/opr_impl.h"
  14. #include "megdnn/thin/small_vector.h"
  15. namespace megdnn {
  16. namespace fallback {
  17. class ConvBiasImpl::AlgoNaive final : public AlgoBase {
  18. public:
  19. AlgoAttribute attribute() const override{
  20. return AlgoAttribute::REPRODUCIBLE | AlgoAttribute::NAIVE;
  21. }
  22. const char* name() const override { return "FALLBACK_NAIVE"; }
  23. bool usable(const NCBKernSizeParam& param,
  24. AlgoSelectionStrategy algo_selection_strategy) const override;
  25. size_t get_workspace(const NCBKernSizeParam& param) const override;
  26. SmallVector<NCBKern> dispatch_kerns(const NCBKernSizeParam&) const override;
  27. ConvAlgoTypePack get_algo_type() const override {
  28. auto support_data_type = static_cast<AlgoDataType>(
  29. static_cast<uint32_t>(AlgoDataType::FLOAT16) |
  30. static_cast<uint32_t>(AlgoDataType::FLOAT32) |
  31. static_cast<uint32_t>(AlgoDataType::INT8X8X16) |
  32. static_cast<uint32_t>(AlgoDataType::QINT8X8X32) |
  33. static_cast<uint32_t>(AlgoDataType::QUINT8X8X32));
  34. return {support_data_type, AlgoCategory::NAIVE};
  35. }
  36. MEGDNN_DECL_ALGO_TYPE(FB_NAIVE)
  37. };
  38. class ConvBiasImpl::AlgoWinogradF32 final : public AlgoBase {
  39. public:
  40. AlgoWinogradF32(MatrixMulImpl::AlgoBase* matmul_algo)
  41. : m_matmul_algo{matmul_algo} {}
  42. AlgoAttribute attribute() const override {
  43. return AlgoAttribute::REPRODUCIBLE | AlgoAttribute::NAIVE;
  44. }
  45. const char* name() const override {
  46. if (m_name.empty()) {
  47. m_name = ConvBiasImpl::algo_name<ConvBias::WinogradParam>(
  48. ssprintf("FALLBACK_WINOGRAD_F32-%s", m_matmul_algo->name()),
  49. {1, 2, UNIT_TILE_SIZE});
  50. }
  51. return m_name.c_str();
  52. }
  53. bool usable(const NCBKernSizeParam& param,
  54. AlgoSelectionStrategy algo_selection_strategy) const override;
  55. size_t get_workspace(const NCBKernSizeParam& param) const override;
  56. SmallVector<NCBKern> dispatch_kerns(const NCBKernSizeParam&) const override;
  57. ConvAlgoTypePack get_algo_type() const override {
  58. return {AlgoDataType::FLOAT32, AlgoCategory::WINOGRAD};
  59. }
  60. MEGDNN_DECL_ALGO_TYPE(FB_WINOGRAD_F32)
  61. private:
  62. MatrixMulImpl::AlgoBase* m_matmul_algo;
  63. mutable std::string m_name;
  64. constexpr size_t static UNIT_TILE_SIZE = 32;
  65. };
  66. class ConvBiasImpl::AlgoWinogradF32_4x4 final : public AlgoBase {
  67. public:
  68. AlgoWinogradF32_4x4(MatrixMulImpl::AlgoBase* matmul_algo)
  69. : m_matmul_algo{matmul_algo} {}
  70. AlgoAttribute attribute() const override {
  71. return AlgoAttribute::REPRODUCIBLE | AlgoAttribute::NAIVE;
  72. }
  73. const char* name() const override {
  74. if (m_name.empty()) {
  75. m_name = ConvBiasImpl::algo_name<ConvBias::WinogradParam>(
  76. ssprintf("FALLBACK_WINOGRAD_F32-%s", m_matmul_algo->name()),
  77. {4, 2, UNIT_TILE_SIZE});
  78. }
  79. return m_name.c_str();
  80. }
  81. bool usable(const NCBKernSizeParam& param,
  82. AlgoSelectionStrategy algo_selection_strategy) const override;
  83. size_t get_workspace(const NCBKernSizeParam& param) const override;
  84. SmallVector<NCBKern> dispatch_kerns(const NCBKernSizeParam&) const override;
  85. ConvAlgoTypePack get_algo_type() const override {
  86. return {AlgoDataType::FLOAT32, AlgoCategory::WINOGRAD};
  87. }
  88. MEGDNN_DECL_ALGO_TYPE(FB_WINOGRAD_4X4_F32)
  89. private:
  90. MatrixMulImpl::AlgoBase* m_matmul_algo;
  91. mutable std::string m_name;
  92. constexpr size_t static UNIT_TILE_SIZE = 32;
  93. };
  94. class ConvBiasImpl::AlgoWinogradQS8 final : public AlgoBase {
  95. public:
  96. AlgoWinogradQS8(MatrixMulImpl::AlgoBase* matmul_algo)
  97. : m_matmul_algo{matmul_algo} {}
  98. AlgoAttribute attribute() const override {
  99. return AlgoAttribute::REPRODUCIBLE | AlgoAttribute::NAIVE;
  100. }
  101. const char* name() const override {
  102. if (m_name.empty()) {
  103. m_name = ConvBiasImpl::algo_name<ConvBias::WinogradParam>(
  104. ssprintf("FALLBACK_WINOGRAD_QS8-%s", m_matmul_algo->name()),
  105. {1, 2, UNIT_TILE_SIZE});
  106. }
  107. return m_name.c_str();
  108. }
  109. bool usable(const NCBKernSizeParam& param,
  110. AlgoSelectionStrategy algo_selection_strategy) const override;
  111. size_t get_workspace(const NCBKernSizeParam& param) const override;
  112. SmallVector<NCBKern> dispatch_kerns(const NCBKernSizeParam&) const override;
  113. ConvAlgoTypePack get_algo_type() const override {
  114. return {AlgoDataType::QINT8X8X32, AlgoCategory::WINOGRAD};
  115. }
  116. MEGDNN_DECL_ALGO_TYPE(FB_WINOGRAD_QS8)
  117. private:
  118. MatrixMulImpl::AlgoBase* m_matmul_algo;
  119. mutable std::string m_name;
  120. constexpr size_t static UNIT_TILE_SIZE = 32;
  121. };
  122. class ConvBiasImpl::AlgoWinogradQS8_8x8 final : public AlgoBase {
  123. public:
  124. AlgoWinogradQS8_8x8(MatrixMulImpl::AlgoBase* matmul_algo)
  125. : m_matmul_algo{matmul_algo} {}
  126. AlgoAttribute attribute() const override {
  127. return AlgoAttribute::REPRODUCIBLE | AlgoAttribute::NAIVE;
  128. }
  129. const char* name() const override {
  130. if (m_name.empty()) {
  131. m_name = ConvBiasImpl::algo_name<ConvBias::WinogradParam>(
  132. ssprintf("FALLBACK_WINOGRAD_QS8-%s", m_matmul_algo->name()),
  133. {8, 2, UNIT_TILE_SIZE});
  134. }
  135. return m_name.c_str();
  136. }
  137. bool usable(const NCBKernSizeParam& param,
  138. AlgoSelectionStrategy algo_selection_strategy) const override;
  139. size_t get_workspace(const NCBKernSizeParam& param) const override;
  140. SmallVector<NCBKern> dispatch_kerns(const NCBKernSizeParam&) const override;
  141. ConvAlgoTypePack get_algo_type() const override {
  142. return {AlgoDataType::QINT8X8X32, AlgoCategory::WINOGRAD};
  143. }
  144. MEGDNN_DECL_ALGO_TYPE(FB_WINOGRAD_8X8_QS8)
  145. private:
  146. MatrixMulImpl::AlgoBase* m_matmul_algo;
  147. mutable std::string m_name;
  148. constexpr size_t static UNIT_TILE_SIZE = 32;
  149. };
  150. } // namespace fallback
  151. } // namespace megdnn
  152. // vim: syntax=cpp.doxygen

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