CreateVecIndex
==============

#### 功能说明

以firstValue为起始值创建向量索引。

#### 函数原型

tensor前n个数据计算：

template <typename T> 
\_\_aicore\_\_ inline void CreateVecIndex(LocalTensor<T> dstLocal, const T &firstValue, uint32\_t calCount)

#### 参数说明

**表1** 参数说明

| 参数名称 | 输入/输出 | 含义 |
| :-- | :-- | :-- |
| dstLocal | 输出 | 
目的操作数。

类型为[LocalTensor](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-localtensor)，支持的TPosition为VECIN/VECCALC/VECOUT。

LocalTensor的起始地址需要32字节对齐。

Kirin9020系列处理器，支持的数据类型为：int8/int16/int32/float16/float

KirinX90系列处理器，支持的数据类型为：int8/int16/int32/float16/float

 |
| firstValue | 输入 | 索引的第一个数值，数据类型需与dstLocal中元素的数据类型保持一致。 |
| calCount | 输入 | 输入数据元素个数。 |

#### 支持的型号

Kirin9020系列处理器

KirinX90系列处理器

#### 注意事项

*   操作数地址偏移对齐要求请参见[通用约束](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-general-constraints)。
    
*   firstValue需保证不超出dstLocal中元素数据类型对应的大小范围。
    

#### 返回值

无

#### 调用示例

本样例中只展示Compute流程中的部分代码。如果开发者需要运行样例代码，请将该代码段拷贝并替换[样例模板](#样例模板)中Compute函数相关代码片段即可。

tensor前n个数据计算样例：

AscendC::CreateVecIndex(dstLocal, (T)0, 128);

结果示例如下。

输入数据（firstValue）：0
输出数据（dstLocal）：\[0 1 2 ... 127\]

#### 样例模板

#include "kernel\_operator.h"
template <typename T> 
class CreateVecIndexTest {
public:
    \_\_aicore\_\_ inline CreateVecIndexTest() {}
    \_\_aicore\_\_ inline void Init(GM\_ADDR dstGm, uint64\_t mask, uint8\_t repeatTimes,
        uint16\_t dstBlkStride, uint8\_t dstRepStride)
    {
        m\_mask = mask;
        m\_repeatTimes = repeatTimes;
        m\_dstBlkStride = dstBlkStride;
        m\_dstRepStride = dstRepStride;
        m\_elementCount = m\_dstBlkStride \* m\_dstRepStride \* 32 \* m\_repeatTimes / sizeof(T);
        m\_dstGlobal.SetGlobalBuffer((\_\_gm\_\_ T\*)dstGm);
        m\_pipe.InitBuffer(m\_queOut, 1, m\_dstBlkStride \* m\_dstRepStride \* 32 \* m\_repeatTimes);
        m\_pipe.InitBuffer(m\_queTmp, 1, 1024);
    }
    \_\_aicore\_\_ inline void Process()
    {
        // Do not need CopyIn
        Compute();
        CopyOut();
    }
private:

    \_\_aicore\_\_ inline void Compute()
    {
        AscendC::LocalTensor<T> dstLocal = m\_queOut.AllocTensor<T>();
        AscendC::LocalTensor<uint8\_t> tmpLocal = m\_queTmp.AllocTensor<uint8\_t>();
        AscendC::Duplicate(dstLocal, (T)0, m\_elementCount);
        AscendC::PipeBarrier<PIPE\_ALL>();
        AscendC::CreateVecIndex(dstLocal, (T)0, m\_repeatTimes \* 256 / sizeof(T));
        m\_queOut.EnQue(dstLocal);
        m\_queTmp.FreeTensor(tmpLocal);
    }
    \_\_aicore\_\_ inline void CopyOut()
    {
        AscendC::LocalTensor<T> dstLocal = m\_queOut.DeQue<T>();
 
        AscendC::DataCopy(m\_dstGlobal, dstLocal, m\_elementCount);
        m\_queOut.FreeTensor(dstLocal);
    }
private:
    AscendC::TPipe m\_pipe;
    uint32\_t m\_elementCount;
    uint32\_t m\_mask;
    uint32\_t m\_repeatTimes;
    uint32\_t m\_dstBlkStride;
    uint32\_t m\_dstRepStride;
    AscendC::GlobalTensor<T> m\_dstGlobal;
    AscendC::TQue<AscendC::QuePosition::VECOUT, 1> m\_queOut;
    AscendC::TQue<AscendC::QuePosition::VECIN, 1> m\_queTmp;
}; // class CreateVecIndexTest
template <typename T> 
\_\_global\_\_ \_\_aicore\_\_ void testCreateVecIndex(GM\_ADDR dstGm, uint64\_t mask, uint8\_t repeatTimes,
        uint16\_t dstBlkStride, uint8\_t dstRepStride)
{
    CreateVecIndexTest<T> op;
    op.Init(dstGm, mask, repeatTimes, dstBlkStride, dstRepStride);
    op.Process();
}