| 66 | |
| 67 | template <typename ctype> |
| 68 | void exec_internel( |
| 69 | const float* src, const float* filter, const ctype* mask, float* dst, |
| 70 | WorkspaceBundle wbundle, MatrixMul* opr, size_t N, size_t IC, size_t OC, |
| 71 | size_t IH, size_t IW, size_t OH, size_t OW, size_t PH, size_t PW, size_t SH, |
| 72 | size_t SW, size_t FH, size_t FW, size_t DH, size_t DW, bool is_xcorr) { |
| 73 | memset(dst, 0, sizeof(float) * N * OC * OH * OW); |
| 74 | unsigned int* maskInd = static_cast<unsigned int*>(wbundle.get(0)); |
| 75 | size_t maskN; |
| 76 | get_mask_index(mask, OH, OW, maskInd, &maskN); |
| 77 | |
| 78 | void* matmul_workspace_ptr = wbundle.get(3); |
| 79 | size_t matmul_wsize = wbundle.get_size(3); |
| 80 | |
| 81 | size_t IH2 = IH + 2 * PH; |
| 82 | size_t IW2 = IW + 2 * PW; |
| 83 | |
| 84 | rep(n, N) { |
| 85 | const float* src_t = src + n * IC * IW * IH; |
| 86 | if (PH > 0 || PW > 0) { |
| 87 | float* src_pad = static_cast<float*>(wbundle.get(1)); |
| 88 | src_t = src_pad; |
| 89 | rep(ic, IC) { |
| 90 | if (PH) { |
| 91 | memset(src_pad, 0, IW2 * PH * sizeof(float)); |
| 92 | src_pad += IW2 * PH; |
| 93 | } |
| 94 | rep(ih, IH) { |
| 95 | rep(i, PW) { *src_pad++ = 0; } |
| 96 | memcpy(src_pad, src + (n * IC + ic) * IH * IW + ih * IW, |
| 97 | IW * sizeof(float)); |
| 98 | src_pad += IW; |
| 99 | rep(i, PW) { *src_pad++ = 0; } |
| 100 | } |
| 101 | if (PH) { |
| 102 | memset(src_pad, 0, IW2 * PH * sizeof(float)); |
| 103 | src_pad += IW2 * PH; |
| 104 | } |
| 105 | } |
| 106 | } |
| 107 | float* B_mat = static_cast<float*>(wbundle.get(2)); |
| 108 | if (is_xcorr) { |
| 109 | img2col_mask<true>( |
| 110 | src_t, B_mat, OC, OH, OW, IC, IH2, IW2, FH, FW, SH, SW, DH, DW, |
| 111 | maskInd, maskN); |
| 112 | } else { |
| 113 | img2col_mask<false>( |
| 114 | src_t, B_mat, OC, OH, OW, IC, IH2, IW2, FH, FW, SH, SW, DH, DW, |
| 115 | maskInd, maskN); |
| 116 | } |
| 117 | float* result = static_cast<float*>(wbundle.get(1)); |
| 118 | TensorND A((float*)filter, TensorLayout({OC, IC * FH * FW}, dtype::Float32())), |
| 119 | B((float*)B_mat, TensorLayout({IC * FH * FW, maskN}, dtype::Float32())), |
| 120 | C((float*)result, TensorLayout({OC, maskN}, dtype::Float32())); |
| 121 | |
| 122 | Workspace workspace( |
| 123 | static_cast<megdnn::dt_byte*>(matmul_workspace_ptr), matmul_wsize); |
| 124 | |
| 125 | opr->exec(A, B, C, workspace); |
nothing calls this directly
no test coverage detected