aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/operator-strings.c4
-rw-r--r--src/operators/unary-elementwise-nc.c78
-rw-r--r--src/xnnpack/operator.h2
3 files changed, 84 insertions, 0 deletions
diff --git a/src/operator-strings.c b/src/operator-strings.c
index dce9c4671..fd8a3ccef 100644
--- a/src/operator-strings.c
+++ b/src/operator-strings.c
@@ -78,6 +78,10 @@ const char* xnn_operator_type_to_string(enum xnn_operator_type type) {
return "Convolution (NHWC, QU8)";
case xnn_operator_type_convolution_nchw_f32:
return "Convolution (NCHW, F32)";
+ case xnn_operator_type_copy_nc_x8:
+ return "Copy (NC, X8)";
+ case xnn_operator_type_copy_nc_x16:
+ return "Copy (NC, X16)";
case xnn_operator_type_copy_nc_x32:
return "Copy (NC, X32)";
case xnn_operator_type_deconvolution_nhwc_f32:
diff --git a/src/operators/unary-elementwise-nc.c b/src/operators/unary-elementwise-nc.c
index 67170710a..19e24c456 100644
--- a/src/operators/unary-elementwise-nc.c
+++ b/src/operators/unary-elementwise-nc.c
@@ -479,6 +479,36 @@ enum xnn_status xnn_create_convert_nc_qu8_f32(
convert_op_out);
}
+enum xnn_status xnn_create_copy_nc_x8(
+ size_t channels,
+ size_t input_stride,
+ size_t output_stride,
+ uint32_t flags,
+ xnn_operator_t* copy_op_out)
+{
+ return create_unary_elementwise_nc(
+ channels, input_stride, output_stride, flags,
+ NULL, 0,
+ xnn_operator_type_copy_nc_x8,
+ xnn_params.xx.copy,
+ copy_op_out);
+}
+
+enum xnn_status xnn_create_copy_nc_x16(
+ size_t channels,
+ size_t input_stride,
+ size_t output_stride,
+ uint32_t flags,
+ xnn_operator_t* copy_op_out)
+{
+ return create_unary_elementwise_nc(
+ channels, input_stride, output_stride, flags,
+ NULL, 0,
+ xnn_operator_type_copy_nc_x16,
+ xnn_params.xx.copy,
+ copy_op_out);
+}
+
enum xnn_status xnn_create_copy_nc_x32(
size_t channels,
size_t input_stride,
@@ -1001,6 +1031,54 @@ enum xnn_status xnn_setup_convert_nc_qu8_f32(
pthreadpool_get_threads_count(threadpool));
}
+enum xnn_status xnn_setup_copy_nc_x8(
+ xnn_operator_t copy_op,
+ size_t batch_size,
+ const void* input,
+ void* output,
+ pthreadpool_t threadpool)
+{
+ if (copy_op->type != xnn_operator_type_copy_nc_x8) {
+ xnn_log_error("failed to setup operator: operator type mismatch (expected %s, got %s)",
+ xnn_operator_type_to_string(xnn_operator_type_copy_nc_x8),
+ xnn_operator_type_to_string(copy_op->type));
+ return xnn_status_invalid_parameter;
+ }
+ copy_op->state = xnn_run_state_invalid;
+
+ return setup_unary_elementwise_nc(
+ copy_op,
+ batch_size, input, output,
+ 0 /* log2(sizeof(uint16_t)) */,
+ 0 /* log2(sizeof(uint16_t)) */,
+ NULL, 0,
+ pthreadpool_get_threads_count(threadpool));
+}
+
+enum xnn_status xnn_setup_copy_nc_x16(
+ xnn_operator_t copy_op,
+ size_t batch_size,
+ const void* input,
+ void* output,
+ pthreadpool_t threadpool)
+{
+ if (copy_op->type != xnn_operator_type_copy_nc_x16) {
+ xnn_log_error("failed to setup operator: operator type mismatch (expected %s, got %s)",
+ xnn_operator_type_to_string(xnn_operator_type_copy_nc_x16),
+ xnn_operator_type_to_string(copy_op->type));
+ return xnn_status_invalid_parameter;
+ }
+ copy_op->state = xnn_run_state_invalid;
+
+ return setup_unary_elementwise_nc(
+ copy_op,
+ batch_size, input, output,
+ 1 /* log2(sizeof(uint16_t)) */,
+ 1 /* log2(sizeof(uint16_t)) */,
+ NULL, 0,
+ pthreadpool_get_threads_count(threadpool));
+}
+
enum xnn_status xnn_setup_copy_nc_x32(
xnn_operator_t copy_op,
size_t batch_size,
diff --git a/src/xnnpack/operator.h b/src/xnnpack/operator.h
index 7f4429f3f..637098947 100644
--- a/src/xnnpack/operator.h
+++ b/src/xnnpack/operator.h
@@ -63,6 +63,8 @@ enum xnn_operator_type {
xnn_operator_type_convolution_nhwc_qc8,
xnn_operator_type_convolution_nhwc_qs8,
xnn_operator_type_convolution_nhwc_qu8,
+ xnn_operator_type_copy_nc_x8,
+ xnn_operator_type_copy_nc_x16,
xnn_operator_type_copy_nc_x32,
xnn_operator_type_deconvolution_nhwc_f32,
xnn_operator_type_deconvolution_nhwc_qs8,