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

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

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台