This example demonstrates memory format propagation, which is critical for deep learning applications performance.
#include <iostream>
#include <sstream>
#include <string>
#include "example_utils.hpp"
void memory_format_propagation_tutorial(
engine::kind engine_kind) {
const int N = 1, H = 14, W = 14, IC = 256, OC = IC, KH = 3, KW = 3;
);
);
auto conv_dst_md = conv_src_md;
auto pool_dst_md = conv_dst_md;
conv_src_md, conv_weights_md,
conv_dst_md,
{1, 1},
{1, 1}, {1, 1}},
eng);
conv_pd.dst_desc(), pool_dst_md,
{1, 1}, {KH, KW},
{1, 1}, {1, 1}},
eng);
eng);
eng);
eng);
bool need_reorder_src = conv_pd.src_desc() != src_mem.get_desc();
bool need_reorder_weights
bool need_reorder_dst = conv_pd.dst_desc() != dst_mem.
get_desc();
auto conv_src_mem
= need_reorder_src ?
memory(conv_pd.src_desc(), eng) : src_mem;
auto conv_weights_mem = need_reorder_weights
?
memory(conv_pd.weights_desc(), eng)
: weights_mem;
auto conv_dst_mem =
memory(conv_pd.dst_desc(), eng);
auto pool_dst_mem
if (need_reorder_src) {
auto reorder_src =
reorder(src_mem, conv_src_mem);
reorder_src.execute(
}
if (need_reorder_weights) {
auto reorder_weights =
reorder(weights_mem, conv_weights_mem);
reorder_weights.execute(s,
}
auto conv_scratchpad_mem =
memory(conv_pd.scratchpad_desc(), eng);
conv.execute(s,
pool.execute(
if (need_reorder_dst) {
auto reorder_dst =
reorder(pool_dst_mem, dst_mem);
reorder_dst.execute(
}
}
int main(int argc, char **argv) {
return handle_example_errors(
memory_format_propagation_tutorial, parse_engine_kind(argc, argv));
}
@ pooling_max
Max pooling.
Definition dnnl.hpp:543
@ convolution_auto
Convolution algorithm that is chosen to be either direct or Winograd automatically.
Definition dnnl.hpp:480
@ forward_inference
Forward data propagation (inference mode).
Definition dnnl.hpp:449
#define DNNL_ARG_DST
A special mnemonic for destination argument for primitives that have a single destination.
Definition dnnl_types.h:1806
#define DNNL_ARG_FROM
A special mnemonic for reorder source argument.
Definition dnnl_types.h:1788
#define DNNL_ARG_SRC
A special mnemonic for source argument for primitives that have a single source.
Definition dnnl_types.h:1782
#define DNNL_ARG_WEIGHTS
A special mnemonic for primitives that have a single weights argument.
Definition dnnl_types.h:1829
#define DNNL_ARG_TO
A special mnemonic for reorder destination argument.
Definition dnnl_types.h:1809
oneDNN namespace
Definition dnnl.hpp:81
Primitive descriptor for a convolution forward propagation primitive.
Definition dnnl.hpp:3746
memory::desc dst_desc() const
Returns a destination memory descriptor.
Definition dnnl.hpp:3799
Convolution forward propagation primitive.
Definition dnnl.hpp:3540
An execution engine.
Definition dnnl.hpp:844
kind
Kinds of engines.
Definition dnnl.hpp:849
A memory descriptor.
Definition dnnl.hpp:1729
Memory object.
Definition dnnl.hpp:1188
@ any
Placeholder memory format tag.
Definition dnnl.hpp:1287
@ oihw
4D CNN weights tensor; an alias for dnnl::memory::format_tag::abcd
Definition dnnl.hpp:1382
@ nchw
4D CNN activations tensor; an alias for dnnl::memory::format_tag::abcd
Definition dnnl.hpp:1359
@ f32
32-bit/single-precision floating point.
Definition dnnl.hpp:1216
desc get_desc() const
Returns the associated memory descriptor.
Definition dnnl.hpp:2010
Primitive descriptor for a pooling forward propagation primitive.
Definition dnnl.hpp:5278
Pooling forward propagation primitive.
Definition dnnl.hpp:5225
memory::desc scratchpad_desc() const
Returns the scratchpad memory descriptor.
Definition dnnl.hpp:2962
memory::desc weights_desc(int idx) const
Returns a weights memory descriptor.
Definition dnnl.hpp:2879
Reorder primitive.
Definition dnnl.hpp:3118
An execution stream.
Definition dnnl.hpp:1047
stream & wait()
Waits for all primitives executing in the stream to finish.
Definition dnnl.hpp:1107