WriteSpmBuffer
Applicability
Product |
Supported |
|---|---|
√ |
|
√ |
|
x |
|
√ |
|
x |
|
√ |
Function
Copies the data to be overflowed and temporarily stored to the SPM buffer.
Prototype
- Applicable to continuous and discontinuous temporary data storage:
1 2
template <typename T> __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeBuffer, const DataCopyParams& copyParams, int32_t writeOffset = 0)
- Applicable to continuous temporary data storage:
1 2
template <typename T> __aicore__ inline void WriteSpmBuffer(const LocalTensor<T>& writeBuffer, const int32_t writeSize, int32_t writeOffset = 0)
Parameters
Parameter |
Input/Output |
Description |
|---|---|---|
writeBuffer |
Input |
Local memory to be overflowed and temporarily stored. |
copyParams |
Input |
Movement parameter, DataCopyParams type. For details about the structure definition of DataCopyParams, see Table 2. |
writeSize |
Input |
Number of copied elements. |
writeOffset |
Input |
Offset copied to the SPM buffer, in bytes. |
Parameter |
Description |
|---|---|
blockCount |
Number of contiguous data blocks to be transferred, which is of the uint16_t type. The value range is [1, 4095]. |
blockLen |
Length of each contiguous data block to be transferred, in the unit of DataBlock (32 bytes). The value is of the uint16_t type. The value range is [1, 65535]. For dst in C2PIPE2GM, the unit is 128 bytes. For dst in C2, it indicates the length of contiguous data blocks for source operand transfer, with the unit being 64 bytes. |
srcGap |
Interval between adjacent contiguous data blocks of the source operand (the interval between the end of the preceding block and the start of the next block). The unit is DataBlock (32 bytes). The value is of the uint16_t type and must not exceed the value range of this data type. In the scenario of L1 Buffer -> Fixpipe Buffer, srcGap refers to the interval between adjacent contiguous data blocks of the source operand (the interval between the start of the preceding block and the start of the next block). The unit is DataBlock (32 bytes). The value is of the uint16_t type and must not exceed the value range of this data type. |
dstGap |
Interval between adjacent contiguous data blocks of the destination operand (the interval between the end of the preceding block and the start of the next block). The unit is DataBlock (32 bytes). The value is of the uint16_t type and must not exceed the value range of this data type. For dstLocal in C2PIPE2GM, the unit is 128 bytes. For dstLocal in C2, the unit is 64 bytes. In the scenario of L1 Buffer -> Fixpipe Buffer, dstGap refers to the interval between adjacent contiguous data blocks of the source operand (the interval between the start of the preceding block and the start of the next block). The unit is DataBlock (32 bytes). The value is of the uint16_t type and must not exceed the value range of this data type. |
Restrictions
- Ensure that writeSize and writeOffset are 32-byte aligned when the data is temporarily stored and copied to L1.
- The size of the copied memory cannot exceed the size of the initialized SPM buffer. Otherwise, problems such as overflow violation may occur.
Returns
None
Example
1 2 3 4 5 6 7 8 | AscendC::TPipe pipe; AscendC::TQue<AscendC::TPosition::VECIN, 1> inQueueSrcVecIn; int dataSize = 32; // Assume that T is of the half type. Allocate a buffer from UB (32 × sizeof(half) bytes). int offset = 32; // 32 bytes offset when copied to spmBuffer pipe.InitBuffer(inQueueSrcVecIn, 1, dataSize * sizeof(half)); AscendC::LocalTensor<half> writeLocal = inQueueSrcVecIn.AllocTensor<half>(); AscendC::DataCopyParams copyParams{1, 2, 0, 0}; // Move a data chunk from the UB. The length of the data chunk is two data blocks, and the length of a data block is 32 bytes. pipe.WriteSpmBuffer(writeLocal, copyParams, offset); |
1 2 3 4 5 6 7 | AscendC::TPipe pipe; AscendC::TQue<AscendC::TPosition::VECIN, 1> inQueueSrcVecIn; int dataSize = 32; // Assume that T is of the half type. Allocate a buffer from UB (32 × sizeof(half) bytes). int offset = 32; // 32 bytes offset when copied to spmBuffer pipe.InitBuffer(inQueueSrcVecIn, 1, dataSize * sizeof(half)); AscendC::LocalTensor<half> writeLocal = inQueueSrcVecIn.AllocTensor<half>(); pipe.WriteSpmBuffer(writeLocal, dataSize, offset); |