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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  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. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_MK8_FP16) {
  328. using namespace conv_bias;
  329. std::vector<conv_bias::TestArg> args = get_nchw88_conv_bias_args(
  330. {2, 3, 4, 5, 6, 7}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1);
  331. auto args1 = get_nchw88_conv_bias_args(
  332. {2, 3, 4, 5, 6, 7}, QUAN_NLMODE, BR_AND_BIAS_BIASMODE, 2, 3);
  333. args.insert(args.begin(), args1.begin(), args1.begin());
  334. args1 = get_nchw88_conv_bias_args(
  335. {2, 3, 4, 5, 6, 7, 9}, QUAN_NLMODE, BR_AND_BIAS_BIASMODE, 3, 4);
  336. args.insert(args.begin(), args1.begin(), args1.begin());
  337. NormalRNG rng(1);
  338. #define cb(name) \
  339. checker_conv_bias_common( \
  340. args, handle(), &rng, 0.03, dtype::Float16{}, dtype::Float16{}, \
  341. dtype::Float16{}, dtype::Float16{}, name);
  342. #if MEGDNN_AARCH64
  343. cb("IM2COLMATMUL:AARCH64_F16_MK8_16X12X1");
  344. #endif
  345. #undef cb
  346. }
  347. #endif
  348. #if MEGDNN_AARCH64 || MEGDNN_ARMV7
  349. //! enable none dot algo now
  350. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_INT8x8x32NCHW44_S2) {
  351. using namespace conv_bias;
  352. std::vector<conv_bias::TestArg> args = get_nchw44_conv_bias_args(
  353. {2, 5, 7}, ONLY_IDENTITY_NLMODE, BR_AND_NO_BIASMODE, 2, false);
  354. #define cb(name) checker_conv_bias_mul_int8x8x32(args, handle(), name);
  355. #if MEGDNN_AARCH64
  356. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  357. #else
  358. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  359. #endif
  360. #undef cb
  361. }
  362. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_INT8x8x32NCHW44_S1) {
  363. using namespace conv_bias;
  364. std::vector<conv_bias::TestArg> args = get_nchw44_conv_bias_args(
  365. {3, 4, 6}, ONLY_IDENTITY_NLMODE, BR_AND_NO_BIASMODE, 1);
  366. #define cb(name) checker_conv_bias_mul_int8x8x32(args, handle(), name);
  367. #if MEGDNN_AARCH64
  368. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  369. #else
  370. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  371. #endif
  372. #undef cb
  373. }
  374. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44_S2) {
  375. UniformIntRNG rng{-50, 50};
  376. #define cb(name) \
  377. checker_conv_bias_common( \
  378. get_nchw44_conv_bias_args({3, 4, 6}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 2), \
  379. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  380. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  381. dtype::QuantizedS8(60.25f), name);
  382. float epsilon = 0.001;
  383. #if MEGDNN_AARCH64
  384. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  385. #else
  386. epsilon = 1;
  387. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  388. #endif
  389. #undef cb
  390. }
  391. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44_S1) {
  392. UniformIntRNG rng{-50, 50};
  393. #define cb(name) \
  394. checker_conv_bias_common( \
  395. get_nchw44_conv_bias_args({2, 5, 7}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1), \
  396. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  397. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  398. dtype::QuantizedS8(60.25f), name);
  399. float epsilon = 0.001;
  400. #if MEGDNN_AARCH64
  401. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  402. #else
  403. epsilon = 1;
  404. cb("IM2COLMATMUL:ARMV7_INT8X8X32_MK4_4X2X16:96");
  405. #endif
  406. #undef cb
  407. }
  408. #if MEGDNN_AARCH64
  409. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44_FUSE) {
  410. UniformIntRNG rng{-50, 50};
  411. #define cb(name) \
  412. checker_conv_bias_common( \
  413. get_nchw44_conv_bias_args({3}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1), \
  414. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  415. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  416. dtype::QuantizedS8(60.25f), name);
  417. float epsilon = 0.001;
  418. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_4X4X16:96");
  419. #undef cb
  420. }
  421. #endif
  422. #endif
  423. #if MEGDNN_AARCH64
  424. #if MGB_ENABLE_DOT
  425. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_QUANTIZEDSYM_NCHW44DOT_FUSE) {
  426. UniformIntRNG rng{-50, 50};
  427. #define cb(name) \
  428. checker_conv_bias_common( \
  429. get_nchw44_conv_bias_args( \
  430. {3}, QUAN_NLMODE, BR_AND_NO_BIASMODE, 1, false, false, true), \
  431. handle(), &rng, epsilon, dtype::QuantizedS8(2.5f), \
  432. dtype::QuantizedS8(2.5f), dtype::QuantizedS32(6.25f), \
  433. dtype::QuantizedS8(60.25f), name);
  434. float epsilon = 0.001;
  435. cb("IM2COLMATMUL:AARCH64_INT8X8X32_MK4_8X12X4_DOTPROD:96");
  436. #undef cb
  437. }
  438. #endif
  439. #endif
  440. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COLMATMUL_INT8x8x32) {
  441. using namespace conv_bias;
  442. std::vector<conv_bias::TestArg> args =
  443. get_conv_bias_args({2, 3, 4, 5, 6, 7}, 1, false, true, true);
  444. std::vector<conv_bias::TestArg> args1 =
  445. get_conv_bias_args({1}, 2, false, true, true);
  446. args.insert(args.begin(), args1.begin(), args1.end());
  447. #define cb(name) checker_conv_bias_mul_int8x8x32(args, handle(), name);
  448. #if MEGDNN_AARCH64
  449. #if MGB_ENABLE_DOT
  450. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K8X12X4_DOTPROD");
  451. #else
  452. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K8X8X8");
  453. cb("IM2COLMATMUL:AARCH64_INT8X8X32_K4X4X16");
  454. #endif
  455. #elif MEGDNN_ARMV7
  456. #if MGB_ENABLE_DOT
  457. cb("IM2COLMATMUL:AARCH32_INT8_K6X8X4");
  458. #endif
  459. cb("IM2COLMATMUL:ARMV7_INT8X8X32_K4X8X8");
  460. #endif
  461. #if MEGDNN_ARMV7
  462. cb("IM2COLMATMUL:ARMV7_INT8X8X32_K4X2X16");
  463. #endif
  464. #undef cb
  465. }
  466. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_S1_MK4_PACK_F32) {
  467. using namespace conv_bias;
  468. std::vector<conv_bias::TestArg> args =
  469. get_nchw44_conv_bias_args({2, 4, 7}, FULL_NLMODE, BR_AND_BIAS_BIASMODE, 1);
  470. #if MEGDNN_AARCH64
  471. check_conv_bias(args, handle(), "IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  472. #elif MEGDNN_ARMV7
  473. check_conv_bias(args, handle(), "IM2COLMATMUL:ARMV7_F32_MK4_PACK_4X12");
  474. #endif
  475. }
  476. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_S2_MK4_PACK_F32) {
  477. using namespace conv_bias;
  478. std::vector<conv_bias::TestArg> args =
  479. get_nchw44_conv_bias_args({3, 5, 6}, FULL_NLMODE, BR_AND_BIAS_BIASMODE, 2);
  480. #define cb(name) check_conv_bias(args, handle(), name);
  481. #if MEGDNN_AARCH64
  482. cb("IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  483. #elif MEGDNN_ARMV7
  484. cb("IM2COLMATMUL:ARMV7_F32_MK4_PACK_4X12");
  485. #endif
  486. #undef cb
  487. }
  488. TEST_F(ARM_COMMON_MULTI_THREADS, CONV_BIAS_IM2COL_S2_MK4_PACK_F32_FUSE) {
  489. using namespace conv_bias;
  490. std::vector<conv_bias::TestArg> args =
  491. get_nchw44_conv_bias_args({3}, FULL_NLMODE, ALL_BIASMODE, 2);
  492. #define cb(name) check_conv_bias(args, handle(), name);
  493. #if MEGDNN_AARCH64
  494. cb("IM2COLMATMUL:AARCH64_F32_MK4_K8X12X1");
  495. #elif MEGDNN_ARMV7
  496. cb("IM2COLMATMUL:ARMV7_F32_MK4_PACK_4X12");
  497. #endif
  498. #undef cb
  499. }
  500. // vim: syntax=cpp.doxygen