# ReverseV2 — MindSpore Signal+ 使用手册 alpha 文档

# ReverseV2

对输入Tensor按指定维度反转。

输入：

  - src - 需反转数据的地址

  - param - 算子计算所需参数的结构体。其各成员见下述。

  - core_mask - 核掩码。

ReverseV2Parameter定义：

     1typedef struct ReverseV2Parameter {
     2    int* axis_flag_; // 用于存储需反转的轴，需反转的轴对应于数组索引的元素被置为1，其余元素为0
     3    int* input_shape_; // 输入张量的形状
     4    int* input_strides_; // 一个记录输入张量每一维步长的数组
     5    int** cur_coord_; // 二维数组，每个元素存储对应核心所使用的cur_coord数组地址，这个数组用于记录当前循环到的元素坐标
     6    int ndim_; // 输入和输出张量的维度
     7    int axis_ndim_; // 需反转的轴的数目
     8    int num_elem_; // 元素总数
     9    int type_size_; // 输入和输出张量数据类型的长度
    10} ReverseV2Parameter;

输出：

  - dst - 输出地址。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128

- MT7004 支持fp16, fp32, int16, int32, cplx64

共享/私有存储版本:

void anytype_reversev2_anycore(void *src, void *dst, ReverseV2Parameter *param, int core_mask)

各种数据类型、私有及共享空间版本均使用该函数。对于不同数据类型，改变param中的type_size_参数即可。

C调用示例：

     1void Resize(ReverseV2Parameter* param, int* axis) {
     2    int i;
     3    param->input_strides_[param->ndim_ - 1] = 1;
     4    for (i = param->ndim_ - 1; i > 0; i--) {
     5        param->input_strides_[i - 1] = param->input_strides_[i] * param->input_shape_[i];
     6    }
     7    for (i = 0; i < param->ndim_; i++) {
     8        // initialize axis_flag array by 0
     9        param->axis_flag_[i] = 0;
    10    }
    11    for (i = 0; i < param->axis_ndim_; i++) {
    12        param->axis_flag_[axis[i]] = 1;
    13    }
    14    param->num_elem_ = 1;
    15    for (i = 0; i < param->ndim_; i++) {
    16        param->num_elem_ *= param->input_shape_[i];
    17    }
    18}
    19
    20void TestReverseV2(int* shape, int ndim, int* axis, int axis_ndim, int core_mask) {
    21    int type_size = 4;
    22    int core_num = GetCoreNum(core_mask);
    23    int core_id = get_core_id();
    24    int logic_core_id = GetLogicCoreId(core_mask, core_id);
    25    float* input_data = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可
    26    float* output_data = (float*)0xA8000000;
    27    float* check = (float*)0xC8000000;
    28    ReverseV2Parameter* param = (ReverseV2Parameter*)0x84000000;
    29    if (logic_core_id == 0) {
    30        int i, j;
    31        param->axis_ndim_ =  axis_ndim;
    32        param->input_shape_ = (int*)0x84003000;
    33        for (i = 0; i < ndim; i++) {
    34            param->input_shape_[i] = shape[i];
    35        }
    36        param->ndim_ = ndim;
    37        param->type_size_ = type_size;
    38        param->input_strides_ = (int*)0x84004000;
    39        param->axis_flag_ = (int*)0x84005000;
    40        param->cur_coord_ = (int**)0x84006000;
    41        for (i = 0; i < 4; i++) {
    42            param->cur_coord_[i] = (int*)(0x84007000 + i * 0x1000LL);
    43            for (j = 0; j < ndim; j++) {
    44                param->cur_coord_[i][j] = 0;
    45            }
    46        }
    47        Resize(param, axis);
    48    }
    49    sys_bar(0, core_num); // 初始化参数完成后进行同步
    50    anytype_reversev2_anycore(input_data, output_data, param, core_mask);
    51}
    52
    53void main(){
    54    int shape[3] = {10, 10, 1000};
    55    int ndim = 3;
    56    int axis[3] = {0, 1, 2};
    57    int axis_ndim = 3;
    58    int core_mask = 0b1111;
    59    TestReverseV2(shape, ndim, axis, axis_ndim, core_mask);
    60}