FT_DSP.gitlink.net/master/html/_sources/functionlib/dsplib/switchlayer.rst.txt

130 lines
3.9 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 为 4float16 为 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;
}