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 23 kB

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