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.

conv_v8.cpp 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #include "megdnn/dtype.h"
  2. #include "test/cuda/fixture.h"
  3. #include "megdnn/opr_param_defs.h"
  4. #include "megdnn/oprs.h"
  5. #include "src/cuda/handle.h"
  6. #include "test/common/benchmarker.h"
  7. #include "test/common/checker.h"
  8. #include "test/common/conv_bias.h"
  9. #include "test/common/rng.h"
  10. #include "test/common/tensor.h"
  11. #include "test/common/workspace_wrapper.h"
  12. #include "test/cuda/utils.h"
  13. using namespace megdnn;
  14. using namespace test;
  15. using namespace conv_bias;
  16. #if CUDNN_VERSION >= 8020
  17. TEST_F(CUDA, CONV_V8_FLOAT) {
  18. Checker<ConvBiasForward> checker(handle_cuda());
  19. checker.set_before_exec_callback(
  20. conv_bias::ConvBiasAlgoChecker<ConvBiasForward>(ExecutionPolicyAlgoName{
  21. ConvBiasForward::algo_name<ConvBiasForward::DefaultParam>(
  22. "CUDNN:ConvolutionV8", {})
  23. .c_str()}));
  24. UniformFloatRNG rng(0.f, 1.f);
  25. checker.set_rng(0, &rng)
  26. .set_rng(1, &rng)
  27. .set_rng(2, &rng)
  28. .set_rng(3, &rng)
  29. .set_dtype(0, dtype::Float32())
  30. .set_dtype(1, dtype::Float32())
  31. .set_dtype(2, dtype::Float32())
  32. .set_dtype(3, dtype::Float32());
  33. param::ConvBias param;
  34. param.pad_h = param.pad_w = 1;
  35. param.stride_h = param.stride_w = 1;
  36. param.format = param::ConvBias::Format::NCHW;
  37. param.nonlineMode = param::ConvBias::NonlineMode::RELU;
  38. checker.set_param(param).execs(
  39. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {}, {}});
  40. checker.set_param(param).execs(
  41. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  42. // group
  43. param.sparse = param::ConvBias::Sparse::GROUP;
  44. checker.set_param(param).execs(
  45. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {}, {}});
  46. checker.set_param(param).execs(
  47. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  48. // NHWC
  49. param.format = param::ConvBias::Format::NHWC;
  50. checker.set_param(param).execs(
  51. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {}, {}});
  52. checker.set_param(param).execs(
  53. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {1, 7, 7, 64}, {}});
  54. }
  55. TEST_F(CUDA, CONV_V8_HALF) {
  56. Checker<ConvBiasForward> checker(handle_cuda());
  57. checker.set_before_exec_callback(
  58. conv_bias::ConvBiasAlgoChecker<ConvBiasForward>(ExecutionPolicyAlgoName{
  59. ConvBiasForward::algo_name<ConvBiasForward::DefaultParam>(
  60. "CUDNN:ConvolutionV8", {})
  61. .c_str()}));
  62. UniformFloatRNG rng(0.f, 1.f);
  63. checker.set_rng(0, &rng)
  64. .set_rng(1, &rng)
  65. .set_rng(2, &rng)
  66. .set_rng(3, &rng)
  67. .set_dtype(0, dtype::Float16())
  68. .set_dtype(1, dtype::Float16())
  69. .set_dtype(2, dtype::Float16())
  70. .set_dtype(3, dtype::Float16())
  71. .set_dtype(4, dtype::Float16())
  72. .set_epsilon(5e-2);
  73. param::ConvBias param;
  74. param.pad_h = param.pad_w = 1;
  75. param.stride_h = param.stride_w = 1;
  76. param.format = param::ConvBias::Format::NCHW;
  77. param.nonlineMode = param::ConvBias::NonlineMode::RELU;
  78. param.compute_mode = param::ConvBias::ComputeMode::FLOAT32;
  79. checker.set_param(param).execs(
  80. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {}, {}});
  81. checker.set_param(param).execs(
  82. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  83. // group
  84. param.sparse = param::ConvBias::Sparse::GROUP;
  85. checker.set_param(param).execs(
  86. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {}, {}});
  87. checker.set_param(param).execs(
  88. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  89. // NHWC
  90. param.format = param::ConvBias::Format::NHWC;
  91. checker.set_param(param).execs(
  92. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {}, {}});
  93. checker.set_param(param).execs(
  94. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {1, 7, 7, 64}, {}});
  95. }
  96. TEST_F(CUDA, CONV_BIAS_V8_FLOAT) {
  97. Checker<ConvBiasForward> checker(handle_cuda());
  98. checker.set_before_exec_callback(
  99. conv_bias::ConvBiasAlgoChecker<ConvBiasForward>(ExecutionPolicyAlgoName{
  100. ConvBiasForward::algo_name<ConvBiasForward::DefaultParam>(
  101. "CUDNN:ConvBiasActivationV8", {})
  102. .c_str()}));
  103. UniformFloatRNG rng(0.f, 1.f);
  104. UniformFloatRNG crng(0.f, 0.f);
  105. checker.set_rng(0, &rng)
  106. .set_rng(1, &rng)
  107. .set_rng(2, &rng)
  108. .set_rng(3, &rng)
  109. .set_dtype(0, dtype::Float32())
  110. .set_dtype(1, dtype::Float32())
  111. .set_dtype(2, dtype::Float32())
  112. .set_dtype(3, dtype::Float32());
  113. param::ConvBias param;
  114. param.pad_h = param.pad_w = 1;
  115. param.stride_h = param.stride_w = 1;
  116. param.format = param::ConvBias::Format::NCHW;
  117. param.nonlineMode = param::ConvBias::NonlineMode::RELU;
  118. checker.set_param(param).execs(
  119. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {}, {}});
  120. checker.set_param(param).execs(
  121. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  122. // group
  123. param.sparse = param::ConvBias::Sparse::GROUP;
  124. checker.set_param(param).execs(
  125. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {}, {}});
  126. checker.set_param(param).execs(
  127. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  128. // NHWC
  129. param.format = param::ConvBias::Format::NHWC;
  130. checker.set_param(param).execs(
  131. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {}, {}});
  132. checker.set_param(param).execs(
  133. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {1, 7, 7, 64}, {}});
  134. }
  135. TEST_F(CUDA, CONV_BIAS_V8_HALF) {
  136. Checker<ConvBiasForward> checker(handle_cuda());
  137. checker.set_before_exec_callback(
  138. conv_bias::ConvBiasAlgoChecker<ConvBiasForward>(ExecutionPolicyAlgoName{
  139. ConvBiasForward::algo_name<ConvBiasForward::DefaultParam>(
  140. "CUDNN:ConvBiasActivationV8", {})
  141. .c_str()}));
  142. UniformFloatRNG rng(0.f, 1.f);
  143. checker.set_rng(0, &rng)
  144. .set_rng(1, &rng)
  145. .set_rng(2, &rng)
  146. .set_rng(3, &rng)
  147. .set_dtype(0, dtype::Float16())
  148. .set_dtype(1, dtype::Float16())
  149. .set_dtype(2, dtype::Float16())
  150. .set_dtype(3, dtype::Float16())
  151. .set_dtype(4, dtype::Float16())
  152. .set_epsilon(5e-2);
  153. param::ConvBias param;
  154. param.pad_h = param.pad_w = 1;
  155. param.stride_h = param.stride_w = 1;
  156. param.format = param::ConvBias::Format::NCHW;
  157. param.nonlineMode = param::ConvBias::NonlineMode::RELU;
  158. param.compute_mode = param::ConvBias::ComputeMode::FLOAT32;
  159. checker.set_param(param).execs(
  160. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {}, {}});
  161. checker.set_param(param).execs(
  162. {{1, 64, 7, 7}, {64, 64, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  163. // group
  164. param.sparse = param::ConvBias::Sparse::GROUP;
  165. checker.set_param(param).execs(
  166. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {}, {}});
  167. checker.set_param(param).execs(
  168. {{1, 64, 7, 7}, {8, 8, 8, 3, 3}, {1, 64, 1, 1}, {1, 64, 7, 7}, {}});
  169. // NHWC
  170. param.format = param::ConvBias::Format::NHWC;
  171. checker.set_param(param).execs(
  172. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {}, {}});
  173. checker.set_param(param).execs(
  174. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {1, 7, 7, 64}, {}});
  175. }
  176. TEST_F(CUDA, CONV_BIAS_V8_DP4A) {
  177. Checker<ConvBiasForward> checker(handle_cuda());
  178. checker.set_before_exec_callback(
  179. conv_bias::ConvBiasAlgoChecker<ConvBiasForward>(ExecutionPolicyAlgoName{
  180. ConvBiasForward::algo_name<ConvBiasForward::DefaultParam>(
  181. "CUDNN:ConvBiasActivationV8", {})
  182. .c_str()}));
  183. UniformIntRNG rng{-3, 3};
  184. UniformIntRNG bias_rng{-50, 50};
  185. checker.set_rng(0, &rng)
  186. .set_rng(1, &rng)
  187. .set_rng(2, &bias_rng)
  188. .set_rng(3, &rng)
  189. .set_dtype(0, dtype::QuantizedS8{1.2f})
  190. .set_dtype(1, dtype::QuantizedS8{1.3f})
  191. .set_dtype(2, dtype::QuantizedS32{1.2f * 1.3f})
  192. .set_dtype(3, dtype::QuantizedS8{1.1f})
  193. .set_dtype(4, dtype::QuantizedS8{1.0f})
  194. .set_epsilon(1 + 1e-3);
  195. param::ConvBias param;
  196. param.pad_h = param.pad_w = 1;
  197. param.stride_h = param.stride_w = 1;
  198. param.format = param::ConvBias::Format::NCHW4;
  199. param.nonlineMode = param::ConvBias::NonlineMode::RELU;
  200. checker.set_param(param).execs(
  201. {{1, 16, 7, 7, 4}, {64, 16, 3, 3, 4}, {1, 16, 1, 1, 4}, {}, {}});
  202. checker.set_param(param).execs(
  203. {{1, 16, 7, 7, 4},
  204. {64, 16, 3, 3, 4},
  205. {1, 16, 1, 1, 4},
  206. {1, 16, 7, 7, 4},
  207. {}});
  208. param.nonlineMode = param::ConvBias::NonlineMode::IDENTITY;
  209. checker.set_param(param).execs(
  210. {{1, 16, 7, 7, 4}, {64, 16, 3, 3, 4}, {1, 16, 1, 1, 4}, {}, {}});
  211. checker.set_param(param).execs(
  212. {{1, 16, 7, 7, 4},
  213. {64, 16, 3, 3, 4},
  214. {1, 16, 1, 1, 4},
  215. {1, 16, 7, 7, 4},
  216. {}});
  217. param.format = param::ConvBias::Format::NHWC;
  218. checker.set_param(param).execs(
  219. {{1, 7, 7, 64}, {64, 3, 3, 64}, {1, 1, 1, 64}, {}, {}});
  220. checker.set_param(param).execs(
  221. {{1, 7, 7, 64}, {64, 3, 3, 64}, {1, 1, 1, 64}, {1, 7, 7, 64}, {}});
  222. param.sparse = param::ConvBias::Sparse::GROUP;
  223. checker.set_param(param).execs(
  224. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {}, {}});
  225. checker.set_param(param).execs(
  226. {{1, 7, 7, 64}, {8, 8, 3, 3, 8}, {1, 1, 1, 64}, {1, 7, 7, 64}, {}});
  227. }
  228. TEST_F(CUDA, CONV_BIAS_V8_IMMA) {
  229. Checker<ConvBiasForward> checker(handle_cuda());
  230. checker.set_before_exec_callback(
  231. conv_bias::ConvBiasAlgoChecker<ConvBiasForward>(ExecutionPolicyAlgoName{
  232. ConvBiasForward::algo_name<ConvBiasForward::DefaultParam>(
  233. "CUDNN:ConvBiasActivationV8", {})
  234. .c_str()}));
  235. UniformIntRNG rng{-3, 3};
  236. UniformIntRNG bias_rng{-50, 50};
  237. checker.set_rng(0, &rng)
  238. .set_rng(1, &rng)
  239. .set_rng(2, &bias_rng)
  240. .set_rng(3, &rng)
  241. .set_dtype(0, dtype::QuantizedS8{1.2f})
  242. .set_dtype(1, dtype::QuantizedS8{1.3f})
  243. .set_dtype(2, dtype::QuantizedS32{1.2f * 1.3f})
  244. .set_dtype(3, dtype::QuantizedS8{1.1f})
  245. .set_dtype(4, dtype::QuantizedS8{1.0f})
  246. .set_epsilon(1 + 1e-3);
  247. param::ConvBias param;
  248. param.pad_h = param.pad_w = 1;
  249. param.stride_h = param.stride_w = 1;
  250. param.format = param::ConvBias::Format::NCHW32;
  251. param.nonlineMode = param::ConvBias::NonlineMode::RELU;
  252. checker.set_param(param).execs(
  253. {{1, 2, 7, 7, 32}, {64, 2, 3, 3, 32}, {1, 2, 1, 1, 32}, {}, {}});
  254. checker.set_param(param).execs(
  255. {{1, 2, 7, 7, 32},
  256. {64, 2, 3, 3, 32},
  257. {1, 2, 1, 1, 32},
  258. {1, 2, 7, 7, 32},
  259. {}});
  260. param.nonlineMode = NonlineMode::RELU;
  261. param.stride_h = param.stride_w = 1;
  262. param.pad_h = param.pad_w = 0;
  263. checker.set_param(param).execs(
  264. {{2, 8, 12, 12, 32}, {512, 8, 1, 1, 32}, {1, 16, 1, 1, 32}, {}, {}});
  265. }
  266. #endif
  267. // vim: syntax=cpp.doxygen