Tensor原地操作(inplace接口)是一种优化技术,全局申请、保留LocalTensor内存,避免了频繁创建和销毁LocalTensor对象。AllocTensor、FreeTensor、EnQue、DeQue接口不产生新的LocalTensor,而是在该全局LocalTensor上反复申请、释放、入队、出队。其实现原理如下图所示:
图 1 Tensor原地操作实现原理[object Object][object Object]
- 减少栈变换:相比构造新Tensor的方式,inplace接口减少了LocalTensor的栈变换,允许Tensor被反复使用。
- 减少入队/出队操作:在调用EnQue、DeQue的过程中,TQue对象没有存储该Tensor对应的Buffer地址,实际没有真正入队、出队,减少了反复入队、出队的Scalar指令。
既然Tensor原地操作没有执行真正的入队出队操作,为什么还需要保留EnQue和DeQue接口呢?
- 编程兼容性:为了保持编程接口的一致性,inplace接口仍然需要调用EnQue和DeQue,确保代码结构的统一性和可维护性。
- 内存同步功能:EnQue和DeQue操作中实现了内存读写同步功能,确保数据的一致性和正确性,即使没有实际的队列操作,这些同步机制仍然需要保留。
适合计算循环次数多的场景:如所示,inplace接口虽然增加了TQue对象InitBuffer的初始化开销,但显著减少了每次循环中AllocTensor、EnQue、DeQue和FreeTensor内部对LocalTensor和事件的操作次数,特别适合需要多次循环来完成计算的场景。
- 配置TQue对象:在创建TQue对象时,设置深度(depth)为0,启用inplace操作模式。
- 调用原地操作接口:使用inplace接口直接操作LocalTensor。
[object Object]