summaryrefslogtreecommitdiff
path: root/inference-engine/thirdparty/mkl-dnn/tests/benchdnn/reorder/reorder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'inference-engine/thirdparty/mkl-dnn/tests/benchdnn/reorder/reorder.cpp')
-rw-r--r--inference-engine/thirdparty/mkl-dnn/tests/benchdnn/reorder/reorder.cpp340
1 files changed, 175 insertions, 165 deletions
diff --git a/inference-engine/thirdparty/mkl-dnn/tests/benchdnn/reorder/reorder.cpp b/inference-engine/thirdparty/mkl-dnn/tests/benchdnn/reorder/reorder.cpp
index 49145f44d..067623ff2 100644
--- a/inference-engine/thirdparty/mkl-dnn/tests/benchdnn/reorder/reorder.cpp
+++ b/inference-engine/thirdparty/mkl-dnn/tests/benchdnn/reorder/reorder.cpp
@@ -16,6 +16,7 @@
#include <stdlib.h>
+#include "dnn_types.hpp"
#include "mkldnn_common.hpp"
#include "mkldnn_memory.hpp"
@@ -23,134 +24,28 @@
namespace reorder {
-int doit(const prb_t *p, res_t *r) {
- return check_reorder(p, r);
-}
-
-int check_reorder(const prb_t *p, res_t *res) {
-/* ___________________
- * | |
- * | performance timer |
- * |___________________|
- * |
- * _______________ ______________ V ________________
- * | | MKL-DNN | | MKL-DNN | |
- * | dt_in fmt_ref |-------->| dt_in fmt_in |-------->| dt_out fmt_out |
- * |_______________| |______________| ^ |________________|
- * | | |
- * benchdnn |<-------------------------------- scales | MKL-DNN
- * ________V_______ _______V________
- * | | | |
- * | dt_out fmt_ref | <= compare => | dt_out fmt_ref |
- * |________________| |________________|
- *
- * Steps:
- * 1. create memory
- * 2. fill scales
- * 3. fill input memory
- * 4. execute mkl-dnn: reorder->q10n->reorder
- * 5. execute benchdnn: q10n
- * 6. compare results
- * 7. performance measurment
- * 8. clean up
- */
-
- const reorder_conf_t *r = p->reorder;
-
- mkldnn_memory_format_t fmt_ref;
- switch (r->ndims) {
- case 1: fmt_ref = mkldnn_x; break;
- case 2: fmt_ref = mkldnn_nc; break;
- case 4:
- switch (r->fmt_in) {
- case mkldnn_oihw:
- case mkldnn_hwio: fmt_ref = mkldnn_oihw; break;
- default: fmt_ref = mkldnn_nchw;
- }
- break;
- default:
- assert(!"bad ndims");
- return FAIL;
- }
-
- /* Step 1: create memory */
- dnn_mem_t mem_dt_in_fmt_ref(r->ndims, r->dims, p->conf_in.dt, fmt_ref);
- dnn_mem_t mem_dt_in_fmt_in(r->ndims, r->dims, p->conf_in.dt, r->fmt_in);
- dnn_mem_t mem_dt_out_fmt_out(r->ndims, r->dims, p->conf_out.dt, r->fmt_out);
- dnn_mem_t mem_dt_out_fmt_ref(r->ndims, r->dims, p->conf_out.dt, fmt_ref);
- dnn_mem_t mem_test_dt_out_fmt_ref(r->ndims, r->dims, p->conf_out.dt,
- fmt_ref);
-
- /* Step 2: fill scales */
- int count = 0, mask = 0;
- SAFE(scales_count(&count, &mask, mem_dt_out_fmt_out, p->attr), WARN);
- float *scales = (float *)zmalloc(sizeof(float) * count, 64);
- SAFE(scales != NULL ? OK : FAIL, CRIT);
- SAFE(fill_scales(p, scales, count), WARN);
- /* Step 3: fill input memory */
- SAFE(fill_memory(p, mem_dt_in_fmt_ref, scales, p->attr), WARN);
-
- /* Step 4: execute mkl-dnn */
- SAFE(mem_dt_in_fmt_in.reorder(mem_dt_in_fmt_ref), WARN);
-
- auto mkldnn_attr = create_mkldnn_attr(p->attr, count, mask, scales);
-
- mkldnn_primitive_desc_t check_rpd;
- mkldnn_status_t init_status = mkldnn_reorder_primitive_desc_create_v2(
- &check_rpd, mem_dt_in_fmt_in.mpd_, mem_dt_out_fmt_out.mpd_,
- mkldnn_attr);
- if (init_status == mkldnn_unimplemented) {
- mkldnn_primitive_attr_destroy(mkldnn_attr);
- return res->state = UNIMPLEMENTED, OK;
- }
- SAFE(init_status, WARN);
-
- SAFE(mem_dt_out_fmt_out.reorder(mem_dt_in_fmt_in, mkldnn_attr), WARN);
- SAFE(mem_dt_out_fmt_ref.reorder(mem_dt_out_fmt_out), WARN);
-
- /* Step 5: execute benchdnn reorder */
- SAFE(reorder(p, mem_test_dt_out_fmt_ref, mem_dt_in_fmt_ref, scales), WARN);
-
- /* Step 6: compare results */
- if (bench_mode & CORR) {
- SAFE(compare(p, mem_test_dt_out_fmt_ref, mem_dt_out_fmt_ref,
- scales, count, res), WARN);
- }
-
- /* Step 7: performance measurment */
- if (bench_mode & PERF) {
- mkldnn_primitive_desc_t perf_r_pd;
- mkldnn_primitive_t perf_r;
+int get_scale_mask(const mkldnn_memory_desc_t &md, const attr_t &attr) {
+ using P = attr_t::scale_t::policy_t;
+ const auto policy = attr.oscale.policy;
- DNN_SAFE(mkldnn_reorder_primitive_desc_create_v2(&perf_r_pd,
- mem_dt_in_fmt_in.mpd_, mem_dt_out_fmt_out.mpd_,
- mkldnn_attr), WARN);
- mkldnn_primitive_at_t i = {mem_dt_in_fmt_in.p_, 0};
- const_mkldnn_primitive_t o = mem_dt_out_fmt_out.p_;
- DNN_SAFE(mkldnn_primitive_create(&perf_r, perf_r_pd, &i, &o), WARN);
- DNN_SAFE_V(mkldnn_primitive_desc_destroy(perf_r_pd));
+ const bool is_data = fmt2data_kind(md.format) == DATA;
+ const bool is_gwei = fmt2data_kind(md.format) == GWEI;
- auto &t = res->timer;
- t.reset();
- while (true) {
- SAFE(execute(perf_r), WARN);
- t.stamp();
- const bool stop = false
- || (fix_times_per_prb && t.times() >= fix_times_per_prb)
- || (!fix_times_per_prb
- && t.total_ms() >= max_ms_per_prb
- && t.times() >= min_times_per_prb);
- if (stop) break;
- }
+ int scale_mask = 0;
- DNN_SAFE_V(mkldnn_primitive_destroy(perf_r));
+ switch (policy) {
+ case P::PER_OC:
+ if (md.ndims < 2) SAFE_V(FAIL);
+ scale_mask = is_data
+ ? 1 << 1
+ : (is_gwei ? (1 << 0) + (1 << 1) : 1 << 0);
+ break;
+ case P::COMMON:
+ case P::NONE: scale_mask = 0; break;
+ default: SAFE_V(FAIL);
}
- /* Step 8: clean up */
- mkldnn_primitive_attr_destroy(mkldnn_attr);
- zfree(scales);
-
- return OK;
+ return scale_mask;
}
int scales_count(int *count, int *mask, const dnn_mem_t &memory,
@@ -161,9 +56,8 @@ int scales_count(int *count, int *mask, const dnn_mem_t &memory,
int uniq_scales = 1;
for(int d = 0; d < md.ndims; ++d) {
- if (scale_mask & (1 << d)) {
+ if (scale_mask & (1 << d))
uniq_scales *= md.dims[d];
- }
}
*count = uniq_scales;
return OK;
@@ -184,31 +78,11 @@ inline float saturate(float value, float min, float max) {
return MAX2(min, MIN2(max, value));
}
-int get_scale_mask(const mkldnn_memory_desc_t &md, const attr_t &attr) {
- const auto policy = attr.oscale.policy;
- int scale_mask = 0;
- using P = attr_t::scale_t::policy_t;
- switch (policy) {
- case P::PER_OC:
- switch (md.format) {
- case mkldnn_oihw:
- case mkldnn_hwio:
- scale_mask = 1 << 0; break;
- default: break;
- }
- break;
- case P::COMMON:
- case P::NONE: scale_mask = 0; break;
- default: assert(!"bad scale policy"); return FAIL;
- }
- return scale_mask;
-}
-
int fill_memory(const prb_t *p, dnn_mem_t &mem, const float *scales,
const attr_t &attr) {
- const auto c_src = p->conf_in;
- const int range = c_src.range;
- const int max = c_src.min + range - 1;
+ const dt_conf_t c_src = p->conf_in;
+ const int range = c_src->range;
+ const int max = c_src->min + range - 1;
int scale_mask = get_scale_mask(mem.md_, attr);
const size_t nelems = mem.nelems();
@@ -219,7 +93,7 @@ int fill_memory(const prb_t *p, dnn_mem_t &mem, const float *scales,
const float gen[7] = {
(float)max, /* saturate to max of output data type */
- (float)c_src.min, /* saturate to min of output data type */
+ (float)c_src->min, /* saturate to min of output data type */
(float)1.6 / scale, /* rounding check */
(float)0.2 / scale, /* saturate to 0 */
(float)1.0,
@@ -227,7 +101,7 @@ int fill_memory(const prb_t *p, dnn_mem_t &mem, const float *scales,
(float)scale,
};
- float value = saturate(gen[idx % 7], c_src.min, max);
+ float value = saturate(gen[idx % 7], c_src->min, max);
mem.set_elem(idx, value);
}
@@ -247,12 +121,12 @@ int reorder(const prb_t *p, dnn_mem_t &dst, const dnn_mem_t &src,
// const float dst_conf_min = c_dst.min;
// const float dst_conf_max = dst_conf_min + c_dst.range - 1;
- auto dst_width = dst.sizeof_dt()*8;
+ auto dst_width = dst.sizeof_dt() * 8;
- const float dst_dt_min = (dst_dt == mkldnn_u8) ?
- (float)0 : -(float)(1l << (dst_width - 1));
- const float dst_dt_max = (dst_dt == mkldnn_u8) ?
- (float)255 : (float)((1l << (dst_width - 1)) - 1);
+ const float dst_dt_min = dst_dt == mkldnn_u8
+ ? 0.f : -(float)(1l << (dst_width - 1));
+ const float dst_dt_max = dst_dt == mkldnn_u8
+ ? 255.f : (float)((1l << (dst_width - 1)) - 1);
/* TODO: add dst range support */
// const float dst_max = MIN2(dst_conf_max, dst_dt_max);
@@ -275,13 +149,14 @@ int reorder(const prb_t *p, dnn_mem_t &dst, const dnn_mem_t &src,
switch (p->attr.irmode) {
case attr_t::NEAREST: dst_ = rint(dst_); break;
case attr_t::DOWN: dst_ = floorf(dst_); break;
- default: assert(!"bad int round_mode");
+ default: assert(!"unknown round_mode");
}
dst_ = saturate(dst_, dst_min, dst_max);
}
dst.set_elem(idx, dst_);
}
+
return OK;
}
@@ -297,10 +172,10 @@ int compare(const prb_t *p, dnn_mem_t &mem_expected, dnn_mem_t &mem_computed,
const auto dt = mem_expected.dt();
const size_t width = mem_expected.sizeof_dt()*8;
- const float dt_min = (dt == mkldnn_u8) ?
- (float)0 : -(float)(1l << (width - 1));
- const float dt_max = (dt == mkldnn_u8) ?
- (float)255 : (float)((1l << (width - 1)) - 1);
+ const float dt_min = dt == mkldnn_u8
+ ? 0.f : -(float)(1l << (width - 1));
+ const float dt_max = dt == mkldnn_u8
+ ? 255.f : (float)((1l << (width - 1)) - 1);
size_t inf_p = 0, inf_n = 0, zeros = 0, reg = 0;
@@ -332,15 +207,15 @@ int compare(const prb_t *p, dnn_mem_t &mem_expected, dnn_mem_t &mem_computed,
if (scales[i] > max_scale) max_scale = scales[i];
}
- const auto c_src = p->conf_in;
- const auto c_dst = p->conf_out;
- const int c_src_max = c_src.min + c_src.range - 1;
- const int c_dst_max = c_dst.min + c_dst.range - 1;
+ dt_conf_t c_src = p->conf_in;
+ dt_conf_t c_dst = p->conf_out;
+ const int c_src_max = c_src->min + c_src->range - 1;
+ const int c_dst_max = c_dst->min + c_dst->range - 1;
bool check_inf_p = (dt != mkldnn_f32 && dt != mkldnn_s32)
&& (c_src_max * max_scale > c_dst_max) ? true : false;
bool check_inf_n = (dt != mkldnn_f32 && dt != mkldnn_s32)
- && (c_src.min * max_scale < c_dst.min) ? true : false;
+ && (c_src->min * max_scale < c_dst->min) ? true : false;
bool check_zeros = (dt != mkldnn_f32)
&& (dt_min != 0 && dt_max != 0) ? true : false;
@@ -353,4 +228,139 @@ int compare(const prb_t *p, dnn_mem_t &mem_expected, dnn_mem_t &mem_computed,
return r->state == FAILED ? FAIL : OK;
}
+int check_reorder(const prb_t *p, res_t *res) {
+/* ___________________
+ * | |
+ * | performance timer |
+ * |___________________|
+ * |
+ * _______________ ______________ V ________________
+ * | | MKL-DNN | | MKL-DNN | |
+ * | dt_in fmt_ref |-------->| dt_in fmt_in |-------->| dt_out fmt_out |
+ * |_______________| |______________| ^ |________________|
+ * | | |
+ * benchdnn |<-------------------------------- scales | MKL-DNN
+ * ________V_______ _______V________
+ * | | | |
+ * | dt_out fmt_ref | <= compare => | dt_out fmt_ref |
+ * |________________| |________________|
+ *
+ * Steps:
+ * 1. create memory
+ * 2. fill scales
+ * 3. fill input memory
+ * 4. execute mkl-dnn: reorder->q10n->reorder
+ * 5. execute benchdnn: q10n
+ * 6. compare results
+ * 7. performance measurment
+ * 8. clean up
+ */
+
+ const reorder_conf_t &r = p->reorder;
+ const int ndims = (int)r.dims.size();
+ const int *dims = &r.dims[0];
+
+ mkldnn_memory_format_t fmt_ref;
+ const bool is_data = fmt2data_kind(r.fmt_in) == DATA;
+ const bool is_gwei = fmt2data_kind(r.fmt_in) == GWEI;
+
+ switch (ndims) {
+ case 1: assert(is_data); fmt_ref = mkldnn_x; break;
+ case 2: fmt_ref = is_data ? mkldnn_nc : mkldnn_oi; break;
+ case 3: assert(is_data); fmt_ref = mkldnn_tnc; break;
+ case 4: fmt_ref = is_data ? mkldnn_nchw : mkldnn_oihw; break;
+ case 5:
+ fmt_ref = is_data
+ ? mkldnn_ncdhw
+ : (is_gwei ? mkldnn_goihw : mkldnn_oidhw);
+ break;
+ case 6: assert(!is_data);
+ fmt_ref = is_gwei ? mkldnn_goidhw : mkldnn_ldigo;
+ break;
+ default: assert(!"bad ndims"); return FAIL;
+ }
+
+ /* Step 1: create memory */
+ dnn_mem_t mem_dt_in_fmt_ref(ndims, dims, p->conf_in->dt, fmt_ref);
+ dnn_mem_t mem_dt_in_fmt_in(ndims, dims, p->conf_in->dt, r.fmt_in);
+ dnn_mem_t mem_dt_out_fmt_out(ndims, dims, p->conf_out->dt, r.fmt_out);
+ dnn_mem_t mem_dt_out_fmt_ref(ndims, dims, p->conf_out->dt, fmt_ref);
+ dnn_mem_t mem_test_dt_out_fmt_ref(ndims, dims, p->conf_out->dt, fmt_ref);
+
+ /* Step 2: fill scales */
+ int count = 0, mask = 0;
+ SAFE(scales_count(&count, &mask, mem_dt_out_fmt_out, p->attr), WARN);
+ float *scales = (float *)zmalloc(sizeof(float) * count, 64);
+ SAFE(scales != NULL ? OK : FAIL, CRIT);
+ SAFE(fill_scales(p, scales, count), WARN);
+ /* Step 3: fill input memory */
+ SAFE(fill_memory(p, mem_dt_in_fmt_ref, scales, p->attr), WARN);
+
+ /* Step 4: execute mkl-dnn */
+ SAFE(mem_dt_in_fmt_in.reorder(mem_dt_in_fmt_ref), WARN);
+
+ auto mkldnn_attr = create_mkldnn_attr(p->attr, count, mask, scales);
+
+ mkldnn_primitive_desc_t check_rpd;
+ mkldnn_status_t init_status = mkldnn_reorder_primitive_desc_create_v2(
+ &check_rpd, mem_dt_in_fmt_in.mpd_, mem_dt_out_fmt_out.mpd_,
+ mkldnn_attr);
+ if (init_status == mkldnn_unimplemented) {
+ mkldnn_primitive_attr_destroy(mkldnn_attr);
+ return res->state = UNIMPLEMENTED, OK;
+ }
+ SAFE(init_status, WARN);
+
+ SAFE(mem_dt_out_fmt_out.reorder(mem_dt_in_fmt_in, mkldnn_attr), WARN);
+ SAFE(mem_dt_out_fmt_ref.reorder(mem_dt_out_fmt_out), WARN);
+
+ /* Step 5: execute benchdnn reorder */
+ SAFE(reorder(p, mem_test_dt_out_fmt_ref, mem_dt_in_fmt_ref, scales), WARN);
+
+ /* Step 6: compare results */
+ if (bench_mode & CORR) {
+ SAFE(compare(p, mem_test_dt_out_fmt_ref, mem_dt_out_fmt_ref,
+ scales, count, res), WARN);
+ }
+
+ /* Step 7: performance measurement */
+ if (bench_mode & PERF) {
+ mkldnn_primitive_desc_t perf_r_pd;
+ mkldnn_primitive_t perf_r;
+
+ DNN_SAFE(mkldnn_reorder_primitive_desc_create_v2(&perf_r_pd,
+ mem_dt_in_fmt_in.mpd_, mem_dt_out_fmt_out.mpd_,
+ mkldnn_attr), WARN);
+ mkldnn_primitive_at_t i = {mem_dt_in_fmt_in.p_, 0};
+ const_mkldnn_primitive_t o = mem_dt_out_fmt_out.p_;
+ DNN_SAFE(mkldnn_primitive_create(&perf_r, perf_r_pd, &i, &o), WARN);
+ DNN_SAFE_V(mkldnn_primitive_desc_destroy(perf_r_pd));
+
+ auto &t = res->timer;
+ t.reset();
+ while (true) {
+ SAFE(execute(perf_r), WARN);
+ t.stamp();
+ const bool stop = false
+ || (fix_times_per_prb && t.times() >= fix_times_per_prb)
+ || (!fix_times_per_prb
+ && t.total_ms() >= max_ms_per_prb
+ && t.times() >= min_times_per_prb);
+ if (stop) break;
+ }
+
+ DNN_SAFE_V(mkldnn_primitive_destroy(perf_r));
+ }
+
+ /* Step 8: clean up */
+ mkldnn_primitive_attr_destroy(mkldnn_attr);
+ zfree(scales);
+
+ return OK;
+}
+
+int doit(const prb_t *p, res_t *r) {
+ return check_reorder(p, r);
+}
+
}