blob: 50cf9991610d57ed7905ba5027ef2f3eb9ec3cb3 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>mxnet: Memory</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">mxnet
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="modules.html"><span>Modules</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">Memory<div class="ingroups"><a class="el" href="group__c__api.html">C API</a> &raquo; <a class="el" href="group__c__api__primitive.html">Primitive operations</a></div></div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Collaboration diagram for Memory:</div>
<div class="dyncontent">
<center><table><tr><td><img src="group__c__api__memory.png" border="0" alt="" usemap="#group____c____api____memory"/>
<map name="group____c____api____memory" id="group____c____api____memory">
<area shape="rect" id="node1" href="group__c__api__primitive.html" title="Primitive operations" alt="" coords="5,5,155,32"/>
</map>
</td></tr></table></center>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:ga1c8e556a07a767a1b609ac6a52ba1ad0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga1c8e556a07a767a1b609ac6a52ba1ad0">mkldnn_memory_desc_init_by_strides</a> (<a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *memory_desc, int ndims, const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a> dims, <a class="el" href="group__c__api__types__generic.html#ga826b2a9be4d94ac17f99bacac6d0cb29">mkldnn_data_type_t</a> data_type, const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a> strides)</td></tr>
<tr class="separator:ga1c8e556a07a767a1b609ac6a52ba1ad0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa8895ff6e661d8fe1cdeae76e6e20bbc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#gaa8895ff6e661d8fe1cdeae76e6e20bbc">mkldnn_memory_desc_init_by_tag</a> (<a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *memory_desc, int ndims, const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a> dims, <a class="el" href="group__c__api__types__generic.html#ga826b2a9be4d94ac17f99bacac6d0cb29">mkldnn_data_type_t</a> data_type, <a class="el" href="group__c__api__types__generic.html#gacc2844e341ab1c4f5b7ae1c6068f2a2b">mkldnn_format_tag_t</a> tag)</td></tr>
<tr class="separator:gaa8895ff6e661d8fe1cdeae76e6e20bbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga65464ae3ae9131cb0e5163d9249e7d35"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga65464ae3ae9131cb0e5163d9249e7d35">mkldnn_memory_desc_init_submemory</a> (<a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *memory_desc, const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *parent_memory_desc, const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a> dims, const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a> offsets)</td></tr>
<tr class="separator:ga65464ae3ae9131cb0e5163d9249e7d35"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gadbe574936bc18227483b2ffe022bad63"><td class="memItemLeft" align="right" valign="top">int MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#gadbe574936bc18227483b2ffe022bad63">mkldnn_memory_desc_equal</a> (const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *lhs, const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *rhs)</td></tr>
<tr class="separator:gadbe574936bc18227483b2ffe022bad63"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7d4815fb696ab92600660040b4137958"><td class="memItemLeft" align="right" valign="top">size_t MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga7d4815fb696ab92600660040b4137958">mkldnn_memory_desc_get_size</a> (const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *memory_desc)</td></tr>
<tr class="memdesc:ga7d4815fb696ab92600660040b4137958"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the size (in bytes) that is required for given <code>memory_desc</code>. <a href="#ga7d4815fb696ab92600660040b4137958">More...</a><br /></td></tr>
<tr class="separator:ga7d4815fb696ab92600660040b4137958"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga16a5d3f01dd47973868ef49241a2d4ef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga16a5d3f01dd47973868ef49241a2d4ef">mkldnn_memory_create</a> (<a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a> *memory, const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *memory_desc, <a class="el" href="group__c__api__engine__types.html#ga40f5f917cdbf2215fa5324e4bf62d523">mkldnn_engine_t</a> engine, void *handle)</td></tr>
<tr class="separator:ga16a5d3f01dd47973868ef49241a2d4ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3b9649ef5812e7ab642aa506f02eafda"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga3b9649ef5812e7ab642aa506f02eafda">mkldnn_memory_get_memory_desc</a> (<a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a> memory, const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> **memory_desc)</td></tr>
<tr class="memdesc:ga3b9649ef5812e7ab642aa506f02eafda"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a <code>memory_desc</code> associated with <code>memory</code>. <a href="#ga3b9649ef5812e7ab642aa506f02eafda">More...</a><br /></td></tr>
<tr class="separator:ga3b9649ef5812e7ab642aa506f02eafda"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6b50538dbdab8f767bb6f734403d79f2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga6b50538dbdab8f767bb6f734403d79f2">mkldnn_memory_get_engine</a> (<a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a> memory, <a class="el" href="group__c__api__engine__types.html#ga40f5f917cdbf2215fa5324e4bf62d523">mkldnn_engine_t</a> *engine)</td></tr>
<tr class="memdesc:ga6b50538dbdab8f767bb6f734403d79f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an <code>engine</code> associated with <code>memory</code>. <a href="#ga6b50538dbdab8f767bb6f734403d79f2">More...</a><br /></td></tr>
<tr class="separator:ga6b50538dbdab8f767bb6f734403d79f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1d4cae434757c698b00c340f00323382"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga1d4cae434757c698b00c340f00323382">mkldnn_memory_map_data</a> (<a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a> memory, void **mapped_ptr)</td></tr>
<tr class="separator:ga1d4cae434757c698b00c340f00323382"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac61b4fdaad4d6af2e1ea4e0d30ef29cb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#gac61b4fdaad4d6af2e1ea4e0d30ef29cb">mkldnn_memory_unmap_data</a> (<a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a> memory, void *mapped_ptr)</td></tr>
<tr class="separator:gac61b4fdaad4d6af2e1ea4e0d30ef29cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga569c83ad7ecf0d0c037e41eb7e4a3da7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga569c83ad7ecf0d0c037e41eb7e4a3da7">mkldnn_memory_get_data_handle</a> (<a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a> memory, void **handle)</td></tr>
<tr class="separator:ga569c83ad7ecf0d0c037e41eb7e4a3da7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga759fb1b03264d81b93803b9b56588a54"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga759fb1b03264d81b93803b9b56588a54">mkldnn_memory_set_data_handle</a> (<a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a> memory, void *handle)</td></tr>
<tr class="memdesc:ga759fb1b03264d81b93803b9b56588a54"><td class="mdescLeft">&#160;</td><td class="mdescRight">For a <code>memory</code>, sets the data <code>handle</code>. <a href="#ga759fb1b03264d81b93803b9b56588a54">More...</a><br /></td></tr>
<tr class="separator:ga759fb1b03264d81b93803b9b56588a54"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga2567f3d792b44853b684825fc5f82bd9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga2567f3d792b44853b684825fc5f82bd9">mkldnn_memory_get_ocl_mem_object</a> (<a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a> memory, cl_mem *mem_object)</td></tr>
<tr class="memdesc:ga2567f3d792b44853b684825fc5f82bd9"><td class="mdescLeft">&#160;</td><td class="mdescRight">For a <code>memory</code> returns the OpenCL memory object associated with it. <a href="#ga2567f3d792b44853b684825fc5f82bd9">More...</a><br /></td></tr>
<tr class="separator:ga2567f3d792b44853b684825fc5f82bd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad2c21c06e990836b1f05367e0e484501"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#gad2c21c06e990836b1f05367e0e484501">mkldnn_memory_set_ocl_mem_object</a> (<a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a> memory, cl_mem mem_object)</td></tr>
<tr class="memdesc:gad2c21c06e990836b1f05367e0e484501"><td class="mdescLeft">&#160;</td><td class="mdescRight">For a <code>memory</code> sets the OpenCL memory object associated with it. <a href="#gad2c21c06e990836b1f05367e0e484501">More...</a><br /></td></tr>
<tr class="separator:gad2c21c06e990836b1f05367e0e484501"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga505acdd7d07d543098fef63261f57c30"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__c__api__memory.html#ga505acdd7d07d543098fef63261f57c30">mkldnn_memory_destroy</a> (<a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a> memory)</td></tr>
<tr class="memdesc:ga505acdd7d07d543098fef63261f57c30"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deletes a <code>memory</code>. <a href="#ga505acdd7d07d543098fef63261f57c30">More...</a><br /></td></tr>
<tr class="separator:ga505acdd7d07d543098fef63261f57c30"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>A primitive to describe and store data.</p>
<p>The library supports various data types and formats. Memory hierarchy consists of three levels of abstraction:</p><ol type="1">
<li><b>Memory descriptor</b> &ndash; engine agnostic logical description of data (number of dimensions, dimensions themselves, and data type), and optionally the format/layout that describes the physical representation of data in memory. If the format is not known yet, one can pass <a class="el" href="group__c__api__types__generic.html#ggacc2844e341ab1c4f5b7ae1c6068f2a2bab7f14a435b0c6373badb9b3f296e6c1f">mkldnn_format_tag_any</a>. This approach is used to allow compute-intensive primitives to specify the most appropriate format on their own with users required to reorder the data if the incoming format doesn't match the primitive's selection. Memory descriptor can be initialized with <a class="el" href="group__c__api__memory.html#gaa8895ff6e661d8fe1cdeae76e6e20bbc">mkldnn_memory_desc_init_by_tag()</a> or <a class="el" href="group__c__api__memory.html#ga1c8e556a07a767a1b609ac6a52ba1ad0">mkldnn_memory_desc_init_by_strides()</a> functions, or by directly filling the <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> structure. The latter requires deep knowledge of how the physical data representation is mapped to the structure. The dev_guide_understanding_memory_formats topic should shed some light on that. For the fully defined memory descriptors (i.e. where the format kind is not equal to <a class="el" href="group__c__api__types__generic.html#gga1f6c390306d4c8a438c0efbff08c0539a25ba80bb864a69c9fae70b4503e76167">mkldnn_format_kind_any</a>) a user can the size, using the <a class="el" href="group__c__api__memory.html#ga7d4815fb696ab92600660040b4137958" title="Returns the size (in bytes) that is required for given memory_desc. ">mkldnn_memory_desc_get_size()</a> function. As described in dev_guide_understanding_memory_formats, the size of data sometimes cannot be computed as the product of dimensions times the size of the data type. So users are encouraged to use this function for better code portability. Two memory descriptors can be compared with <a class="el" href="group__c__api__memory.html#gadbe574936bc18227483b2ffe022bad63">mkldnn_memory_desc_equal()</a>. The comparison is especially useful when checking whether a primitive requires reorder from the user's data format to the primitive's format.</li>
<li><b>Memory</b> &ndash; an engine-specific object that handles the data and its description (a memory descriptor). For CPU enigne, the data handle is simply a pointer to <code>void</code>. The data handle can be queried using <a class="el" href="group__c__api__memory.html#ga569c83ad7ecf0d0c037e41eb7e4a3da7">mkldnn_memory_get_data_handle()</a> and set using <a class="el" href="group__c__api__memory.html#ga759fb1b03264d81b93803b9b56588a54" title="For a memory, sets the data handle. ">mkldnn_memory_set_data_handle()</a>. The latter function always sets the memory in the padding region to zero, which is the invariant maintained by all the primitives in Intel MKL-DNN. See dev_guide_understanding_memory_formats for more details. A memory can be created using <a class="el" href="group__c__api__memory.html#ga16a5d3f01dd47973868ef49241a2d4ef">mkldnn_memory_create()</a> function. A memory can also be queried for the underlying memory descriptor and engine using <a class="el" href="group__c__api__memory.html#ga3b9649ef5812e7ab642aa506f02eafda" title="Returns a memory_desc associated with memory. ">mkldnn_memory_get_memory_desc()</a> and <a class="el" href="group__c__api__memory.html#ga6b50538dbdab8f767bb6f734403d79f2" title="Returns an engine associated with memory. ">mkldnn_memory_get_engine()</a> functions.</li>
</ol>
<p>Along with ordinary memory with all dimensions being positive, Intel MKL-DNN supports <em>zero-volume</em> memory with one or more dimensions set to zero. This is to support the NumPy* convention. If a <em>zero-volume</em> memory is passed to a primitive, the primitive does not perform any computations on this memory. For example:</p><ul>
<li>Convolution with <code>(0 batch, 3 input channels, 13 height, 13 width)</code> source and <code>(16 output channels, 3 inputs, channel, 3 height, 3 width)</code> weights would produce <code>(0 batch, 16 output channels, 11 height, 11 width)</code> destination (assuming strides are <code>1</code> and paddings are zero) and perform zero multiply-add operations.</li>
<li>Concatenation of three memories of shapes <code>(3, 4, 13, 13)</code>, <code>(3, 0, 13, 13)</code>, and <code>(3, 1, 13, 13)</code> along the second axis would produce the output of the shape <code>(3, 5, 13, 13)</code>, effectively ignoring the second input (however, if the user created a concatenation primitive descriptor with three inputs they should also provide all three memories to the concatenation primitive, including the one with zero second dimension).</li>
<li>However, Intel MKL-DNN would return an error when attempting to create a convolution with <em>zero-volume</em> memory passed for weights because such a convolution is not well-defined: <div class="fragment"><div class="line">dst(1, 16, 11, 11) &lt;-- src(1, 0, 13, 13) (*) wei(16, 0, 3, 3)</div></div><!-- fragment --> Should the values in the destination be zeroes or just not accessed at all? Moreover, backward pass w.r.t. weights in such cases is also not well-defined.</li>
</ul>
<p>Data handle of <em>zero-volume</em> memory is never accessed and hence can be unset (NULL in case of CPU engine).</p>
<dl class="section see"><dt>See also</dt><dd>dev_guide_understanding_memory_formats </dd></dl>
<h2 class="groupheader">Function Documentation</h2>
<a class="anchor" id="ga16a5d3f01dd47973868ef49241a2d4ef"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_create </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a> *&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>memory_desc</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__c__api__engine__types.html#ga40f5f917cdbf2215fa5324e4bf62d523">mkldnn_engine_t</a>&#160;</td>
<td class="paramname"><em>engine</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>handle</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Creates a memory for given <code>memory_desc</code> and <code>engine</code>. Also sets <code>handle</code> to one of the following:</p><ul>
<li>pointer to the user allocated memory, i.e. valid handle. In this case the library doesn't own allocated memory.</li>
<li>MKLDNN_MEMORY_ALLOCATE to ask the library to allocate and attach memory. In this case the library owns allocated memory.</li>
<li>MKLDNN_MEMORY_NONE to create <a class="el" href="structmkldnn__memory.html">mkldnn_memory</a> w/o attached memory. </li>
</ul>
</div>
</div>
<a class="anchor" id="gadbe574936bc18227483b2ffe022bad63"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int MKLDNN_API mkldnn_memory_desc_equal </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>lhs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>rhs</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Compares two memory descriptors. </p><dl class="section return"><dt>Returns</dt><dd>1 if the descriptors are the same. </dd>
<dd>
0 if the descriptors are different.</dd></dl>
<p>Use this function to identify whether a reorder is required between the two memories </p>
</div>
</div>
<a class="anchor" id="ga7d4815fb696ab92600660040b4137958"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t MKLDNN_API mkldnn_memory_desc_get_size </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>memory_desc</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns the size (in bytes) that is required for given <code>memory_desc</code>. </p>
</div>
</div>
<a class="anchor" id="ga1c8e556a07a767a1b609ac6a52ba1ad0"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_desc_init_by_strides </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>memory_desc</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>ndims</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a>&#160;</td>
<td class="paramname"><em>dims</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__c__api__types__generic.html#ga826b2a9be4d94ac17f99bacac6d0cb29">mkldnn_data_type_t</a>&#160;</td>
<td class="paramname"><em>data_type</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a>&#160;</td>
<td class="paramname"><em>strides</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initializes a <code>memory_desc</code> memory descriptor using <code>ndims</code>, <code>dims</code>, <code>data_type</code>, and <code>strides</code>.</p>
<p>The <code>strides</code> might be NULL, which means the order of physical dimensions is the same as the order of logical ones.</p>
<dl class="section note"><dt>Note</dt><dd>The logical order of dimensions is defined by a primitive that consumes the memory. </dd></dl>
</div>
</div>
<a class="anchor" id="gaa8895ff6e661d8fe1cdeae76e6e20bbc"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_desc_init_by_tag </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>memory_desc</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>ndims</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a>&#160;</td>
<td class="paramname"><em>dims</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__c__api__types__generic.html#ga826b2a9be4d94ac17f99bacac6d0cb29">mkldnn_data_type_t</a>&#160;</td>
<td class="paramname"><em>data_type</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__c__api__types__generic.html#gacc2844e341ab1c4f5b7ae1c6068f2a2b">mkldnn_format_tag_t</a>&#160;</td>
<td class="paramname"><em>tag</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initializes a <code>memory_desc</code> memory descriptor using <code>ndims</code>, <code>dims</code>, <code>data_type</code>, and format <code>tag</code>.</p>
<p><code>tag</code> can be <a class="el" href="group__c__api__types__generic.html#ggacc2844e341ab1c4f5b7ae1c6068f2a2bab7f14a435b0c6373badb9b3f296e6c1f">mkldnn_format_tag_any</a>, which allows a primitive to define the appropriate memory format. In this case, the <code>format_kind</code> would be set to <a class="el" href="group__c__api__types__generic.html#gga1f6c390306d4c8a438c0efbff08c0539a25ba80bb864a69c9fae70b4503e76167">mkldnn_format_kind_any</a> </p>
</div>
</div>
<a class="anchor" id="ga65464ae3ae9131cb0e5163d9249e7d35"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_desc_init_submemory </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>memory_desc</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> *&#160;</td>
<td class="paramname"><em>parent_memory_desc</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a>&#160;</td>
<td class="paramname"><em>dims</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__c__api__types__memory.html#ga172d58716d5d4d104a05ed79a21dfec8">mkldnn_dims_t</a>&#160;</td>
<td class="paramname"><em>offsets</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initializes a <code>memory_desc</code> for a given <code>parent_memory_desc</code>, with <code>dims</code> sizes and <code>offsets</code>. May fail if layout used does not allow obtain desired submemory. In this case consider using <code>extract</code> or <code>insert</code> primitive </p>
</div>
</div>
<a class="anchor" id="ga505acdd7d07d543098fef63261f57c30"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_destroy </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Deletes a <code>memory</code>. </p>
</div>
</div>
<a class="anchor" id="ga569c83ad7ecf0d0c037e41eb7e4a3da7"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_get_data_handle </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void **&#160;</td>
<td class="paramname"><em>handle</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>For a <code>memory</code>, returns the data <code>handle</code>.</p>
<p>For the CPU engine, the data handle is a pointer to the actual data. </p>
</div>
</div>
<a class="anchor" id="ga6b50538dbdab8f767bb6f734403d79f2"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_get_engine </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__c__api__engine__types.html#ga40f5f917cdbf2215fa5324e4bf62d523">mkldnn_engine_t</a> *&#160;</td>
<td class="paramname"><em>engine</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns an <code>engine</code> associated with <code>memory</code>. </p>
</div>
</div>
<a class="anchor" id="ga3b9649ef5812e7ab642aa506f02eafda"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_get_memory_desc </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="structmkldnn__memory__desc__t.html">mkldnn_memory_desc_t</a> **&#160;</td>
<td class="paramname"><em>memory_desc</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns a <code>memory_desc</code> associated with <code>memory</code>. </p>
</div>
</div>
<a class="anchor" id="ga2567f3d792b44853b684825fc5f82bd9"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_get_ocl_mem_object </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">cl_mem *&#160;</td>
<td class="paramname"><em>mem_object</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>For a <code>memory</code> returns the OpenCL memory object associated with it. </p>
</div>
</div>
<a class="anchor" id="ga1d4cae434757c698b00c340f00323382"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_map_data </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void **&#160;</td>
<td class="paramname"><em>mapped_ptr</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>For a <code>memory</code>, maps the data of the memory to <code>mapped_ptr</code>.</p>
<p>Mapping allows to read/write directly from/to the memory contents for engines that do not support direct memory access.</p>
<p>Mapping is an exclusive operation - a memory object cannot be used in other operations until this memory object is unmapped.</p>
<dl class="section note"><dt>Note</dt><dd>Any primitives working with <code>memory</code> should be completed before mapping the memory. Use mkldnn_stream_wait to synchronize the corresponding execution stream.</dd>
<dd>
Map/unmap API is provided mainly for debug/testing purposes and its performance may be suboptimal. </dd></dl>
</div>
</div>
<a class="anchor" id="ga759fb1b03264d81b93803b9b56588a54"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_set_data_handle </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>handle</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>For a <code>memory</code>, sets the data <code>handle</code>. </p>
</div>
</div>
<a class="anchor" id="gad2c21c06e990836b1f05367e0e484501"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_set_ocl_mem_object </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gacf7d7938936d5422bbd63ccb54efb336">mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">cl_mem&#160;</td>
<td class="paramname"><em>mem_object</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>For a <code>memory</code> sets the OpenCL memory object associated with it. </p>
</div>
</div>
<a class="anchor" id="gac61b4fdaad4d6af2e1ea4e0d30ef29cb"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__c__api__types__generic.html#ga31866789b66acfb1c28b2f9bdd7bdfdd">mkldnn_status_t</a> MKLDNN_API mkldnn_memory_unmap_data </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__c__api__types__memory.html#gac10931d394b31cbf5d2c3b5d814f86e2">const_mkldnn_memory_t</a>&#160;</td>
<td class="paramname"><em>memory</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>mapped_ptr</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>For a <code>memory</code>, unmaps a mapped pointer to the data of the memory.</p>
<p>Any changes of the mapped data are synchronized back to the memory after the call is complete. The mapped pointer must be obtained through a mkldnn_memory_map_data call.</p>
<dl class="section note"><dt>Note</dt><dd>Map/unmap API is provided mainly for debug/testing purposes and its performance may be suboptimal. </dd></dl>
</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Sat Mar 28 2020 00:52:31 for mxnet by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.11
</small></address>
</body>
</html>