MCPcopy Create free account
hub / github.com/MegEngine/MegEngine / exec_internel

Function exec_internel

dnn/src/fallback/mask_conv/opr_impl.cpp:68–129  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

66
67template <typename ctype>
68void 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);

Callers

nothing calls this directly

Calls 3

get_mask_indexFunction · 0.85
getMethod · 0.45
get_sizeMethod · 0.45

Tested by

no test coverage detected