asc.language.fwk.TPipe.init_buffer
TPipe.init_buffer(que: TQue, num: int = 0, len: int = 0) → None
TPipe.init_buffer(buf: TBuf, num: int = 0) → None
用于为TQue等队列和TBuf分配内存。
对应的Ascend C函数原型
template <class T>
__aicore__ inline bool InitBuffer(T& que, uint8_t num, uint32_t len)
template <TPosition bufPos>
__aicore__ inline bool InitBuffer(TBuf<bufPos>& buf, uint32_t len)
参数说明
- que:需要分配内存的TQue等对象。
- num:分配内存块的个数。double buffer功能通过该参数开启:num设置为1,表示不开启double buffer;num设置为2,表示开启double buffer。
- len:每个内存块的大小,单位为字节。当传入的len不满足32字节对齐时,API内部会自动向上补齐至32字节对齐,后续的数据搬运过程会涉及非对齐处理,具体内容请参考非对齐场景。
- buf:需要分配内存的TBuf对象。
- len:为TBuf分配的内存大小,单位为字节。当传入的len不满足32字节对齐时,API内部会自动向上补齐至32字节对齐,后续的数据搬运过程会涉及非对齐处理,具体内容请参考非对齐场景。
约束说明
- init_buffer申请的内存会在TPipe对象销毁时通过析构函数自动释放,无需手动释放。
- 如果需要重新分配init_buffer申请的内存,可以调用reset,再调用init_buffer接口。
- 一个kernel中所有使用的Buffer数量之和不能超过64。
调用示例
# 为TQue分配内存,分配内存块数为2,每块大小为128字节
pipe = asc.Tpipe()
que = asc.TQue(asc.TPosition.VECOUT, 2)
num = 2
len = 128
pipe.init_buffer(que=que, num=num, len=len)
# 为TBuf分配内存,分配长度为128字节
pipe = asc.Tpipe()
buf = asc.TBuf(asc.TPosition.A1)
len = 128
pipe.init_buffer(buf=buf, num=len)