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.

layout_options.cpp 5.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * \file lite/load_and_run/src/options/layout_options.cpp
  3. *
  4. * This file is part of MegEngine, a deep learning framework developed by
  5. * Megvii.
  6. *
  7. * \copyright Copyright (c) 2020-2021 Megvii Inc. All rights reserved.
  8. */
  9. #include <gflags/gflags.h>
  10. #include "misc.h"
  11. #include "models/model_lite.h"
  12. #include "models/model_mdl.h"
  13. #include "layout_options.h"
  14. namespace lar {
  15. template <>
  16. void LayoutOption::config_model_internel<ModelLite>(
  17. RuntimeParam& runtime_param, std::shared_ptr<ModelLite> model) {
  18. if (runtime_param.stage == RunStage::BEFORE_MODEL_LOAD) {
  19. #define ENABLE_LAYOUT(layout) \
  20. LITE_WARN("enable " #layout " optimization"); \
  21. model->get_config().options.enable_##layout = true; \
  22. break;
  23. switch (option_flag) {
  24. case OptLayoutType::NCHW4:
  25. ENABLE_LAYOUT(nchw4)
  26. case OptLayoutType::CHWN4:
  27. LITE_THROW("lite model unsupport chwn4 layout");
  28. break;
  29. case OptLayoutType::NCHW44:
  30. ENABLE_LAYOUT(nchw44)
  31. case OptLayoutType::NCHW88:
  32. ENABLE_LAYOUT(nchw88)
  33. case OptLayoutType::NCHW32:
  34. ENABLE_LAYOUT(nchw32)
  35. case OptLayoutType::NCHW64:
  36. ENABLE_LAYOUT(nchw64)
  37. case OptLayoutType::NHWCD4:
  38. ENABLE_LAYOUT(nhwcd4)
  39. case OptLayoutType::NCHW44_DOT:
  40. ENABLE_LAYOUT(nchw44_dot)
  41. default:
  42. break;
  43. }
  44. #undef ENABLE_LAYOUT
  45. }
  46. }
  47. template <>
  48. void lar::LayoutOption::config_model_internel<ModelMdl>(
  49. RuntimeParam& runtime_param, std::shared_ptr<ModelMdl> model) {
  50. if (runtime_param.stage == RunStage::BEFORE_MODEL_LOAD) {
  51. mgb_log_debug("mdl layout config start");
  52. #define ENABLE_LAYOUT(layout) \
  53. mgb_log_warn("enable " #layout " optimization"); \
  54. model->get_mdl_config().comp_graph->options().graph_opt.enable_##layout(); \
  55. break;
  56. switch (option_flag) {
  57. case OptLayoutType::NCHW4:
  58. ENABLE_LAYOUT(nchw4)
  59. case OptLayoutType::CHWN4:
  60. ENABLE_LAYOUT(chwn4)
  61. case OptLayoutType::NCHW44:
  62. ENABLE_LAYOUT(nchw44)
  63. case OptLayoutType::NCHW88:
  64. ENABLE_LAYOUT(nchw88)
  65. case OptLayoutType::NCHW32:
  66. ENABLE_LAYOUT(nchw32)
  67. case OptLayoutType::NCHW64:
  68. ENABLE_LAYOUT(nchw64)
  69. case OptLayoutType::NHWCD4:
  70. ENABLE_LAYOUT(nhwcd4)
  71. case OptLayoutType::NCHW44_DOT:
  72. ENABLE_LAYOUT(nchw44_dot)
  73. default:
  74. break;
  75. }
  76. mgb_log_debug("mdl layout config end");
  77. #undef ENABLE_LAYOUT
  78. }
  79. }
  80. } // namespace lar
  81. using namespace lar;
  82. OptLayoutType LayoutOption::option_flag;
  83. LayoutOption::LayoutOption() {
  84. m_option_name = "layout";
  85. }
  86. bool LayoutOption::is_valid() {
  87. size_t valid_flag = 0;
  88. if (FLAGS_enable_nchw4) {
  89. valid_flag = valid_flag | (1 << 0);
  90. }
  91. if (FLAGS_enable_chwn4) {
  92. valid_flag = valid_flag | (1 << 1);
  93. }
  94. if (FLAGS_enable_nchw44) {
  95. valid_flag = valid_flag | (1 << 2);
  96. }
  97. if (FLAGS_enable_nchw88) {
  98. valid_flag = valid_flag | (1 << 3);
  99. }
  100. if (FLAGS_enable_nchw32) {
  101. valid_flag = valid_flag | (1 << 4);
  102. }
  103. if (FLAGS_enable_nchw64) {
  104. valid_flag = valid_flag | (1 << 5);
  105. }
  106. if (FLAGS_enable_nhwcd4) {
  107. valid_flag = valid_flag | (1 << 6);
  108. }
  109. if (FLAGS_enable_nchw44_dot) {
  110. valid_flag = valid_flag | (1 << 7);
  111. }
  112. bool ret = valid_flag && !(valid_flag & (valid_flag - 1));
  113. if (ret) {
  114. option_flag = static_cast<OptLayoutType>(valid_flag);
  115. } else {
  116. option_flag = static_cast<OptLayoutType>(0);
  117. }
  118. return ret;
  119. };
  120. std::shared_ptr<OptionBase> LayoutOption::create_option() {
  121. static std::shared_ptr<LayoutOption> option(new LayoutOption);
  122. if (LayoutOption::is_valid()) {
  123. return std::static_pointer_cast<OptionBase>(option);
  124. } else {
  125. return nullptr;
  126. }
  127. }
  128. void LayoutOption::config_model(
  129. RuntimeParam& runtime_param, std::shared_ptr<ModelBase> model) {
  130. CONFIG_MODEL_FUN;
  131. }
  132. DEFINE_bool(enable_nchw4, false, "enable nchw4 layout optimization!!");
  133. DEFINE_bool(enable_chwn4, false, "enable chwn4 layout optimization!!");
  134. DEFINE_bool(enable_nchw44, false, "enable nchw44 layout optimization!!");
  135. DEFINE_bool(enable_nchw88, false, "enable nchw88 layout optimization!!");
  136. DEFINE_bool(enable_nchw32, false, "enable nchw32 layout optimization!!");
  137. DEFINE_bool(enable_nchw64, false, "enable nchw64 layout optimization!!");
  138. DEFINE_bool(enable_nhwcd4, false, "enable nhwcd4 layout optimization!!");
  139. DEFINE_bool(enable_nchw44_dot, false, "enable nchw444-dot layout optimization!!");
  140. REGIST_OPTION_CREATOR(layout, lar::LayoutOption::create_option);