Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/subgraph/argmax-pooling-2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,18 @@ static enum xnn_status reshape_argmax_pooling_operator(
{
const uint32_t input_id = opdata->inputs[0];
assert(input_id < num_values);
const size_t batch_size = values[input_id].shape.dim[0];
const size_t input_height = values[input_id].shape.dim[1];
const size_t input_width = values[input_id].shape.dim[2];
const size_t channel_dim = values[input_id].shape.dim[3];
const struct xnn_runtime_value* input_value = values + input_id;
if (input_value->shape.num_dims != 4) {
xnn_log_error("failed to reshape %s operator with input ID #%" PRIu32
": number of dimensions (%zu) must be 4",
xnn_node_type_to_string(xnn_node_type_argmax_pooling_2d),
input_id, input_value->shape.num_dims);
return xnn_status_invalid_parameter;
}
const size_t batch_size = input_value->shape.dim[0];
const size_t input_height = input_value->shape.dim[1];
const size_t input_width = input_value->shape.dim[2];
const size_t channel_dim = input_value->shape.dim[3];

size_t output_height, output_width;
enum xnn_status status = xnn_reshape_argmax_pooling2d_nhwc_f32(
Expand Down
7 changes: 7 additions & 0 deletions src/subgraph/average-pooling-2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ static enum xnn_status reshape_average_pooling_operator(
assert(output_id < num_values);

const struct xnn_runtime_value* input_value = values + input_id;
if (input_value->shape.num_dims != 4) {
xnn_log_error("failed to reshape %s operator with input ID #%" PRIu32
": number of dimensions (%zu) must be 4",
xnn_node_type_to_string(xnn_node_type_average_pooling_2d),
input_id, input_value->shape.num_dims);
return xnn_status_invalid_parameter;
}
struct xnn_runtime_value* output_value = values + output_id;

const size_t batch_size = input_value->shape.dim[0];
Expand Down
2 changes: 1 addition & 1 deletion src/subgraph/batch-matrix-multiply.c
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ enum xnn_status xnn_define_batch_matrix_multiply(xnn_subgraph_t subgraph,
const struct xnn_value* input2_value = &subgraph->values[input2_id];

status = xnn_subgraph_check_input_type_dense(
xnn_node_type_batch_matrix_multiply, input2_id, input1_value);
xnn_node_type_batch_matrix_multiply, input2_id, input2_value);
if (status != xnn_status_success) {
return status;
}
Expand Down
2 changes: 1 addition & 1 deletion src/subgraph/binary.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ static enum xnn_status reshape_binary_operator(
}
shape2.dim[0] = values[input2_id].shape.dim[0];
shape2.dim[1] = values[input2_id].shape.dim[values[input2_id].shape.num_dims - 1];
if (values[input1_id].shape.num_dims > 2) {
if (values[input2_id].shape.num_dims > 2) {
memcpy(&shape2.dim[2], &values[input2_id].shape.dim[1], (values[input2_id].shape.num_dims - 2) * sizeof(size_t));
}
} else {
Expand Down
27 changes: 18 additions & 9 deletions src/subgraph/convolution-2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ enum xnn_status create_nchw_convolution(
enum xnn_status status;
const enum xnn_datatype filter_datatype = values[filter_id].datatype;
const enum xnn_datatype bias_datatype = bias_id != XNN_INVALID_VALUE_ID
? values[filter_id].datatype
? values[bias_id].datatype
: xnn_datatype_invalid;
const enum xnn_datatype output_datatype = values[output_id].datatype;
switch (filter_datatype) {
Expand Down Expand Up @@ -142,7 +142,7 @@ static enum xnn_status create_convolution_operator(
: values[input_id].datatype;
const enum xnn_datatype filter_datatype = values[filter_id].datatype;
const enum xnn_datatype bias_datatype = bias_id != XNN_INVALID_VALUE_ID
? values[filter_id].datatype
? values[bias_id].datatype
: xnn_datatype_invalid;
const enum xnn_datatype output_datatype = values[output_id].datatype;
if (values[output_id].flags & XNN_VALUE_FLAG_LAYOUT_NCHW) {
Expand Down Expand Up @@ -257,7 +257,7 @@ static enum xnn_status create_convolution_operator(
node->activation.output_max, node->flags, weights_cache,
&opdata->operator_objects[0]);
break;
case xnn_datatype_pfp32:
case xnn_datatype_pfp32:
status = xnn_create_convolution2d_nhwc_pf32(
node->params.convolution_2d.input_padding_top,
node->params.convolution_2d.input_padding_right,
Expand Down Expand Up @@ -668,9 +668,18 @@ enum xnn_status reshape_convolution_operator(struct xnn_operator_data* opdata,
const uint32_t output_id = opdata->outputs[0];
assert(output_id < num_values);

const size_t batch_size = values[input_id].shape.dim[0];
const size_t input_height = values[input_id].shape.dim[1];
const size_t input_width = values[input_id].shape.dim[2];
const struct xnn_runtime_value* input_value = values + input_id;
if (input_value->shape.num_dims < 3) {
xnn_log_error("failed to reshape %s operator with input ID #%" PRIu32
": number of dimensions (%zu) must be at least 3",
xnn_node_type_to_string(xnn_node_type_convolution_2d),
input_id, input_value->shape.num_dims);
return xnn_status_invalid_parameter;
}

const size_t batch_size = input_value->shape.dim[0];
const size_t input_height = input_value->shape.dim[1];
const size_t input_width = input_value->shape.dim[2];

size_t output_height, output_width;
enum xnn_status status = xnn_status_invalid_state;
Expand All @@ -695,7 +704,7 @@ enum xnn_status reshape_convolution_operator(struct xnn_operator_data* opdata,
status = xnn_reshape_convolution2d_nhwc_pf32(
opdata->operator_objects[0], batch_size, input_height, input_width,
&opdata->workspace_size, &output_height, &output_width, threadpool);
break;
break;
case xnn_operator_type_convolution_nhwc_f16:
status = xnn_reshape_convolution2d_nhwc_f16(
opdata->operator_objects[0], batch_size, input_height, input_width,
Expand Down Expand Up @@ -816,7 +825,7 @@ enum xnn_status setup_convolution_operator(
return xnn_setup_convolution2d_nhwc_pf32(opdata->operator_objects[0],
opdata->workspace, input_data,
output_data);
break;
break;
case xnn_operator_type_convolution_nhwc_f16:
return xnn_setup_convolution2d_nhwc_f16(opdata->operator_objects[0],
opdata->workspace, input_data,
Expand Down Expand Up @@ -1325,7 +1334,7 @@ enum xnn_status xnn_define_convolution_2d(
xnn_log_error("failed to define %s operator with filter ID #%" PRIu32
": invalid channel dimension %zu",
xnn_node_type_to_string(xnn_node_type_convolution_2d),
input_id, filter_value->quantization.channel_dimension);
filter_id, filter_value->quantization.channel_dimension);
return xnn_status_invalid_parameter;
}

Expand Down
20 changes: 17 additions & 3 deletions src/subgraph/copy.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,14 @@ static enum xnn_status resize_copy_output_tensor(
const size_t input_num_elements = xnn_shape_multiply_all_dims(&input->shape);
if (output_axis_dynamic < XNN_MAX_TENSOR_DIMS) {
const size_t output_num_elements = xnn_shape_multiply_all_dims(&output->shape);
if (output_num_elements == 0) {
xnn_log_error("failed to reshape %s operator with input ID #%" PRIu32
" and output ID #%" PRIu32
": output number of elements must be non-zero",
xnn_node_type_to_string(xnn_node_type_static_reshape),
input_id, output_id);
return xnn_status_invalid_parameter;
}
const size_t inferred_dim = input_num_elements / output_num_elements;
if (inferred_dim * output_num_elements != input_num_elements) {
xnn_log_error(
Expand Down Expand Up @@ -150,6 +158,12 @@ static enum xnn_status resize_expand_dims_output_tensor(
const size_t *new_axes = opdata->reshape_dims;
const size_t num_output_dims = input_shape->num_dims + opdata->num_reshape_dims;
if (num_output_dims > XNN_MAX_TENSOR_DIMS) {
xnn_log_error("failed to expand dims in %s operator with input ID #%" PRIu32
" and output ID #%" PRIu32
": number of output dimensions, %zu, is larger than the "
"maximum number of dimensions, %zu",
xnn_node_type_to_string(xnn_node_type_static_expand_dims),
input_id, output_id, num_output_dims, (size_t)XNN_MAX_TENSOR_DIMS);
return xnn_status_invalid_parameter;
}
size_t input_iter = 0;
Expand Down Expand Up @@ -198,7 +212,7 @@ static enum xnn_status resize_fuse_dims_output_tensor(
" and output ID #%" PRIu32
": number of input dimensions, %zu, is smaller than the "
"fused dimensions, %zu-%zu",
xnn_node_type_to_string(xnn_node_type_static_reshape),
xnn_node_type_to_string(xnn_node_type_fuse_dims),
input_id, output_id, input_shape->num_dims, first_dim,
first_dim + num_dims);
return xnn_status_invalid_parameter;
Expand Down Expand Up @@ -246,7 +260,7 @@ static enum xnn_status resize_split_dims_output_tensor(
" and output ID #%" PRIu32
": number of output dimensions, %zu, is larger than the "
"maximum number of dimensions, %zu",
xnn_node_type_to_string(xnn_node_type_static_reshape),
xnn_node_type_to_string(xnn_node_type_split_dims),
input_id, output_id, input_shape->num_dims - 1 + num_dims,
(size_t)XNN_MAX_TENSOR_DIMS);
return xnn_status_invalid_parameter;
Expand All @@ -264,7 +278,7 @@ static enum xnn_status resize_split_dims_output_tensor(
" and output ID #%" PRIu32
": product of defined splits, %zu, does not divide the split "
"input dimension, %zu",
xnn_node_type_to_string(xnn_node_type_static_reshape),
xnn_node_type_to_string(xnn_node_type_split_dims),
input_id, output_id, count, input_shape->dim[axis]);
return xnn_status_invalid_parameter;
}
Expand Down
16 changes: 11 additions & 5 deletions src/subgraph/deconvolution-2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ static enum xnn_status create_deconvolution_operator(
: values[input_id].datatype;
const enum xnn_datatype filter_datatype = values[filter_id].datatype;
const enum xnn_datatype bias_datatype = bias_id != XNN_INVALID_VALUE_ID
? values[filter_id].datatype
? values[bias_id].datatype
: xnn_datatype_invalid;
const enum xnn_datatype output_datatype = values[output_id].datatype;
switch (output_datatype) {
Expand Down Expand Up @@ -405,6 +405,12 @@ static enum xnn_status reshape_deconvolution_operator(
size_t num_values, pthreadpool_t threadpool) {
const uint32_t input_id = opdata->inputs[0];
assert(input_id < num_values);
if (values[input_id].shape.num_dims != 3 && values[input_id].shape.num_dims != 4) {
xnn_log_error(
"failed to define %s operator with input ID #%" PRIu32 ": num_dims (%zu) must be 3 or 4",
xnn_node_type_to_string(xnn_node_type_deconvolution_2d), input_id, values[input_id].shape.num_dims);
return xnn_status_invalid_parameter;
}
const size_t batch_size = values[input_id].shape.dim[0];
const size_t input_height = values[input_id].shape.dim[1];
const size_t input_width = values[input_id].shape.dim[2];
Expand Down Expand Up @@ -755,7 +761,7 @@ enum xnn_status xnn_define_deconvolution_2d(
input_value->shape.num_dims) {
xnn_log_error("failed to define %s operator with input ID #%" PRIu32
": num_nonbatch_dims (%zu) must be < num_dims (%zu)",
xnn_node_type_to_string(xnn_node_type_convolution_2d),
xnn_node_type_to_string(xnn_node_type_deconvolution_2d),
input_id, input_value->quantization.num_nonbatch_dims,
input_value->shape.num_dims);
return xnn_status_invalid_parameter;
Expand Down Expand Up @@ -931,8 +937,8 @@ enum xnn_status xnn_define_deconvolution_2d(
if (filter_value->quantization.channel_dimension != 0) {
xnn_log_error("failed to define %s operator with filter ID #%" PRIu32
": invalid channel dimension %zu",
xnn_node_type_to_string(xnn_node_type_convolution_2d),
input_id, filter_value->quantization.channel_dimension);
xnn_node_type_to_string(xnn_node_type_deconvolution_2d),
filter_id, filter_value->quantization.channel_dimension);
return xnn_status_invalid_parameter;
}

Expand All @@ -943,7 +949,7 @@ enum xnn_status xnn_define_deconvolution_2d(
bias_value->quantization.channel_dimension != 0) {
xnn_log_error("failed to define %s operator with bias ID #%" PRIu32
": invalid channel dimension %zu",
xnn_node_type_to_string(xnn_node_type_convolution_2d),
xnn_node_type_to_string(xnn_node_type_deconvolution_2d),
bias_id, bias_value->quantization.channel_dimension);
return xnn_status_invalid_parameter;
}
Expand Down
7 changes: 7 additions & 0 deletions src/subgraph/depth-to-space-2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,13 @@ static enum xnn_status reshape_depth_to_space_operator(
const uint32_t input_id = opdata->inputs[0];
assert(input_id < num_values);
const struct xnn_runtime_value* input_value = values + input_id;

if (input_value->shape.num_dims != 4) {
xnn_log_error(
"failed to reshape %s operator with input ID #%" PRIu32 ": number of dimensions (%zu) must be 4",
xnn_node_type_to_string(xnn_node_type_depth_to_space_2d), input_id, input_value->shape.num_dims);
return xnn_status_invalid_parameter;
}
const size_t batch_size = input_value->shape.dim[0];
const size_t input_height = input_value->shape.dim[1];
const size_t input_width = input_value->shape.dim[2];
Expand Down
21 changes: 15 additions & 6 deletions src/subgraph/depthwise-convolution-2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ static enum xnn_status create_depthwise_convolution_operator(
const enum xnn_datatype filter_datatype = values[filter_id].datatype;
const enum xnn_datatype output_datatype = values[output_id].datatype;
const enum xnn_datatype bias_datatype = bias_id != XNN_INVALID_VALUE_ID
? values[filter_id].datatype
? values[bias_id].datatype
: xnn_datatype_invalid;
if (values[output_id].flags & XNN_VALUE_FLAG_LAYOUT_NCHW) {
assert(values[input_id].flags & XNN_VALUE_FLAG_LAYOUT_NCHW);
Expand Down Expand Up @@ -395,9 +395,18 @@ static enum xnn_status reshape_depthwise_convolution_operator(
{
const uint32_t input_id = opdata->inputs[0];
assert(input_id < num_values);
const size_t batch_size = values[input_id].shape.dim[0];
const size_t input_height = values[input_id].shape.dim[1];
const size_t input_width = values[input_id].shape.dim[2];
const struct xnn_runtime_value* input_value = values + input_id;
if (input_value->shape.num_dims != 3 && input_value->shape.num_dims != 4) {
xnn_log_error("failed to reshape %s operator with input ID #%" PRIu32
": number of dimensions (%zu) must be 3 or 4",
xnn_node_type_to_string(xnn_node_type_depthwise_convolution_2d),
input_id, input_value->shape.num_dims);
return xnn_status_invalid_parameter;
}

const size_t batch_size = input_value->shape.dim[0];
const size_t input_height = input_value->shape.dim[1];
const size_t input_width = input_value->shape.dim[2];
enum xnn_status status = xnn_status_invalid_state;
const size_t old_workspace_size = opdata->workspace_size;
size_t output_height, output_width;
Expand Down Expand Up @@ -946,7 +955,7 @@ enum xnn_status xnn_define_depthwise_convolution_2d(
if (filter_value->quantization.channel_dimension != filter_value->shape.num_dims - 1) {
xnn_log_error(
"failed to define %s operator with filter ID #%" PRIu32 ": invalid channel dimension %zu",
xnn_node_type_to_string(xnn_node_type_convolution_2d), input_id, filter_value->quantization.channel_dimension);
xnn_node_type_to_string(xnn_node_type_depthwise_convolution_2d), filter_id, filter_value->quantization.channel_dimension);
return xnn_status_invalid_parameter;
}

Expand All @@ -955,7 +964,7 @@ enum xnn_status xnn_define_depthwise_convolution_2d(
if (bias_value->quantization.channel_dimension != 0) {
xnn_log_error(
"failed to define %s operator with bias ID #%" PRIu32 ": invalid channel dimension %zu",
xnn_node_type_to_string(xnn_node_type_convolution_2d), bias_id, bias_value->quantization.channel_dimension);
xnn_node_type_to_string(xnn_node_type_depthwise_convolution_2d), bias_id, bias_value->quantization.channel_dimension);
return xnn_status_invalid_parameter;
}
}
Expand Down
33 changes: 21 additions & 12 deletions src/subgraph/even-split.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "src/xnnpack/allocation-type.h"
#include "src/xnnpack/common.h"
#include "src/xnnpack/datatype.h"
#include "src/xnnpack/internal.h"
#include "src/xnnpack/log.h"
#include "src/xnnpack/node-type.h"
#include "src/xnnpack/operator-type.h"
Expand Down Expand Up @@ -146,6 +147,13 @@ static enum xnn_status reshape_even_split_operator(
size_t batch_size = xnn_shape_multiply_leading_dims(&input_value->shape, axis);

size_t num_splits = opdata->num_outputs;
if (input_value->shape.dim[axis] % num_splits != 0) {
xnn_log_error(
"failed to reshape %s operator with the input ID #%" PRIu32
": split dimension (%zu) is not divisible by the number of splits (%zu)",
xnn_node_type_to_string(xnn_node_type_even_split), input_id, input_value->shape.dim[axis], num_splits);
return xnn_status_invalid_parameter;
}
const size_t axis_elements = input_value->shape.dim[axis] / num_splits;
const size_t old_workspace_size = opdata->workspace_size;
bool reallocation_required = false;
Expand Down Expand Up @@ -328,22 +336,23 @@ enum xnn_status xnn_define_even_split(
return status;
}

for (int i = 0; i < num_outputs; ++i) {
status = check_output_value(subgraph, split_dim, input_id, output_ids[i], "Nth", node_type);
if (status != xnn_status_success) {
return status;
}
if (num_outputs == 0) {
xnn_log_error(
"failed to define %s operator with 0 outputs",
xnn_node_type_to_string(node_type));
return xnn_status_invalid_parameter;
}

if (num_outputs > XNN_MAX_OUTPUTS) {
xnn_log_error(
"failed to define %s operator with %zu inputs: number of inputs (%zu) exceeds the supported maximum (%zu)",
xnn_node_type_to_string(node_type), num_outputs, num_outputs, (size_t) XNN_MAX_OUTPUTS);
"failed to define %s operator with %zu outputs: number of outputs exceeds the supported maximum (%zu)",
xnn_node_type_to_string(node_type), num_outputs, (size_t) XNN_MAX_OUTPUTS);
return xnn_status_invalid_parameter;
}

for (int i = 0; i < num_outputs; ++i) {
check_datatype_copyable(subgraph, input_id, output_ids[i], "Nth", node_type);
for (size_t i = 0; i < num_outputs; ++i) {
XNN_RETURN_IF_ERROR(check_output_value(subgraph, split_dim, input_id, output_ids[i], "Nth", node_type));
XNN_RETURN_IF_ERROR(check_datatype_copyable(subgraph, input_id, output_ids[i], "Nth", node_type));
}

struct xnn_node* node = xnn_subgraph_new_node(subgraph);
Expand All @@ -355,9 +364,9 @@ enum xnn_status xnn_define_even_split(
node->type = node_type;
node->num_inputs = 1;
node->inputs[0] = input_id;
node->num_outputs = num_outputs;
for(int i=0;i<num_outputs;++i){
node->outputs[i]=output_ids[i];
node->num_outputs = (uint32_t) num_outputs;
for (size_t i = 0; i < num_outputs; ++i) {
node->outputs[i] = output_ids[i];
}
node->create = create_even_split_operator;
node->reshape = reshape_even_split_operator;
Expand Down
Loading
Loading