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_bias_multi_thread_im2col.cpp 24 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. /**
  2. * \file dnn/test/arm_common/conv_bias_multi_thread_im2col.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
  10. * implied.
  11. */
  12. #include "megdnn/dtype.h"
  13. #include "test/arm_common/fixture.h"
  14. #include "test/common/benchmarker.h"
  15. #include "test/common/conv_bias.h"
  16. #include "test/arm_common/cpuinfo_help.h"
  17. using namespace megdnn;
  18. using namespace test;
  19. using namespace conv_bias;
  20. TEST_F(ARM_COMMON_MULTI_THREADS, CONVBIAS_IM2COL_FP32_STRIDE2) {
  21. #define cb(name) \
  22. check_conv_bias( \
  23. get_conv_bias_args({1, 2, 3, 4, 5, 6, 7}, 2, false, false, false), \
  24. handle(), name);
  25. #if MEGDNN_AARCH64
  26. cb("IM2COLMATMUL:AARCH64_F32K8X12X1") cb("IM2COLMATMUL:AARCH64_F32K4X16X1")
  27. cb("IM2COLMATMUL:FB_F32_K8X12X1")
  28. #elif MEGDNN_ARMV7
  29. cb("IM2COLMATMUL:ARMV7_F32")
  30. #endif
  31. #undef cb
  32. }
  33. TEST_F(ARM_COMMON_MULTI_THREADS, CONVBIAS_IM2COL_FP32_STRIDE1) {
  34. #define cb(name) \
  35. check_conv_bias( \
  36. get_conv_bias_args({2, 3, 4, 5, 6, 7}, 1, false, false, false), handle(), \
  37. name);
  38. #if MEGDNN_AARCH64
  39. cb("IM2COLMATMUL:AARCH64_F32K8X12X1") cb("IM2COLMATMUL:AARCH64_F32K4X16X1")
  40. cb("IM2COLMATMUL:FB_F32_K8X12X1")
  41. #elif MEGDNN_ARMV7
  42. cb("IM2COLMATMUL:ARMV7_F32") cb("IM2COLMATMUL:FB_F32_K8X12X1")
  43. #endif
  44. #undef cb
  45. }
  46. //! CPUINFO ralated test
  47. #if MEGDNN_AARCH64
  48. #if MGB_ENABLE_CPUINFO
  49. TEST_F(ARM_COMMON_MULTI_THREADS, CONVBIAS_IM2COL_FP32_A55) {
  50. CpuInfoTmpReplace cpu_replace_guard(cpuinfo_uarch_cortex_a55);
  51. #define cb(name, stride) \
  52. check_conv_bias( \
  53. get_conv_bias_args({2, 3, 4, 5, 6, 7}, stride, false, false, false), \
  54. handle(), name);
  55. cb("IM2COLMATMUL:AARCH64_F32K8X12X1", 1) cb("IM2COLMATMUL:AARCH64_F32K8X12X1", 2)
  56. #undef cb
  57. }
  58. #endif
  59. #endif
  60. #if MEGDNN_AARCH64
  61. #if MGB_ENABLE_CPUINFO
  62. TEST_F(ARM_COMMON_MULTI_THREADS, CONVBIAS_IM2COL_FP32_A53) {
  63. CpuInfoTmpReplace cpu_replace_guard(cpuinfo_uarch_cortex_a53);
  64. #define cb(name, stride) \
  65. check_conv_bias( \
  66. get_conv_bias_args({2, 3, 4, 5, 6, 7}, stride, false, false, false), \
  67. handle(), name);
  68. cb("IM2COLMATMUL:AARCH64_F32K8X12X1", 1) cb("IM2COLMATMUL:AARCH64_F32K8X12X1", 2)
  69. #undef cb
  70. }
  71. #endif
  72. #endif
  73. #if MEGDNN_AARCH64
  74. #if MGB_ENABLE_CPUINFO
  75. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_MK4_PACK_F32_A55) {
  76. CpuInfoTmpReplace cpu_replace_guard(cpuinfo_uarch_cortex_a55);
  77. using namespace conv_bias;
  78. std::vector<conv_bias::TestArg> args =
  79. get_nchw44_conv_bias_args({2, 3, 7}, FULL_NLMODE, ONLY_NO_BIASMODE, 1);
  80. check_conv_bias(args, handle(), "IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  81. args = get_nchw44_conv_bias_args({2, 3, 7}, FULL_NLMODE, ONLY_NO_BIASMODE, 2);
  82. check_conv_bias(args, handle(), "IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  83. }
  84. #endif
  85. #endif
  86. #if MEGDNN_AARCH64
  87. #if MGB_ENABLE_CPUINFO
  88. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_MK4_PACK_F32_A53) {
  89. CpuInfoTmpReplace cpu_replace_guard(cpuinfo_uarch_cortex_a53);
  90. using namespace conv_bias;
  91. std::vector<conv_bias::TestArg> args =
  92. get_nchw44_conv_bias_args({2, 3, 7}, FULL_NLMODE, ONLY_NO_BIASMODE, 1);
  93. check_conv_bias(args, handle(), "IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  94. args = get_nchw44_conv_bias_args({2, 3, 7}, FULL_NLMODE, ONLY_NO_BIASMODE, 2);
  95. check_conv_bias(args, handle(), "IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  96. }
  97. #endif
  98. #endif
  99. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM) {
  100. UniformIntRNG rng{-50, 50};
  101. #define cb(name) \
  102. checker_conv_bias_common( \
  103. get_conv_bias_args( \
  104. {2, 3, 4, 5, 6, 7}, 1, false, false, false, true, true), \
  105. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  106. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  107. dtype::QuantizedS8(60.25f), name); \
  108. checker_conv_bias_common( \
  109. get_conv_bias_args({1}, 2, false, false, false, true, true), handle(), \
  110. &rng, epsilon, dtype::QuantizedS8(2.5f), dtype::QuantizedS8(2.5f), \
  111. dtype::QuantizedS32(6.25f), dtype::QuantizedS8(60.25f), name);
  112. float epsilon = 0.001;
  113. #if MEGDNN_AARCH64
  114. #if MGB_ENABLE_DOT
  115. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K8X12X4_DOTPROD");
  116. #else
  117. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K8X8X8");
  118. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K4X4X16");
  119. #endif
  120. #elif MEGDNN_ARMV7
  121. epsilon = 1;
  122. cb("IM2COLMATMUL:ARMV7_INT8X8X32_K4X8X8");
  123. #endif
  124. #undef cb
  125. }
  126. #if MGB_ENABLE_DOT
  127. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_MK4_DOT) {
  128. UniformIntRNG rng{-50, 50};
  129. #define cb(name) \
  130. checker_conv_bias_common( \
  131. get_nchw44_conv_bias_args( \
  132. {2, 3, 4, 5, 6, 7}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1, false, \
  133. false, true), \
  134. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  135. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  136. dtype::QuantizedS8(60.25f), name); \
  137. checker_conv_bias_common( \
  138. get_nchw44_conv_bias_args( \
  139. {1}, ONLY_IDENTITY_NLMODE, ONLY_BR_BIASMODE, 2, false, false, \
  140. true), \
  141. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  142. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  143. dtype::QuantizedS8(60.25f), name);
  144. float epsilon = 0.001;
  145. #if MEGDNN_AARCH64
  146. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_8X12X4_DOTPROD:96");
  147. #elif MEGDNN_ARMV7
  148. epsilon = 1;
  149. cb("IM2COLMATMUL:AARCH32_INT8_MK4_8X4X4_DOTPROD:96");
  150. #endif
  151. #undef cb
  152. }
  153. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_MK4_DOT_S2_FUSE) {
  154. UniformIntRNG rng{-50, 50};
  155. #define cb(name) \
  156. checker_conv_bias_common( \
  157. get_nchw44_conv_bias_args( \
  158. {3}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 2, false, false, true), \
  159. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  160. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  161. dtype::QuantizedS8(60.25f), name);
  162. float epsilon = 0.001;
  163. #if MEGDNN_AARCH64
  164. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_8X12X4_DOTPROD:96");
  165. #elif MEGDNN_ARMV7
  166. epsilon = 1;
  167. cb("IM2COLMATMUL:AARCH32_INT8_MK4_8X4X4_DOTPROD:96");
  168. #endif
  169. #undef cb
  170. }
  171. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_S8x8x32_MK4_DOT) {
  172. UniformIntRNG rng{-50, 50};
  173. #define cb(name) \
  174. checker_conv_bias_common( \
  175. get_nchw44_conv_bias_args( \
  176. {2, 3, 4, 5, 6, 7}, ONLY_IDENTITY_NLMODE, BR_AND_BIAS_BIASMODE, 1, \
  177. false, false, true), \
  178. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  179. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), {}, name); \
  180. checker_conv_bias_common( \
  181. get_nchw44_conv_bias_args( \
  182. {1}, ONLY_IDENTITY_NLMODE, BR_AND_BIAS_BIASMODE, 2, false, false, \
  183. true), \
  184. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  185. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), {}, name);
  186. float epsilon = 0.001;
  187. #if MEGDNN_AARCH64
  188. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_8X12X4_DOTPROD:96");
  189. #elif MEGDNN_ARMV7
  190. cb("IM2COLMATMUL:AARCH32_INT8_MK4_8X4X4_DOTPROD:96");
  191. #endif
  192. #undef cb
  193. }
  194. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_INT8x8x32_MK4_DOT) {
  195. UniformIntRNG rng{-50, 50};
  196. #define cb(name) \
  197. checker_conv_bias_common( \
  198. get_nchw44_conv_bias_args( \
  199. {2, 3, 4, 5, 6, 7}, ONLY_IDENTITY_NLMODE, BR_AND_NO_BIASMODE, 1, \
  200. false, false, true), \
  201. handle(), &rng, epsilon, dtype::Int8(), dtype::Int8(), dtype::Int32(), {}, \
  202. name); \
  203. checker_conv_bias_common( \
  204. get_nchw44_conv_bias_args( \
  205. {1}, ONLY_IDENTITY_NLMODE, BR_AND_BIAS_BIASMODE, 2, false, false, \
  206. true), \
  207. handle(), &rng, epsilon, dtype::Int8(), dtype::Int8(), dtype::Int32(), {}, \
  208. name);
  209. float epsilon = 0.001;
  210. #if MEGDNN_AARCH64
  211. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_8X12X4_DOTPROD:96");
  212. #elif MEGDNN_ARMV7
  213. cb("IM2COLMATMUL:AARCH32_INT8_MK4_8X4X4_DOTPROD:96");
  214. #endif
  215. #undef cb
  216. }
  217. #endif
  218. // clang-format on
  219. #if MEGDNN_AARCH64 || MEGDNN_ARMV7
  220. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDASYM) {
  221. NormalRNG rng(128.f);
  222. #define cb(name) \
  223. checker_conv_bias_common( \
  224. get_conv_bias_args( \
  225. {2, 3, 4, 5, 6, 7}, 1, false, false, false, true, true), \
  226. handle(), &rng, epsilon, dtype::Quantized8Asymm(1.2f, (uint8_t)125), \
  227. dtype::Quantized8Asymm(1.3f, (uint8_t)129), \
  228. dtype::QuantizedS32(1.2 * 1.3), \
  229. dtype::Quantized8Asymm(50.3f, (uint8_t)120), name); \
  230. checker_conv_bias_common( \
  231. get_conv_bias_args({1}, 2, false, false, false, true, true), handle(), \
  232. &rng, epsilon, dtype::Quantized8Asymm(1.2f, (uint8_t)125), \
  233. dtype::Quantized8Asymm(1.3f, (uint8_t)129), \
  234. dtype::QuantizedS32(1.2 * 1.3), \
  235. dtype::Quantized8Asymm(50.3f, (uint8_t)120), name);
  236. float epsilon = 0.001;
  237. #if MEGDNN_AARCH64
  238. #if MGB_ENABLE_DOT
  239. cb("IM2COLMATMUL:AARCH64_QUINT8_K8X8X4_DOTPROD");
  240. #else
  241. cb("IM2COLMATMUL:AARCH64_QUINT8_K8X8X8");
  242. #endif
  243. #elif MEGDNN_ARMV7
  244. epsilon = 1;
  245. cb("IM2COLMATMUL:ARMV7_QUINT8_K4X8X8");
  246. #endif
  247. #undef cb
  248. }
  249. #endif
  250. #if MEGDNN_AARCH64 || MEGDNN_ARMV7
  251. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUINT8x8x32) {
  252. UniformIntRNG rng{-50, 50};
  253. float epsilon = 0.001;
  254. #define cb(name) \
  255. checker_conv_bias_common( \
  256. get_conv_bias_args( \
  257. {2, 3, 4, 5, 6, 7}, 1, false, false, true, true, false), \
  258. handle(), &rng, epsilon, dtype::Quantized8Asymm(1.2f, (uint8_t)125), \
  259. dtype::Quantized8Asymm(1.3f, (uint8_t)129), \
  260. dtype::QuantizedS32(1.2 * 1.3), {}, name); \
  261. checker_conv_bias_common( \
  262. get_conv_bias_args({1}, 2, false, false, true, true, false), handle(), \
  263. &rng, epsilon, dtype::Quantized8Asymm(1.2f, (uint8_t)125), \
  264. dtype::Quantized8Asymm(1.3f, (uint8_t)129), \
  265. dtype::QuantizedS32(1.2 * 1.3), {}, name);
  266. #if MEGDNN_AARCH64
  267. #if MGB_ENABLE_DOT
  268. cb("IM2COLMATMUL:AARCH64_QUINT8_K8X8X4_DOTPROD");
  269. #else
  270. cb("IM2COLMATMUL:AARCH64_QUINT8_K8X8X8");
  271. #endif
  272. #elif MEGDNN_ARMV7
  273. #if MGB_ENABLE_DOT
  274. cb("IM2COLMATMUL:AARCH32_QUINT8_K4X8X4");
  275. #endif
  276. cb("IM2COLMATMUL:ARMV7_QUINT8_K4X8X8");
  277. #endif
  278. #undef cb
  279. }
  280. TEST_F(ARM_COMMON_MULTI_THREADS, CONVBIAS_IM2COLMATMUL_INT8x8x16) {
  281. UniformIntRNG rng{-50, 50};
  282. float epsilon = 0.001;
  283. std::vector<conv_bias::TestArg> args_nchw44 = get_nchw44_conv_bias_args(
  284. {2, 3, 4, 5, 6, 7}, ONLY_IDENTITY_NLMODE, BR_AND_BIAS_BIASMODE, 1, true);
  285. std::vector<conv_bias::TestArg> args_nchw44_1x1s2 = get_nchw44_conv_bias_args(
  286. {1}, ONLY_IDENTITY_NLMODE, BR_AND_BIAS_BIASMODE, 2, true);
  287. #define cb(name) \
  288. checker_conv_bias_common( \
  289. get_conv_bias_args({2, 3, 4, 5, 6, 7}, 1, false, false, true), handle(), \
  290. &rng, epsilon, dtype::Int8{}, dtype::Int8{}, dtype::Int16{}, \
  291. dtype::Int16{}, name); \
  292. checker_conv_bias_common( \
  293. get_conv_bias_args({1}, 2, false, false, true), handle(), &rng, epsilon, \
  294. dtype::Int8{}, dtype::Int8{}, dtype::Int16{}, dtype::Int16{}, name);
  295. #define cb_nchw44(name) \
  296. checker_conv_bias_common( \
  297. args_nchw44, handle(), &rng, epsilon, dtype::Int8{}, dtype::Int8{}, \
  298. dtype::Int16{}, dtype::Int16{}, name); \
  299. checker_conv_bias_common( \
  300. args_nchw44_1x1s2, handle(), &rng, epsilon, dtype::Int8{}, dtype::Int8{}, \
  301. dtype::Int16{}, dtype::Int16{}, name);
  302. #if MEGDNN_AARCH64
  303. cb("IM2COLMATMUL:AARCH64_INT8X8X16_K8X8X8");
  304. cb("IM2COLMATMUL:AARCH64_INT8X8X16_K4X4X16");
  305. cb_nchw44("IM2COLMATMUL:AARCH64_INT8X8X16_MK4_4X4X8");
  306. cb_nchw44("IM2COLMATMUL:AARCH64_INT8X8X16_MK4_16X12X4");
  307. #elif MEGDNN_ARMV7
  308. cb("IM2COLMATMUL:ARMV7_INT8X8X16_K4X8X8");
  309. cb("IM2COLMATMUL:ARMV7_INT8X8X16_K4X2X16");
  310. cb_nchw44("IM2COLMATMUL:ARMV7_INT8X8X16_MK4_K8X8X4");
  311. #endif
  312. cb("IM2COLMATMUL:ARM_COMMON_INT8X8X16");
  313. #undef cb
  314. #undef cb_nchw44
  315. }
  316. #endif
  317. #if __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
  318. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_FP16) {
  319. using namespace conv_bias;
  320. param::ConvBias cur_param;
  321. std::vector<conv_bias::TestArg> args =
  322. get_conv_bias_args({2, 3, 4, 5, 6, 7}, 1, false, false, false);
  323. std::vector<conv_bias::TestArg> args1 =
  324. get_conv_bias_args({1}, 2, false, false, false);
  325. args.insert(args.begin(), args1.begin(), args1.end());
  326. NormalRNG rng(1);
  327. #define cb(name) \
  328. checker_conv_bias_common( \
  329. args, handle(), &rng, 0.03, dtype::Float16{}, dtype::Float16{}, \
  330. dtype::Float16{}, dtype::Float16{}, name);
  331. #if MEGDNN_AARCH64
  332. cb("IM2COLMATMUL:AARCH64_F16_K8X24X1");
  333. #elif MEGDNN_ARMV7
  334. cb("IM2COLMATMUL:AARCH32_F16_K4X16X1");
  335. #endif
  336. #undef cb
  337. }
  338. #endif
  339. #if MEGDNN_AARCH64 || MEGDNN_ARMV7
  340. //! enable none dot algo now
  341. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_INT8x8x32NCHW44_S2) {
  342. using namespace conv_bias;
  343. std::vector<conv_bias::TestArg> args = get_nchw44_conv_bias_args(
  344. {2, 5, 7}, ONLY_IDENTITY_NLMODE, BR_AND_NO_BIASMODE, 2, false);
  345. #define cb(name) checker_conv_bias_mul_int8x8x32(args, handle(), name);
  346. #if MEGDNN_AARCH64
  347. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  348. #else
  349. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  350. #endif
  351. #undef cb
  352. }
  353. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_INT8x8x32NCHW44_S1) {
  354. using namespace conv_bias;
  355. std::vector<conv_bias::TestArg> args = get_nchw44_conv_bias_args(
  356. {3, 4, 6}, ONLY_IDENTITY_NLMODE, BR_AND_NO_BIASMODE, 1);
  357. #define cb(name) checker_conv_bias_mul_int8x8x32(args, handle(), name);
  358. #if MEGDNN_AARCH64
  359. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  360. #else
  361. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  362. #endif
  363. #undef cb
  364. }
  365. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44_S2) {
  366. UniformIntRNG rng{-50, 50};
  367. #define cb(name) \
  368. checker_conv_bias_common( \
  369. get_nchw44_conv_bias_args({3, 4, 6}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 2), \
  370. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  371. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  372. dtype::QuantizedS8(60.25f), name);
  373. float epsilon = 0.001;
  374. #if MEGDNN_AARCH64
  375. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  376. #else
  377. epsilon = 1;
  378. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  379. #endif
  380. #undef cb
  381. }
  382. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44_S1) {
  383. UniformIntRNG rng{-50, 50};
  384. #define cb(name) \
  385. checker_conv_bias_common( \
  386. get_nchw44_conv_bias_args({2, 5, 7}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1), \
  387. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  388. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  389. dtype::QuantizedS8(60.25f), name);
  390. float epsilon = 0.001;
  391. #if MEGDNN_AARCH64
  392. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  393. #else
  394. epsilon = 1;
  395. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  396. #endif
  397. #undef cb
  398. }
  399. #if MEGDNN_AARCH64
  400. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44_FUSE) {
  401. UniformIntRNG rng{-50, 50};
  402. #define cb(name) \
  403. checker_conv_bias_common( \
  404. get_nchw44_conv_bias_args({3}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1), \
  405. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  406. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  407. dtype::QuantizedS8(60.25f), name);
  408. float epsilon = 0.001;
  409. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  410. #undef cb
  411. }
  412. #endif
  413. #endif
  414. #if MEGDNN_AARCH64
  415. #if MGB_ENABLE_DOT
  416. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44DOT_FUSE) {
  417. UniformIntRNG rng{-50, 50};
  418. #define cb(name) \
  419. checker_conv_bias_common( \
  420. get_nchw44_conv_bias_args( \
  421. {3}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1, false, false, true), \
  422. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  423. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  424. dtype::QuantizedS8(60.25f), name);
  425. float epsilon = 0.001;
  426. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_8X12X4_DOTPROD:96");
  427. #undef cb
  428. }
  429. #endif
  430. #endif
  431. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_INT8x8x32) {
  432. using namespace conv_bias;
  433. std::vector<conv_bias::TestArg> args =
  434. get_conv_bias_args({2, 3, 4, 5, 6, 7}, 1, false, true, true);
  435. std::vector<conv_bias::TestArg> args1 =
  436. get_conv_bias_args({1}, 2, false, true, true);
  437. args.insert(args.begin(), args1.begin(), args1.end());
  438. #define cb(name) checker_conv_bias_mul_int8x8x32(args, handle(), name);
  439. #if MEGDNN_AARCH64
  440. #if MGB_ENABLE_DOT
  441. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K8X12X4_DOTPROD");
  442. #else
  443. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K8X8X8");
  444. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K4X4X16");
  445. #endif
  446. #elif MEGDNN_ARMV7
  447. #if MGB_ENABLE_DOT
  448. cb("IM2COLMATMUL:AARCH32_INT8_K6X8X4");
  449. #endif
  450. cb("IM2COLMATMUL:ARMV7_INT8X8X32_K4X8X8");
  451. #endif
  452. #if MEGDNN_ARMV7
  453. cb("IM2COLMATMUL:ARMV7_INT8X8X32_K4X2X16");
  454. #endif
  455. #undef cb
  456. }
  457. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_S1_MK4_PACK_F32) {
  458. using namespace conv_bias;
  459. std::vector<conv_bias::TestArg> args =
  460. get_nchw44_conv_bias_args({2, 4, 7}, FULL_NLMODE, BR_AND_BIAS_BIASMODE, 1);
  461. #if MEGDNN_AARCH64
  462. check_conv_bias(args, handle(), "IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  463. #elif MEGDNN_ARMV7
  464. check_conv_bias(args, handle(), "IM2COLMATMUL:ARMV7_F32_MK4_PACK_4X12");
  465. #endif
  466. }
  467. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_S2_MK4_PACK_F32) {
  468. using namespace conv_bias;
  469. std::vector<conv_bias::TestArg> args =
  470. get_nchw44_conv_bias_args({3, 5, 6}, FULL_NLMODE, BR_AND_BIAS_BIASMODE, 2);
  471. #define cb(name) check_conv_bias(args, handle(), name);
  472. #if MEGDNN_AARCH64
  473. cb("IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  474. #elif MEGDNN_ARMV7
  475. cb("IM2COLMATMUL:ARMV7_F32_MK4_PACK_4X12");
  476. #endif
  477. #undef cb
  478. }
  479. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_S2_MK4_PACK_F32_FUSE) {
  480. using namespace conv_bias;
  481. std::vector<conv_bias::TestArg> args =
  482. get_nchw44_conv_bias_args({3}, FULL_NLMODE, ALL_BIASMODE, 2);
  483. #define cb(name) check_conv_bias(args, handle(), name);
  484. #if MEGDNN_AARCH64
  485. cb("IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  486. #elif MEGDNN_ARMV7
  487. cb("IM2COLMATMUL:ARMV7_F32_MK4_PACK_4X12");
  488. #endif
  489. #undef cb
  490. }
  491. // vim: syntax=cpp.doxygen