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_conv3d.cpp 8.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include "megdnn/oprs/nn.h"
  2. #include "test/common/benchmarker.h"
  3. #include "test/common/checker.h"
  4. #include "test/common/convolution3d.h"
  5. #include "test/cuda/fixture.h"
  6. #include "test/cuda/utils.h"
  7. namespace megdnn {
  8. namespace test {
  9. TEST_F(CUDA, GROUP_CONVOLUTION3D_FORWARD) {
  10. bool is_int_available = check_compute_capability(6, 1);
  11. static_cast<void>(is_int_available);
  12. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD,
  13. size_t FH, size_t FW, size_t OC, size_t PD, size_t PH, size_t PW,
  14. size_t SD, size_t SH, size_t SW, size_t DD, size_t DH, size_t DW,
  15. size_t group) {
  16. {
  17. // float case
  18. Checker<Convolution3D> checker(handle_cuda());
  19. Convolution3D::Param param;
  20. param.sparse = Convolution3D::Param::Sparse::GROUP;
  21. param.pad_d = PD;
  22. param.pad_h = PH;
  23. param.pad_w = PW;
  24. param.stride_d = SD;
  25. param.stride_h = SH;
  26. param.stride_w = SW;
  27. param.dilate_d = DD;
  28. param.dilate_h = DH;
  29. param.dilate_w = DW;
  30. auto ICpg = IC / group;
  31. auto OCpg = OC / group;
  32. checker.set_param(param).exec(
  33. {{N, IC, ID, IH, IW}, {group, OCpg, ICpg, FD, FH, FW}, {}});
  34. }
  35. };
  36. // normal case
  37. run(2, 64, 7, 7, 7, 1, 1, 1, 32, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2);
  38. run(1, 2, 2, 2, 2, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2);
  39. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2);
  40. // padded case
  41. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 2, 2, 2, 1, 1, 1, 1, 1, 1, 4);
  42. // strided case
  43. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 0, 0, 0, 2, 2, 2, 1, 1, 1, 8);
  44. // dilated case
  45. #if CUDNN_MAJOR >= 6
  46. run(10, 4, 64, 64, 12, 3, 2, 2, 64, 0, 0, 0, 1, 1, 1, 3, 4, 2, 4);
  47. #else
  48. #endif
  49. }
  50. TEST_F(CUDA, GROUP_CONVOLUTION3D_FORWARD_1x1x1) {
  51. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD,
  52. size_t FH, size_t FW, size_t OC, size_t group) {
  53. Checker<Convolution3D> checker(handle_cuda());
  54. checker.set_before_exec_callback(AlgoChecker<Convolution3DForward>(
  55. ExecutionPolicyAlgoName{"CUDA:GROUP_CONV3D_FORWARD", {{"1x1x1", {}}}}));
  56. Convolution3D::Param param;
  57. param.sparse = Convolution3D::Param::Sparse::GROUP;
  58. auto ICg = IC / group;
  59. auto OCg = OC / group;
  60. checker.set_param(param).exec(
  61. {{N, IC, ID, IH, IW}, {group, OCg, ICg, FD, FH, FW}, {}});
  62. };
  63. size_t ic = 192;
  64. for (size_t g = 2; g <= 4; g += 1) {
  65. for (size_t id = 4; id <= 16; id *= 2) {
  66. size_t iw = id, ih = id;
  67. run(2, ic, id, ih, iw, 1, 1, 1, ic / g, g);
  68. run(2, ic, id + 1, ih + 1, iw + 1, 1, 1, 1, ic / g, g);
  69. }
  70. }
  71. }
  72. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_DATA) {
  73. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD,
  74. size_t FH, size_t FW, size_t OC, size_t OD, size_t OH, size_t OW,
  75. size_t PD, size_t PH, size_t PW, size_t SD, size_t SH, size_t SW,
  76. size_t group) {
  77. Checker<Convolution3DBackwardData> checker(handle_cuda());
  78. Convolution3DBackwardData::Param param;
  79. param.sparse = Convolution3D::Param::Sparse::GROUP;
  80. param.pad_d = PD;
  81. param.pad_h = PH;
  82. param.pad_w = PW;
  83. param.stride_d = SD;
  84. param.stride_h = SH;
  85. param.stride_w = SW;
  86. auto ICg = IC / group;
  87. auto OCg = OC / group;
  88. checker.set_param(param).exec(
  89. {{group, OCg, ICg, FD, FH, FW},
  90. {N, OC, OD, OH, OW},
  91. {N, IC, ID, IH, IW}});
  92. };
  93. // bug case in prev ver
  94. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 0, 0, 1, 1, 1, 1, 2);
  95. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 0, 0, 1, 1, 1, 2, 2);
  96. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 0, 1, 0, 1, 2, 1, 2);
  97. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 2);
  98. // normal case
  99. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  100. // padded case
  101. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  102. // strided case
  103. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  104. // bigger case
  105. run(2, 32, 64, 64, 64, 3, 3, 3, 32, 62, 62, 62, 0, 0, 0, 1, 1, 1, 4);
  106. }
  107. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_DATA_CUDNN) {
  108. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD,
  109. size_t FH, size_t FW, size_t OC, size_t OD, size_t OH, size_t OW,
  110. size_t PD, size_t PH, size_t PW, size_t SD, size_t SH, size_t SW,
  111. size_t group) {
  112. Checker<Convolution3DBackwardData> checker(handle_cuda());
  113. checker.set_before_exec_callback(
  114. AlgoChecker<Convolution3DBackwardData>(ExecutionPolicyAlgoName{
  115. "CUDA:GROUP_CONV3D_BACKWARD_DATA", {{"CUDNN", {}}}}));
  116. Convolution3DBackwardData::Param param;
  117. param.sparse = Convolution3D::Param::Sparse::GROUP;
  118. param.pad_d = PD;
  119. param.pad_h = PH;
  120. param.pad_w = PW;
  121. param.stride_d = SD;
  122. param.stride_h = SH;
  123. param.stride_w = SW;
  124. auto ICg = IC / group;
  125. auto OCg = OC / group;
  126. checker.set_param(param).exec(
  127. {{group, OCg, ICg, FD, FH, FW},
  128. {N, OC, OD, OH, OW},
  129. {N, IC, ID, IH, IW}});
  130. };
  131. // bug case in prev ver
  132. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 0, 0, 1, 1, 1, 1, 2);
  133. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 0, 0, 1, 1, 1, 2, 2);
  134. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 0, 1, 0, 1, 2, 1, 2);
  135. run(1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 2);
  136. // normal case
  137. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  138. // padded case
  139. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  140. // strided case
  141. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  142. // bigger case
  143. run(2, 32, 64, 64, 64, 3, 3, 3, 32, 62, 62, 62, 0, 0, 0, 1, 1, 1, 4);
  144. }
  145. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_FILTER) {
  146. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD,
  147. size_t FH, size_t FW, size_t OC, size_t OD, size_t OH, size_t OW,
  148. size_t PD, size_t PH, size_t PW, size_t SD, size_t SH, size_t SW,
  149. size_t group) {
  150. Checker<Convolution3DBackwardFilter> checker(handle_cuda());
  151. Convolution3DBackwardFilter::Param param;
  152. param.sparse = Convolution3D::Param::Sparse::GROUP;
  153. param.pad_d = PD;
  154. param.pad_h = PH;
  155. param.pad_w = PW;
  156. param.stride_d = SD;
  157. param.stride_h = SH;
  158. param.stride_w = SW;
  159. auto ICg = IC / group;
  160. auto OCg = OC / group;
  161. checker.set_param(param).exec(
  162. {{N, IC, ID, IH, IW},
  163. {N, OC, OD, OH, OW},
  164. {group, OCg, ICg, FD, FH, FW}});
  165. };
  166. // normal case
  167. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  168. // padded case
  169. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  170. // strided case
  171. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  172. }
  173. TEST_F(CUDA, GROUP_CONVOLUTION3D_BACKWARD_FILTER_CUDNN) {
  174. auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD,
  175. size_t FH, size_t FW, size_t OC, size_t OD, size_t OH, size_t OW,
  176. size_t PD, size_t PH, size_t PW, size_t SD, size_t SH, size_t SW,
  177. size_t group) {
  178. Checker<Convolution3DBackwardFilter> checker(handle_cuda());
  179. checker.set_before_exec_callback(
  180. AlgoChecker<Convolution3DBackwardFilter>(ExecutionPolicyAlgoName{
  181. "CUDA:GROUP_CONV3D_BACKWARD_FILTER", {{"CUDNN", {}}}}));
  182. Convolution3DBackwardFilter::Param param;
  183. param.sparse = Convolution3D::Param::Sparse::GROUP;
  184. param.pad_d = PD;
  185. param.pad_h = PH;
  186. param.pad_w = PW;
  187. param.stride_d = SD;
  188. param.stride_h = SH;
  189. param.stride_w = SW;
  190. auto ICg = IC / group;
  191. auto OCg = OC / group;
  192. checker.set_param(param).exec(
  193. {{N, IC, ID, IH, IW},
  194. {N, OC, OD, OH, OW},
  195. {group, OCg, ICg, FD, FH, FW}});
  196. };
  197. // normal case
  198. run(2, 64, 7, 7, 7, 3, 3, 3, 32, 5, 5, 5, 0, 0, 0, 1, 1, 1, 2);
  199. // padded case
  200. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 7, 7, 7, 1, 1, 1, 1, 1, 1, 4);
  201. // strided case
  202. run(2, 32, 7, 7, 7, 3, 3, 3, 64, 3, 3, 3, 0, 0, 0, 2, 2, 2, 8);
  203. }
  204. } // namespace test
  205. } // namespace megdnn
  206. // vim: syntax=cpp.doxygen