| 11 | namespace test { |
| 12 | |
| 13 | TEST_F(CUDA, GROUP_CONVOLUTION3D_FORWARD) { |
| 14 | bool is_int_available = check_compute_capability(6, 1); |
| 15 | static_cast<void>(is_int_available); |
| 16 | auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD, |
| 17 | size_t FH, size_t FW, size_t OC, size_t PD, size_t PH, size_t PW, |
| 18 | size_t SD, size_t SH, size_t SW, size_t DD, size_t DH, size_t DW, |
| 19 | size_t group) { |
| 20 | { |
| 21 | // float case |
| 22 | Checker<Convolution3D> checker(handle_cuda()); |
| 23 | Convolution3D::Param param; |
| 24 | param.sparse = Convolution3D::Param::Sparse::GROUP; |
| 25 | param.pad_d = PD; |
| 26 | param.pad_h = PH; |
| 27 | param.pad_w = PW; |
| 28 | param.stride_d = SD; |
| 29 | param.stride_h = SH; |
| 30 | param.stride_w = SW; |
| 31 | param.dilate_d = DD; |
| 32 | param.dilate_h = DH; |
| 33 | param.dilate_w = DW; |
| 34 | auto ICpg = IC / group; |
| 35 | auto OCpg = OC / group; |
| 36 | checker.set_param(param).exec( |
| 37 | {{N, IC, ID, IH, IW}, {group, OCpg, ICpg, FD, FH, FW}, {}}); |
| 38 | } |
| 39 | }; |
| 40 | // normal case |
| 41 | run(2, 64, 7, 7, 7, 1, 1, 1, 32, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2); |
| 42 | run(1, 2, 2, 2, 2, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2); |
| 43 | run(2, 64, 7, 7, 7, 3, 3, 3, 32, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2); |
| 44 | // padded case |
| 45 | run(2, 32, 7, 7, 7, 3, 3, 3, 64, 2, 2, 2, 1, 1, 1, 1, 1, 1, 4); |
| 46 | // strided case |
| 47 | run(2, 32, 7, 7, 7, 3, 3, 3, 64, 0, 0, 0, 2, 2, 2, 1, 1, 1, 8); |
| 48 | // dilated case |
| 49 | #if CUDNN_MAJOR >= 6 |
| 50 | run(10, 4, 64, 64, 12, 3, 2, 2, 64, 0, 0, 0, 1, 1, 1, 3, 4, 2, 4); |
| 51 | #else |
| 52 | #endif |
| 53 | } |
| 54 | |
| 55 | TEST_F(CUDA, GROUP_CONVOLUTION3D_FORWARD_1x1x1) { |
| 56 | auto run = [&](size_t N, size_t IC, size_t ID, size_t IH, size_t IW, size_t FD, |
nothing calls this directly
no test coverage detected