130 lines
3.9 KiB
ReStructuredText
130 lines
3.9 KiB
ReStructuredText
Switchlayer
|
||
=================
|
||
|
||
根据索引从输入张量数组中选择一个张量,并将其数据复制到输出。该算子不区分数据类型,适用于所有数据类型。
|
||
|
||
.. math::
|
||
|
||
\text{output} = \text{input\_tensors}[\text{index}]
|
||
|
||
该算子会将选中的输入张量的数据复制到输出张量中。复制的大小为 `size * type_size` 字节。
|
||
|
||
输入:
|
||
- **input_tensors** - 输入张量数组(TensorC** 类型),包含多个待选择的张量。
|
||
- **index** - 选择的索引(int 类型),指定从 `input_tensors` 数组中选择哪个张量。
|
||
- **core_mask** - 核掩码(int),仅共享存储版本需要。
|
||
|
||
输出:
|
||
- **output** - 输出张量(TensorC* 类型),包含复制后的数据。输出张量的 `size` 和 `type_size` 应与选中的输入张量相同。
|
||
|
||
TensorC 结构体定义:
|
||
- **type_size** - 数据类型大小(long long),单位字节,例如 float32 为 4,float16 为 2。
|
||
- **size** - 元素个数(long long)。
|
||
- **data** - 数据指针(void*)。
|
||
|
||
支持平台:
|
||
``FT78NE``
|
||
``MT7004``
|
||
|
||
.. note::
|
||
- 该算子不区分数据类型,适用于所有数据类型
|
||
- 算子会复制数据,输出张量与输入张量数据独立
|
||
- 调用前需要确保 `output->data` 指向的内存空间足够大(至少 `size * type_size` 字节)
|
||
- 选中的输入张量的 `size` 和 `type_size` 应与输出张量匹配
|
||
|
||
**共享存储版本:**
|
||
|
||
.. c:function:: void switchlayer_s(TensorC** input_tensors, TensorC* output, int index, int core_mask)
|
||
|
||
**C调用示例:**
|
||
|
||
.. code-block:: c
|
||
:linenos:
|
||
:emphasize-lines: 36
|
||
|
||
//FT78NE示例
|
||
#include <stdio.h>
|
||
#include <switchlayer.h>
|
||
|
||
int main(int argc, char* argv[]) {
|
||
// 假设在DDR空间
|
||
TensorC input0, input1, input2;
|
||
TensorC output;
|
||
|
||
// 初始化 input0
|
||
input0.type_size = 4; // float32
|
||
input0.size = 1000;
|
||
input0.data = (void *)0xA0000000;
|
||
|
||
// 初始化 input1
|
||
input1.type_size = 4; // float32
|
||
input1.size = 1000;
|
||
input1.data = (void *)0xA1000000;
|
||
|
||
// 初始化 input2
|
||
input2.type_size = 4; // float32
|
||
input2.size = 1000;
|
||
input2.data = (void *)0xA2000000;
|
||
|
||
// 初始化 output
|
||
output.type_size = 4; // float32
|
||
output.size = 1000;
|
||
output.data = (void *)0xB0000000; // 需要预先分配足够的内存
|
||
|
||
// 创建输入张量数组
|
||
TensorC* input_tensors[3] = {&input0, &input1, &input2};
|
||
|
||
int index = 1; // 选择 input1
|
||
int core_mask = 0xff;
|
||
|
||
switchlayer_s(input_tensors, &output, index, core_mask);
|
||
|
||
// 此时 output.data 包含 input1.data 的副本
|
||
|
||
return 0;
|
||
}
|
||
|
||
**私有存储版本:**
|
||
|
||
.. c:function:: void switchlayer_p(TensorC** input_tensors, TensorC* output, int index)
|
||
|
||
**C调用示例:**
|
||
|
||
.. code-block:: c
|
||
:linenos:
|
||
:emphasize-lines: 30
|
||
|
||
//FT78NE示例
|
||
#include <stdio.h>
|
||
#include <switchlayer.h>
|
||
|
||
int main(int argc, char* argv[]) {
|
||
// 假设在L2空间
|
||
TensorC input0, input1, input2;
|
||
TensorC output;
|
||
|
||
input0.type_size = 4; // float32
|
||
input0.size = 1000;
|
||
input0.data = (void *)0x10000000;
|
||
|
||
input1.type_size = 4;
|
||
input1.size = 1000;
|
||
input1.data = (void *)0x10001000;
|
||
|
||
input2.type_size = 4;
|
||
input2.size = 1000;
|
||
input2.data = (void *)0x10002000;
|
||
|
||
output.type_size = 4;
|
||
output.size = 1000;
|
||
output.data = (void *)0x10003000; // 需要预先分配足够的内存
|
||
|
||
TensorC* input_tensors[3] = {&input0, &input1, &input2};
|
||
|
||
int index = 0; // 选择 input0
|
||
|
||
switchlayer_p(input_tensors, &output, index);
|
||
|
||
return 0;
|
||
}
|