Skip to content

Commit

Permalink
Avoid redundant memcpy when reorder not in-place (apache#20746)
Browse files Browse the repository at this point in the history
Co-authored-by: Bartlomiej Gawrych <barlomiej.gawrych@intel.com>
  • Loading branch information
bgawrych and Bartlomiej Gawrych authored Dec 24, 2021
1 parent d008356 commit a670f58
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions src/ndarray/ndarray.cc
Original file line number Diff line number Diff line change
Expand Up @@ -540,13 +540,20 @@ void NDArray::Chunk::Reorder2Default() {

dnnl_format_tag_t format = dnnl_mem_->GetDefaultFormat();
dnnl::memory::desc def_desc = dnnl_mem_->GetDesc(format);
dnnl_mem_ptr def_mem(new dnnl::memory(def_desc, CpuEngine::Get()->get_engine()));
dnnl_mem_->ReorderTo(def_mem.get());

CHECK(shandle.size >= def_desc.get_size());
CheckAndAlloc(def_desc.get_size());
// TODO(zhengda) We need to avoid memory copy here.
memcpy(shandle.dptr, def_mem->get_data_handle(), def_desc.get_size());

// oneDNN reorder can't be performed in-place
if (shandle.dptr == dnnl_mem_->GetDataHandle()) {
dnnl_mem_ptr def_mem(new dnnl::memory(def_desc, CpuEngine::Get()->get_engine()));
dnnl_mem_->ReorderTo(def_mem.get());
memcpy(shandle.dptr, def_mem->get_data_handle(), def_desc.get_size());
} else {
dnnl_mem_ptr def_mem(new dnnl::memory(def_desc, CpuEngine::Get()->get_engine(), shandle.dptr));
dnnl_mem_->ReorderTo(def_mem.get());
}

dnnl_mem_ = nullptr;
}

Expand Down

0 comments on commit a670f58

Please sign in to comment.