diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/operator-strings.c | 4 | ||||
-rw-r--r-- | src/operators/unary-elementwise-nc.c | 78 | ||||
-rw-r--r-- | src/xnnpack/operator.h | 2 |
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, |