1 /*******************************************************************************
2 * Copyright 2018 Intel Corporation
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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 *******************************************************************************/
20 #include "mkldnn_debug.h"
21 #include "c_types_map.hpp"
23 #include "z_magic.hpp"
32 const verbose_t *mkldnn_verbose();
35 #if !defined(DISABLE_VERBOSE)
38 #define MKLDNN_VERBOSE_BUF_LEN 1024
40 #define MKLDNN_VERBOSE_DAT_LEN 64
41 #define MKLDNN_VERBOSE_AUX_LEN 384
42 #define MKLDNN_VERBOSE_PRB_LEN 384
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)
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);
58 template <typename pd_t> static void init_info_bnorm(pd_t *s, char *buffer) {
59 DECL_DAT_AUX_PRB_STRS();
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));
67 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN, "flags:%u", s->desc()->flags);
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());
81 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
85 template <typename pd_t> static void init_info_conv(pd_t *s, char *buffer) {
86 DECL_DAT_AUX_PRB_STRS();
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));
104 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
105 "alg:%s", mkldnn_alg_kind2str(s->cdesc()->alg_kind));
107 if (s->ndims() == 5) {
108 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
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());
118 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
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());
127 verbose_templ(buffer, s->kind(), s->name(), s->cdesc()->prop_kind, dat_str,
131 template <typename pd_t> static void init_info_eltwise(pd_t *s, char *buffer) {
132 DECL_DAT_AUX_PRB_STRS();
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));
140 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
141 "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
143 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
144 "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
146 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
150 template <typename pd_t> static void init_info_depthwise(pd_t *s, char *buffer) {
151 DECL_DAT_AUX_PRB_STRS();
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));
159 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
160 "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
162 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
163 "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
165 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
169 template <typename pd_t> static void init_info_iprod(pd_t *s, char *buffer) {
170 DECL_DAT_AUX_PRB_STRS();
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));
188 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
189 "mb%dic%doc%d", s->MB(), s->IC_total(), s->OC());
191 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
195 template <typename pd_t> static void init_info_lrn(pd_t *s, char *buffer) {
196 DECL_DAT_AUX_PRB_STRS();
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));
204 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
205 "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
207 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
208 "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
210 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
214 template <typename pd_t> static void init_info_mem(pd_t *s, char *buffer) {
215 DECL_DAT_AUX_PRB_STRS();
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));
224 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN, "num:%d", s->n_inputs());
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]);
233 verbose_templ(buffer, s->kind(), s->name(), prop_kind::undef, dat_str,
237 template <typename pd_t> static void init_info_pool(pd_t *s, char *buffer) {
238 DECL_DAT_AUX_PRB_STRS();
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));
247 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
248 "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
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",
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());
259 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
260 "mb%dic%d_ih%doh%dkh%dsh%dph%d_iw%dow%dkw%dsw%dpw%d",
262 s->IH(), s->OH(), s->KH(), s->KSH(), s->padT(),
263 s->IW(), s->OW(), s->KW(), s->KSW(), s->padL());
266 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
270 template <typename pd_t> static void init_info_softmax(pd_t *s, char *buffer) {
271 DECL_DAT_AUX_PRB_STRS();
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));
280 snprintf(prb_str, MKLDNN_VERBOSE_PRB_LEN,
281 "mb%dic%dih%diw%d", s->MB(), s->C(), s->H(), s->W());
283 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
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();
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));
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(),
301 verbose_templ(buffer, s->kind(), s->name(), s->desc()->prop_kind, dat_str,
305 template <typename pd_t> static void init_info_roi_pooling(pd_t *s, char *buffer) {
306 DECL_DAT_AUX_PRB_STRS();
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));
314 snprintf(aux_str, MKLDNN_VERBOSE_AUX_LEN,
315 "alg:%s", mkldnn_alg_kind2str(s->desc()->alg_kind));
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,
323 #else /* !defined(DISABLE_VERBOSE) */
324 #define MKLDNN_VERBOSE_BUF_LEN 1
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); }
333 DEFINE_STUB(eltwise);
334 DEFINE_STUB(depthwise);
339 DEFINE_STUB(softmax);
341 DEFINE_STUB(roi_pooling);
343 #endif /* !defined(DISABLE_VERBOSE) */