昇腾社区首页
中文
注册
开发者
下载

内存优化

目前主要依据节点引用关系进行内存复用,为了提升复用效果,会尽量将占用大小相近的内存分配到同一个group内,然后在group内进行复用。

内存复用伪代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
for (node in all nodes) {
  for (output in node.outputs) {
    // 标记tensor的依赖数
    output->sch.depends = output->anchor->GetPeerInDataNodesSize();
    // try reuse from free queue
  }
  for (input in node.inputs) {
    input->sch.depends--;
    if (input->sch.depends == 0) {
        Enque(input->opt.reuse_id); // 标记为freeTensor,可以被后续节点复用
    } 
  }
}

对于部分API来说,输出可以直接复用输入,针对这一类API,可以采用Inplace复用,即输出直接复用输入内存。如下图所示,Inplace复用前需要3块内存:

Inplace复用后只需要2块内存: