内存优化
目前主要依据节点引用关系进行内存复用,为了提升复用效果,会尽量将占用大小相近的内存分配到同一个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块内存:

父主题: Schedule