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.

convolution3d.cpp 17 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. /**
  2. * \file dnn/test/common/convolution3d.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 implied.
  10. */
  11. #include "test/common/checker.h"
  12. #include "test/common/convolution3d.h"
  13. #include <chrono>
  14. #include <unordered_set>
  15. #include <sstream>
  16. using namespace megdnn;
  17. using namespace test;
  18. using namespace convolution3d;
  19. std::vector<TestArg> convolution3d::get_1x1x1_args() {
  20. std::vector<TestArg> args;
  21. param::Convolution3D param;
  22. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  23. // clang-format off
  24. for (size_t batch_size: {4, 8})
  25. for (size_t ic: {1, 4, 8})
  26. for (size_t oc: {ic})
  27. for (size_t id: {4, 16, 64})
  28. for (size_t ih : {id})
  29. for (size_t iw : {id}) {
  30. args.emplace_back(param, TensorShape{batch_size, ic, id, ih, iw},
  31. TensorShape{oc, ic, 1, 1, 1});
  32. }
  33. // clang-format on
  34. return args;
  35. }
  36. #if MEGDNN_WITH_BENCHMARK
  37. std::vector<TestArg> convolution3d::get_speed_test_args() {
  38. std::vector<TestArg> args;
  39. std::vector<std::pair<size_t, size_t>> range;
  40. range.push_back(std::pair<size_t, size_t> (10, 16));
  41. // clang-format off
  42. for (size_t n: {64})
  43. for (size_t id: {18, 32, 64})
  44. for (size_t ih: {id})
  45. for (size_t iw: {18, 64, 128})
  46. for (size_t oc: {16, 64})
  47. for (size_t ic: {oc})
  48. for (size_t fd: {1, 2, 3})
  49. for (size_t fh: {fd})
  50. for (size_t fw: {fh})
  51. for (size_t pd: {0, 1})
  52. for (size_t sd: {1, 2, 3})
  53. for (size_t dd: {1, 3})
  54. for (size_t cw: {false})
  55. for (bool xcorr: {false, true}) {
  56. param::Convolution3D param;
  57. param.mode = xcorr ? param::Convolution3D::Mode::CROSS_CORRELATION
  58. : param::Convolution3D::Mode::CONVOLUTION;
  59. param.stride_d = param.stride_h = param.stride_w = sd;
  60. param.pad_d = param.pad_h = param.pad_w = pd;
  61. param.dilate_d = param.dilate_h = param.dilate_w = dd;
  62. if (cw)
  63. param.sparse = param::Convolution3D::Sparse::GROUP;
  64. args.emplace_back(param, TensorShape{n, ic, id, ih, iw},
  65. !cw ? TensorShape{oc, ic, fd, fh, fw}
  66. : TensorShape{ic, oc, 1, fd, fh, fw});
  67. }
  68. // clang-format on
  69. return args;
  70. }
  71. #endif
  72. std::vector<TestArg> convolution3d::get_args() {
  73. std::vector<TestArg> args;
  74. std::vector<std::pair<size_t, size_t>> range;
  75. range.push_back(std::pair<size_t, size_t> (11, 13));
  76. // clang-format off
  77. #if 1
  78. for (size_t n: {4})
  79. for (size_t id: {12, 16})
  80. for (size_t ih: {id})
  81. for (size_t iw: {16})
  82. for (size_t ic: {5, 10})
  83. for (size_t oc: {ic})
  84. for (size_t fd: {1,2,3})
  85. for (size_t fh: {fd})
  86. for (size_t fw: {fh})
  87. for (size_t pd: {0, 4})
  88. for (size_t sd: {2})
  89. #if CUDNN_MAJOR >= 6
  90. for (size_t dd: {1, 3, 4})
  91. #else
  92. for (size_t dd: {1})
  93. #endif
  94. for (size_t cw: {false})
  95. for (bool xcorr: {false, true}) {
  96. param::Convolution3D param;
  97. param.mode = xcorr ? param::Convolution3D::Mode::CROSS_CORRELATION
  98. : param::Convolution3D::Mode::CONVOLUTION;
  99. param.stride_d = param.stride_h = param.stride_w = sd;
  100. param.pad_d = param.pad_h = param.pad_w = pd;
  101. param.dilate_d = param.dilate_h = param.dilate_w = dd;
  102. if (cw)
  103. param.sparse = param::Convolution3D::Sparse::GROUP;
  104. args.emplace_back(param, TensorShape{n, ic, id, ih, iw},
  105. !cw ? TensorShape{oc, ic, fd, fh, fw}
  106. : TensorShape{ic, oc, 1, fd, fh, fw});
  107. }
  108. return args;
  109. #endif
  110. // clang-format on
  111. // clang-format off
  112. for (size_t n: {8})
  113. for (size_t id: {20})
  114. for (size_t ih: {id})
  115. for (size_t iw: {id})
  116. for (size_t ic: {1})
  117. for (size_t oc: {ic})
  118. for (size_t fd: {3})
  119. for (size_t fh: {fd})
  120. for (size_t fw: {fh})
  121. for (size_t pd: {1, 2, 3})
  122. for (size_t sd: {2})
  123. for (size_t dd: {1, 2})
  124. for (size_t cw: {false})
  125. for (bool xcorr: {false, true}) {
  126. param::Convolution3D param;
  127. param.mode = xcorr ? param::Convolution3D::Mode::CROSS_CORRELATION
  128. : param::Convolution3D::Mode::CONVOLUTION;
  129. param.stride_d = param.stride_h = param.stride_w = sd;
  130. param.pad_d = param.pad_h = param.pad_w = pd;
  131. param.dilate_d = param.dilate_h = param.dilate_w = dd;
  132. if (cw)
  133. param.sparse = param::Convolution3D::Sparse::GROUP;
  134. args.emplace_back(param, TensorShape{n, ic, id, ih, iw},
  135. !cw ? TensorShape{oc, ic, fd, fh, fw}
  136. : TensorShape{ic, oc, 1, fd, fh, fw});
  137. }
  138. // clang-format on
  139. return args;
  140. for (size_t i = range[0].first; i < range[0].second; ++i) {
  141. param::Convolution3D param;
  142. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  143. args.emplace_back(param,
  144. TensorShape{4, 10, i, i+1, i+2},
  145. TensorShape{10, 10, 1, 1, 1});
  146. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  147. args.emplace_back(param,
  148. TensorShape{4, 10, i, i+1, i+2},
  149. TensorShape{4, 10, 1, 1, 1});
  150. }
  151. for (size_t i = 2; i < 6; ++i) {
  152. param::Convolution3D param;
  153. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  154. args.emplace_back(param,
  155. TensorShape{1, 1, i, i+1, i+2},
  156. TensorShape{1, 1, 1, 2, 3});
  157. }
  158. for (size_t i = 2; i < 6; ++i) {
  159. param::Convolution3D param;
  160. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  161. args.emplace_back(param,
  162. TensorShape{1, 1, i, i+1, i+2},
  163. TensorShape{1, 1, 1, 2, 3});
  164. }
  165. for (size_t i = 2; i < 5; ++i) {
  166. param::Convolution3D param;
  167. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  168. args.emplace_back(param,
  169. TensorShape{1, 1, i, i+1, i+2},
  170. TensorShape{1, 1, 2, 2, 2});
  171. }
  172. for (size_t i = range[0].first; i < range[0].second; ++i) {
  173. param::Convolution3D param;
  174. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  175. args.emplace_back(param,
  176. TensorShape{5, 2, i, i+1, i+2},
  177. TensorShape{3, 2, 3, 4, 5});
  178. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  179. args.emplace_back(param,
  180. TensorShape{5, 2, i, i+1, i+2},
  181. TensorShape{3, 2, 3, 4, 5});
  182. }
  183. //padding case
  184. for (size_t i = range[0].first; i < range[0].second; ++i) {
  185. param::Convolution3D param;
  186. param.pad_d = 1;
  187. param.pad_h = 2;
  188. param.pad_w = 3;
  189. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  190. args.emplace_back(param,
  191. TensorShape{5, 2, i, i+1, i+2},
  192. TensorShape{3, 2, 3, 4, 5});
  193. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  194. args.emplace_back(param,
  195. TensorShape{5, 2, i, i+1, i+2},
  196. TensorShape{3, 2, 3, 4, 5});
  197. }
  198. // large channel
  199. for (size_t i = range[0].first; i < range[0].second; ++i) {
  200. param::Convolution3D param;
  201. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  202. args.emplace_back(param,
  203. TensorShape{2, 20, i, i+1, i+2},
  204. TensorShape{30, 20, 3, 4, 5});
  205. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  206. args.emplace_back(param,
  207. TensorShape{2, 20, i, i+1, i+2},
  208. TensorShape{30, 20, 3, 4, 5});
  209. }
  210. for (size_t i = range[0].first; i < range[0].second; ++i) {
  211. param::Convolution3D param;
  212. param.pad_d = 1;
  213. param.pad_h = 2;
  214. param.pad_w = 3;
  215. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  216. args.emplace_back(param,
  217. TensorShape{2, 20, i, i+1, i+2},
  218. TensorShape{30, 20, 3, 4, 5});
  219. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  220. args.emplace_back(param,
  221. TensorShape{2, 20, i, i+1, i+2},
  222. TensorShape{30, 20, 3, 4, 5});
  223. }
  224. // 1x1x1
  225. for (size_t i = range[0].first; i < range[0].second; ++i) {
  226. param::Convolution3D param;
  227. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  228. args.emplace_back(param,
  229. TensorShape{2, 20, i, i+1, i+2},
  230. TensorShape{30, 20, 1, 1, 1});
  231. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  232. args.emplace_back(param,
  233. TensorShape{2, 20, i, i+1, i+2},
  234. TensorShape{30, 20, 1, 1, 1});
  235. }
  236. // large filter
  237. for (size_t i = range[0].first; i < range[0].second; ++i) {
  238. param::Convolution3D param;
  239. param.mode = param::Convolution3D::Mode::CONVOLUTION;
  240. args.emplace_back(param,
  241. TensorShape{2, 2, i, i+1, i+2},
  242. TensorShape{3, 2, 7, 8, 9});
  243. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  244. args.emplace_back(param,
  245. TensorShape{2, 2, i, i+1, i+2},
  246. TensorShape{3, 2, 7, 8, 9});
  247. }
  248. // exhaustive search
  249. // clang-format off
  250. for (size_t n: {1, 2})
  251. for (size_t id: {7, 8})
  252. for (size_t ih: {id+1})
  253. for (size_t iw: {ih+1})
  254. for (size_t ic: {3})
  255. for (size_t oc: {4})
  256. for (size_t fd: {2, 4})
  257. for (size_t fh: {fd+1})
  258. for (size_t fw: {fh+1})
  259. for (size_t ph: {0, 1})
  260. for (size_t sh: {1, 2})
  261. for (bool xcorr: {false, true})
  262. {
  263. param::Convolution3D param;
  264. param.mode = xcorr ? param::Convolution3D::Mode::CROSS_CORRELATION
  265. : param::Convolution3D::Mode::CONVOLUTION;
  266. param.stride_d = param.stride_h = param.stride_w = sh;
  267. param.pad_d = param.pad_h = param.pad_w = ph;
  268. args.emplace_back(param, TensorShape{n, ic, id, ih, iw},
  269. TensorShape{oc, ic, fd, fh, fw});
  270. }
  271. // clang-format on
  272. // 4x4x4
  273. for (size_t oh = 1; oh < 10; ++oh) {
  274. param::Convolution3D param;
  275. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  276. args.emplace_back(param,
  277. TensorShape{4, 3, oh+3, oh+4, oh+5},
  278. TensorShape{2, 3, 4, 4, 4});
  279. }
  280. // large channels
  281. // clang-format off
  282. for (size_t n: {2})
  283. for (size_t id: {8})
  284. for (size_t ih: {id+1})
  285. for (size_t iw: {ih+1})
  286. for (size_t ic: {16})
  287. for (size_t oc: {16})
  288. for (size_t fd: {3, 6})
  289. for (size_t fh: {fd+1})
  290. for (size_t fw: {fh+1})
  291. for (size_t ph: {0, 1})
  292. for (size_t sh: {1, 2})
  293. for (bool xcorr: {false, true})
  294. {
  295. param::Convolution3D param;
  296. param.mode = xcorr ? param::Convolution3D::Mode::CROSS_CORRELATION
  297. : param::Convolution3D::Mode::CONVOLUTION;
  298. param.stride_d = param.stride_h = param.stride_w = sh;
  299. param.pad_d = param.pad_h = param.pad_w = ph;
  300. args.emplace_back(param, TensorShape{n, ic, id, ih, iw},
  301. TensorShape{oc, ic, fd, fh, fw});
  302. }
  303. // clang-format on
  304. #if 0
  305. // x86 direct case 2
  306. for (size_t stride: {1, 2})
  307. for (size_t ker_size: {3, 5, 7})
  308. {
  309. param::Convolution3D param;
  310. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  311. param.stride_d = param.stride_h = param.stride_w = stride;
  312. param.pad_d = param.pad_h = param.pad_w = ker_size/2;
  313. args.emplace_back(param,
  314. TensorShape{2, 2, 20, 19, 18},
  315. TensorShape{3, 2, ker_size, ker_size, ker_size});
  316. args.emplace_back(param,
  317. TensorShape{2, 2, 20, 19, 18},
  318. TensorShape{1, 2, ker_size, ker_size, ker_size});
  319. }
  320. for (size_t sd: {1, 2})
  321. for (size_t sh: {1, 2})
  322. for (size_t sw: {1, 2})
  323. for (size_t pd: {0, 1, 2})
  324. for (size_t ph: {0, 1, 2})
  325. for (size_t pw: {0, 1, 2})
  326. for (size_t ker_size: {3, 4, 5, 7})
  327. for (size_t xcorr : {false, true})
  328. {
  329. param::Convolution3D param;
  330. param.mode = xcorr ?
  331. param::Convolution3D::Mode::CROSS_CORRELATION :
  332. param::Convolution3D::Mode::CONVOLUTION;
  333. param.stride_d = sd;
  334. param.stride_h = sh;
  335. param.stride_w = sw;
  336. param.pad_d = pd;
  337. param.pad_h = ph;
  338. param.pad_w = pw;
  339. args.emplace_back(param,
  340. TensorShape{2, 2, 10, 15, 20},
  341. TensorShape{3, 2, ker_size, ker_size, ker_size});
  342. args.emplace_back(param,
  343. TensorShape{2, 2, 10, 15, 20},
  344. TensorShape{1, 2, ker_size, ker_size, ker_size});
  345. }
  346. // fallback non-templated impl
  347. for (size_t sd: {1, 2})
  348. for (size_t sh: {1, 2})
  349. for (size_t sw: {1, 2})
  350. for (size_t pd: {0, 1, 2})
  351. for (size_t ph: {0, 1, 2})
  352. for (size_t pw: {0, 1, 2})
  353. for (size_t ker_size: {3, 4, 5})
  354. for (size_t xcorr : {false, true})
  355. {
  356. param::Convolution3D param;
  357. param.mode = xcorr ?
  358. param::Convolution3D::Mode::CROSS_CORRELATION :
  359. param::Convolution3D::Mode::CONVOLUTION;
  360. param.stride_d = sd;
  361. param.stride_h = sh;
  362. param.stride_w = sw;
  363. param.pad_d = pd;
  364. param.pad_h = ph;
  365. param.pad_w = pw;
  366. args.emplace_back(param,
  367. TensorShape{2, 2, 5, 15, 20}, TensorShape{3, 2, ker_size, ker_size+1, ker_size+2});
  368. args.emplace_back(param,
  369. TensorShape{2, 2, 5, 15, 20},
  370. TensorShape{1, 2, ker_size, ker_size+1, ker_size+2});
  371. }
  372. // x86 winograd algorithm
  373. for (size_t ic_size: {8, 16})
  374. {
  375. param::Convolution3D param;
  376. param.mode = param::Convolution3D::Mode::CROSS_CORRELATION;
  377. param.stride_d = param.stride_h = param.stride_w = 1;
  378. param.pad_d = param.pad_h = param.pad_w = 0;
  379. args.emplace_back(param,
  380. TensorShape{2, ic_size, 20, 18, 19},
  381. TensorShape{8, ic_size, 3, 3, 3});
  382. }
  383. #endif
  384. return args;
  385. }
  386. std::vector<TestArg> convolution3d::get_chanwise_args() {
  387. std::vector<TestArg> args;
  388. // clang-format off
  389. for (size_t n : {4})
  390. for (size_t id : {35})
  391. for (size_t ih : {id + 1})
  392. for (size_t iw : {ih + 1})
  393. for (size_t c : {4, 8, 16})
  394. for (size_t fd : {3, 4, 7})
  395. for (size_t fh : {fd + 1})
  396. for (size_t fw : {fh + 1})
  397. for (size_t ph : {0, 1})
  398. for (size_t sh : {1, 2})
  399. for (size_t dh : {1}) {
  400. param::Convolution3D param;
  401. param.sparse = param::Convolution3D::Sparse::GROUP;
  402. param.stride_d = param.stride_h = param.stride_w = sh;
  403. param.pad_d = param.pad_h = param.pad_w = ph;
  404. param.dilate_d = param.dilate_h = param.dilate_w = dh;
  405. args.emplace_back(param, TensorShape{n, c, id, ih, iw},
  406. TensorShape{c, 1, 1, fd, fh, fw});
  407. }
  408. // clang-format on
  409. return args;
  410. }
  411. std::vector<TestArg> convolution3d::get_dilated_args() {
  412. std::vector<TestArg> args;
  413. param::Convolution3D param;
  414. {
  415. param.pad_d = param.pad_h = param.pad_w = 2;
  416. param.dilate_d = param.dilate_h = param.dilate_w = 3;
  417. size_t n = 1, ic = 5, id = 24, ih = 24, iw = 24,
  418. fd = 3, fh = 3, fw = 3,
  419. oc = 6;
  420. args.emplace_back(param,
  421. TensorShape{n, ic, id, ih, iw},
  422. TensorShape{oc, ic, fd, fh, fw});
  423. }
  424. // exhaustive search
  425. // clang-format off
  426. for (size_t n : {2})
  427. for (size_t id : {32})
  428. for (size_t ih : {id + 1})
  429. for (size_t iw : {ih + 1})
  430. for (size_t ic : {3})
  431. for (size_t oc : {4})
  432. for (size_t fd : {2, 3, 4})
  433. for (size_t fh : {fd + 1})
  434. for (size_t fw : {fh + 1})
  435. for (size_t ph : {0, 1})
  436. for (size_t sh : {2, 3})
  437. for (size_t dh : {2, 3, 4}) {
  438. param::Convolution3D param;
  439. param.stride_d = param.stride_h = param.stride_w = sh;
  440. param.pad_d = param.pad_h = param.pad_w = ph;
  441. param.dilate_d = param.dilate_h = param.dilate_w = dh;
  442. args.emplace_back(param, TensorShape{n, ic, id, ih, iw},
  443. TensorShape{oc, ic, fd, fh, fw});
  444. }
  445. // clang-format on
  446. return args;
  447. }
  448. // vim: syntax=cpp.doxygen

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

Contributors (1)