e784371afbdb9de04d2fe4239322ac72bc1d0e52
[platform/upstream/dldt.git] / inference-engine / thirdparty / mkl-dnn / src / common / verbose.hpp
1 /*******************************************************************************
2 * Copyright 2018 Intel Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *******************************************************************************/
16
17 #ifndef VERBOSE_HPP
18 #define VERBOSE_HPP
19
20 #include "mkldnn_debug.h"
21 #include "c_types_map.hpp"
22 #include "utils.hpp"
23 #include "z_magic.hpp"
24
25 namespace mkldnn {
26 namespace impl {
27
28 struct verbose_t {
29     int level;
30 };
31
32 const verbose_t *mkldnn_verbose();
33 double get_msec();
34
35 #if !defined(DISABLE_VERBOSE)
36 #include <stdio.h>
37
38 #define MKLDNN_VERBOSE_BUF_LEN 1024
39
40 #define MKLDNN_VERBOSE_DAT_LEN 64
41 #define MKLDNN_VERBOSE_AUX_LEN 384
42 #define MKLDNN_VERBOSE_PRB_LEN 384
43
44 #define DECL_DAT_AUX_PRB_STRS() \
45     char dat_str[MKLDNN_VERBOSE_DAT_LEN] = {'\0'}; MAYBE_UNUSED(dat_str); \
46     char aux_str[MKLDNN_VERBOSE_AUX_LEN] = {'\0'}; MAYBE_UNUSED(aux_str); \
47     char prb_str[MKLDNN_VERBOSE_PRB_LEN] = {'\0'}; MAYBE_UNUSED(prb_str)
48
49 inline void verbose_templ(char *buffer, mkldnn_primitive_kind_t prim_kind,
50         const char *impl_str, mkldnn_prop_kind_t prop_kind,
51         const char *data_str, const char *aux_str, const char *prb_str) {
52     MAYBE_UNUSED(verbose_templ);
53     snprintf(buffer, MKLDNN_VERBOSE_BUF_LEN, "%s,%s,%s,%s,%s,%s",
54             mkldnn_prim_kind2str(prim_kind), impl_str,
55             mkldnn_prop_kind2str(prop_kind), data_str, aux_str, prb_str);
56 }
57
58 template <typename pd_t> static void init_info_bnorm(pd_t *s, char *buffer) {
59     DECL_DAT_AUX_PRB_STRS();
60
61     auto fmt_data = s->src_pd()->desc()->format;
62     auto fmt_diff = s->is_bwd()
63         ? s->diff_src_pd()->desc()->format : memory_format::undef;
64     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN, "fdata:%s fdiff:%s",
65             mkldnn_fmt2str(fmt_data), mkldnn_fmt2str(fmt_diff));
66
67     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN, "flags:%u", s->desc()->flags);
68
69     if (s->ndims() == 5)
70     {
71         snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
72             "mb%dic%did%dih%diw%d", s->MB(), s->C(), s->D(), s->H(), s->W());
73     } else if (s->ndims() == 4) {
74         snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
75             "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
76     } else if (s->ndims() == 2) {
77         snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
78             "mb%dic%d", s->MB(), s->C());
79     }
80
81     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
82             aux_str, prb_str);
83 }
84
85 template <typename pd_t> static void init_info_conv(pd_t *s, char *buffer) {
86     DECL_DAT_AUX_PRB_STRS();
87
88     auto fmt_src = (s->cdesc()->prop_kind == prop_kind::backward_data
89             ? s->diff_src_pd() : s->src_pd())->desc()->format;
90     auto fmt_wei = (s->cdesc()->prop_kind == prop_kind::backward_weights
91             ? s->diff_weights_pd(0) : s->weights_pd(0))->desc()->format;
92     auto fmt_bia = s->with_bias()
93         ? (s->cdesc()->prop_kind == prop_kind::backward_weights
94                 ? s->diff_weights_pd(1) : s->weights_pd(1))->desc()->format
95         : memory_format::undef;
96     auto fmt_dst = (s->cdesc()->prop_kind == prop_kind::backward_data
97             || s->cdesc()->prop_kind == prop_kind::backward_weights
98         ? s->diff_dst_pd() : s->dst_pd())->desc()->format;
99     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN,
100             "fsrc:%s fwei:%s fbia:%s fdst:%s",
101             mkldnn_fmt2str(fmt_src), mkldnn_fmt2str(fmt_wei),
102             mkldnn_fmt2str(fmt_bia), mkldnn_fmt2str(fmt_dst));
103
104     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
105             "alg:%s", mkldnn_alg_kind2str(s->cdesc()->alg_kind));
106
107     if (s->ndims() == 5) {
108         snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
109             "mb%d_g%dic%doc%d"
110             "_id%dod%dkd%dsd%ddd%dpd%d"
111             "_ih%doh%dkh%dsh%ddh%dph%d"
112             "_iw%dow%dkw%dsw%ddw%dpw%d",
113             s->MB(), s->G(), s->IC(), s->OC(),
114             s->ID(), s->OD(), s->KD(), s->KSD(), s->KDD(), s->padFront(),
115             s->IH(), s->OH(), s->KH(), s->KSH(), s->KDH(), s->padT(),
116             s->IW(), s->OW(), s->KW(), s->KSW(), s->KDW(), s->padL());
117     } else {
118         snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
119             "mb%d_g%dic%doc%d"
120             "_ih%doh%dkh%dsh%ddh%dph%d"
121             "_iw%dow%dkw%dsw%ddw%dpw%d",
122             s->MB(), s->G(), s->IC(), s->OC(),
123             s->IH(), s->OH(), s->KH(), s->KSH(), s->KDH(), s->padT(),
124             s->IW(), s->OW(), s->KW(), s->KSW(), s->KDW(), s->padL());
125     }
126
127     verbose_templ(buffer, s->kind(), s->name(), s->cdesc()->prop_kind, dat_str,
128             aux_str, prb_str);
129 }
130
131 template <typename pd_t> static void init_info_eltwise(pd_t *s, char *buffer) {
132     DECL_DAT_AUX_PRB_STRS();
133
134     auto fmt_data = s->src_pd()->desc()->format;
135     auto fmt_diff = s->desc()->prop_kind == prop_kind::backward_data
136         ? s->diff_src_pd()->desc()->format : memory_format::undef;
137     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN, "fdata:%s fdiff:%s",
138             mkldnn_fmt2str(fmt_data), mkldnn_fmt2str(fmt_diff));
139
140     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
141             "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
142
143     snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
144             "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
145
146     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
147             aux_str, prb_str);
148 }
149
150 template <typename pd_t> static void init_info_depthwise(pd_t *s, char *buffer) {
151     DECL_DAT_AUX_PRB_STRS();
152
153     auto fmt_data = s->src_pd()->desc()->format;
154     auto fmt_diff = s->desc()->prop_kind == prop_kind::backward_data
155         ? s->diff_src_pd()->desc()->format : memory_format::undef;
156     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN, "fdata:%s fdiff:%s",
157             mkldnn_fmt2str(fmt_data), mkldnn_fmt2str(fmt_diff));
158
159     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
160             "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
161
162     snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
163             "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
164
165     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
166             aux_str, prb_str);
167 }
168
169 template <typename pd_t> static void init_info_iprod(pd_t *s, char *buffer) {
170     DECL_DAT_AUX_PRB_STRS();
171
172     auto fmt_src = (s->desc()->prop_kind == prop_kind::backward_data
173             ? s->diff_src_pd() : s->src_pd())->desc()->format;
174     auto fmt_wei = (s->desc()->prop_kind == prop_kind::backward_weights
175             ? s->diff_weights_pd(0) : s->weights_pd(0))->desc()->format;
176     auto fmt_bia = s->with_bias()
177         ? (s->desc()->prop_kind == prop_kind::backward_weights
178                 ? s->diff_weights_pd(1) : s->weights_pd(1))->desc()->format
179         : memory_format::undef;
180     auto fmt_dst = (s->desc()->prop_kind == prop_kind::backward_data
181             || s->desc()->prop_kind == prop_kind::backward_weights
182         ? s->diff_dst_pd() : s->dst_pd())->desc()->format;
183     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN,
184             "fsrc:%s fwei:%s fbia:%s fdst:%s",
185             mkldnn_fmt2str(fmt_src), mkldnn_fmt2str(fmt_wei),
186             mkldnn_fmt2str(fmt_bia), mkldnn_fmt2str(fmt_dst));
187
188     snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
189             "mb%dic%doc%d", s->MB(), s->IC_total(), s->OC());
190
191     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
192             aux_str, prb_str);
193 }
194
195 template <typename pd_t> static void init_info_lrn(pd_t *s, char *buffer) {
196     DECL_DAT_AUX_PRB_STRS();
197
198     auto fmt_data = s->src_pd()->desc()->format;
199     auto fmt_diff = s->desc()->prop_kind == prop_kind::backward_data
200         ? s->diff_src_pd()->desc()->format : memory_format::undef;
201     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN, "fdata:%s fdiff:%s",
202             mkldnn_fmt2str(fmt_data), mkldnn_fmt2str(fmt_diff));
203
204     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
205             "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
206
207     snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
208             "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
209
210     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
211             aux_str, prb_str);
212 }
213
214 template <typename pd_t> static void init_info_mem(pd_t *s, char *buffer) {
215     DECL_DAT_AUX_PRB_STRS();
216
217     const auto i_md = s->input_pd(0)->desc();
218     const auto o_md = s->output_pd(0)->desc();
219     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN,
220             "in:%s_%s out:%s_%s",
221             mkldnn_dt2str(i_md->data_type), mkldnn_fmt2str(i_md->format),
222             mkldnn_dt2str(o_md->data_type), mkldnn_fmt2str(o_md->format));
223
224     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN, "num:%d", s->n_inputs());
225
226     int l = 0;
227     for (int d = 0; d < o_md->ndims - 1; ++d)
228         l += snprintf(prb_str + l, MKLDNN_VERBOSE_PRB_LEN - l,
229                 "%dx", o_md->dims[d]);
230     snprintf(prb_str + l, MKLDNN_VERBOSE_PRB_LEN - l,
231             "%d", o_md->dims[o_md->ndims - 1]);
232
233     verbose_templ(buffer, s->kind(), s->name(), prop_kind::undef, dat_str,
234             aux_str, prb_str);
235 }
236
237 template <typename pd_t> static void init_info_pool(pd_t *s, char *buffer) {
238     DECL_DAT_AUX_PRB_STRS();
239
240     auto fmt_data = (s->desc()->prop_kind == prop_kind::backward_data
241             ? s->diff_src_pd() : s->src_pd())->desc()->format;
242     auto fmt_ws = s->workspace_pd()
243         ? s->workspace_pd()->desc()->format : memory_format::undef;
244     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN, "fdata:%s fws:%s",
245             mkldnn_fmt2str(fmt_data), mkldnn_fmt2str(fmt_ws));
246
247     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
248             "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
249
250     if (s->is_3d())
251     {
252         snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
253             "mb%dic%d_id%dod%dkd%dsd%dpd%d_ih%doh%dkh%dsh%dph%d_iw%dow%dkw%dsw%dpw%d",
254             s->MB(), s->C(),
255             s->ID(), s->OD(), s->KD(), s->KSD(), s->padFront(),
256             s->IH(), s->OH(), s->KH(), s->KSH(), s->padT(),
257             s->IW(), s->OW(), s->KW(), s->KSW(), s->padL());
258     } else {
259         snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
260             "mb%dic%d_ih%doh%dkh%dsh%dph%d_iw%dow%dkw%dsw%dpw%d",
261             s->MB(), s->C(),
262             s->IH(), s->OH(), s->KH(), s->KSH(), s->padT(),
263             s->IW(), s->OW(), s->KW(), s->KSW(), s->padL());
264     }
265
266     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
267             aux_str, prb_str);
268 }
269
270 template <typename pd_t> static void init_info_softmax(pd_t *s, char *buffer) {
271     DECL_DAT_AUX_PRB_STRS();
272
273     auto fmt_data = (s->desc()->prop_kind == prop_kind::backward_data
274             ? s->diff_src_pd() : s->src_pd())->desc()->format;
275     auto fmt_diff = s->desc()->prop_kind == prop_kind::backward_data
276         ? s->diff_src_pd()->desc()->format : memory_format::undef;
277     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN, "fdata:%s fdiff:%s",
278             mkldnn_fmt2str(fmt_data), mkldnn_fmt2str(fmt_diff));
279
280     snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
281             "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
282
283     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
284             aux_str, prb_str);
285 }
286
287 /// @todo print meaningful data
288 template <typename pd_t> static void init_info_rnn(pd_t *s, char *buffer) {
289     DECL_DAT_AUX_PRB_STRS();
290
291     alg_kind_t alg_kind = s->desc()->cell_desc.cell_kind;
292     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
293             "alg:%s", mkldnn_alg_kind2str(alg_kind));
294
295     snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
296             "l%dd%dmb%dt%d_ic%dsc%doc%d_wi%dws%d",
297              s->L(), s->D(), s->MB(), s->T(),
298              s->SLC(), s->DIC(), s->DIC(),
299              s->SLC(), s->SIC());
300
301     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
302             aux_str, prb_str);
303 }
304
305 template <typename pd_t> static void init_info_roi_pooling(pd_t *s, char *buffer) {
306     DECL_DAT_AUX_PRB_STRS();
307
308     auto fmt_data = s->src_pd()->desc()->format;
309     auto fmt_diff = s->desc()->prop_kind == prop_kind::backward_data
310                     ? s->diff_src_pd()->desc()->format : memory_format::undef;
311     snprintf(dat_str, MKLDNN_VERBOSE_DAT_LEN, "fdata:%s fdiff:%s",
312              mkldnn_fmt2str(fmt_data), mkldnn_fmt2str(fmt_diff));
313
314     snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
315              "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
316
317     snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
318              "ph%dpw%dcs%f", s->pooledH(), s->pooledW(), s->spatialScale());
319     verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
320                   aux_str, prb_str);
321 }
322
323 #else /* !defined(DISABLE_VERBOSE) */
324 #define MKLDNN_VERBOSE_BUF_LEN 1
325
326 #define DEFINE_STUB(name) \
327     template <typename pd_t> \
328     static void CONCAT2(init_info_, name)(pd_t *s, char *buffer) \
329     { UNUSED(s); UNUSED(buffer); }
330
331 DEFINE_STUB(bnorm);
332 DEFINE_STUB(conv);
333 DEFINE_STUB(eltwise);
334 DEFINE_STUB(depthwise);
335 DEFINE_STUB(iprod);
336 DEFINE_STUB(lrn);
337 DEFINE_STUB(mem);
338 DEFINE_STUB(pool);
339 DEFINE_STUB(softmax);
340 DEFINE_STUB(rnn);
341 DEFINE_STUB(roi_pooling);
342 #undef DEFINE_STUB
343 #endif /* !defined(DISABLE_VERBOSE) */
344
345 }
346 }
347
348 #endif