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

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