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.

group_local.cpp 4.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /**
  2. * \file dnn/test/cuda/group_local.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 implied.
  10. */
  11. #include "megdnn/oprs/nn.h"
  12. #include "test/cuda/fixture.h"
  13. #include "test/common/checker.h"
  14. #if MEGDNN_WITH_BENCHMARK
  15. #include "test/common/benchmarker.h"
  16. #endif
  17. namespace megdnn {
  18. namespace test {
  19. TEST_F(CUDA, GROUP_LOCAL_FORWARD)
  20. {
  21. auto run = [&](size_t N, size_t IC, size_t IH, size_t IW,
  22. size_t FH, size_t FW,
  23. size_t OC, size_t OH, size_t OW,
  24. size_t PH, size_t PW,
  25. size_t SH, size_t SW,
  26. size_t group)
  27. {
  28. Checker<GroupLocal> checker(handle_cuda());
  29. GroupLocal::Param param;
  30. param.pad_h = PH;
  31. param.pad_w = PW;
  32. param.stride_h = SH;
  33. param.stride_w = SW;
  34. auto ICg = IC / group;
  35. auto OCg = OC / group;
  36. checker.set_param(param).exec({{N, IC, IH, IW},
  37. {group, OH, OW, ICg, FH, FW, OCg},
  38. {}});
  39. };
  40. for (size_t IC = 1; IC <= 16; ++IC)
  41. for (size_t N = 1; N <= 8; ++N)
  42. {
  43. size_t group = 5;
  44. size_t H = 7, W = 7;
  45. size_t OC = 7;
  46. run(N, IC*group, H, W, 3, 3, OC*group, H, W, 1, 1, 1, 1, group);
  47. }
  48. for (size_t N: {2, 64}) {
  49. // normal case
  50. run(N, 64, 7, 7,
  51. 3, 3,
  52. 32, 5, 5,
  53. 0, 0,
  54. 1, 1,
  55. 2);
  56. // padded case
  57. run(N, 32, 7, 7,
  58. 3, 3,
  59. 64, 7, 7,
  60. 1, 1,
  61. 1, 1,
  62. 2);
  63. // strided case
  64. run(N, 64, 7, 7,
  65. 3, 3,
  66. 64, 3, 3,
  67. 0, 0,
  68. 2, 2,
  69. 4);
  70. }
  71. }
  72. #if MEGDNN_WITH_BENCHMARK
  73. TEST_F(CUDA, BENCHMARK_GROUP_LOCAL_FORWARD)
  74. {
  75. Benchmarker<GroupLocalForward> B(handle_cuda());
  76. B.execs({{2, 352, 4, 4}, {22, 4, 4, 16, 3, 3, 16}, {}});
  77. B.execs({{2, 192, 8, 8}, {12, 8, 8, 16, 3, 3, 16}, {}});
  78. B.execs({{2, 176, 4, 4}, {11, 4, 4, 16, 3, 3, 16}, {}});
  79. }
  80. #endif
  81. TEST_F(CUDA, GROUP_LOCAL_BACKWARD_DATA)
  82. {
  83. auto run = [&](size_t N, size_t IC, size_t IH, size_t IW,
  84. size_t FH, size_t FW,
  85. size_t OC, size_t OH, size_t OW,
  86. size_t PH, size_t PW,
  87. size_t SH, size_t SW,
  88. size_t group)
  89. {
  90. Checker<GroupLocalBackwardData> checker(handle_cuda());
  91. GroupLocal::Param param;
  92. param.pad_h = PH;
  93. param.pad_w = PW;
  94. param.stride_h = SH;
  95. param.stride_w = SW;
  96. auto ICg = IC / group;
  97. auto OCg = OC / group;
  98. checker.set_param(param).exec({{group, OH, OW, ICg, FH, FW, OCg},
  99. {N, OC, OH, OW},
  100. {N, IC, IH, IW},
  101. });
  102. };
  103. for (size_t N: {64}) {
  104. // normal case
  105. run(N, 64, 7, 7,
  106. 3, 3,
  107. 32, 5, 5,
  108. 0, 0,
  109. 1, 1,
  110. 2);
  111. // padded case
  112. run(N, 32, 7, 7,
  113. 3, 3,
  114. 64, 7, 7,
  115. 1, 1,
  116. 1, 1,
  117. 2);
  118. // strided case
  119. run(N, 64, 7, 7,
  120. 3, 3,
  121. 64, 3, 3,
  122. 0, 0,
  123. 2, 2,
  124. 4);
  125. }
  126. }
  127. TEST_F(CUDA, GROUP_LOCAL_BACKWARD_FILTER)
  128. {
  129. auto run = [&](size_t N, size_t IC, size_t IH, size_t IW,
  130. size_t FH, size_t FW,
  131. size_t OC, size_t OH, size_t OW,
  132. size_t PH, size_t PW,
  133. size_t SH, size_t SW,
  134. size_t group)
  135. {
  136. Checker<GroupLocalBackwardFilter> checker(handle_cuda());
  137. GroupLocal::Param param;
  138. param.pad_h = PH;
  139. param.pad_w = PW;
  140. param.stride_h = SH;
  141. param.stride_w = SW;
  142. auto ICg = IC / group;
  143. auto OCg = OC / group;
  144. checker.set_param(param).exec({{N, IC, IH, IW},
  145. {N, OC, OH, OW},
  146. {group, OH, OW, ICg, FH, FW, OCg},
  147. });
  148. };
  149. for (size_t N: {64}) {
  150. // normal case
  151. run(N, 64, 7, 7,
  152. 3, 3,
  153. 32, 5, 5,
  154. 0, 0,
  155. 1, 1,
  156. 2);
  157. // padded case
  158. run(N, 32, 7, 7,
  159. 3, 3,
  160. 64, 7, 7,
  161. 1, 1,
  162. 1, 1,
  163. 2);
  164. // strided case
  165. run(N, 64, 7, 7,
  166. 3, 3,
  167. 64, 3, 3,
  168. 0, 0,
  169. 2, 2,
  170. 4);
  171. }
  172. }
  173. } // namespace test
  174. } // namespace megdnn
  175. // vim: syntax=cpp.doxygen

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