blob: a95b1e6b032bda3ff1dc7e6f75bf3696b19d0c72 [file] [log] [blame]
/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TFLM_OPT_CONV_S8_H_
#define TFLM_OPT_CONV_S8_H_
#include "tensorflow/lite/kernels/internal/common.h"
#include "tensorflow/lite/kernels/internal/runtime_shape.h"
namespace kelvin::opt {
// filter 1x1 d%32==0
void ConvS8K1x1DMod32(const tflite::ConvParams& params,
const int32_t* output_multiplier, const int32_t* output_shift,
const tflite::RuntimeShape& input_shape,
const int8_t* input_data,
const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data,
const tflite::RuntimeShape& bias_shape,
const int32_t* bias_data,
const tflite::RuntimeShape& output_shape, int8_t* output_data);
// filter 1x1 d==32
void ConvS8K1x1D32(const tflite::ConvParams& params,
const int32_t* output_multiplier, const int32_t* output_shift,
const tflite::RuntimeShape& input_shape,
const int8_t* input_data,
const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data,
const tflite::RuntimeShape& bias_shape,
const int32_t* bias_data,
const tflite::RuntimeShape& output_shape, int8_t* output_data);
// filter 1x1 d==16
void ConvS8K1x1D16(const tflite::ConvParams& params,
const int32_t* output_multiplier, const int32_t* output_shift,
const tflite::RuntimeShape& input_shape,
const int8_t* input_data,
const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data,
const tflite::RuntimeShape& bias_shape,
const int32_t* bias_data,
const tflite::RuntimeShape& output_shape, int8_t* output_data);
// filter depth 4n
void ConvS8D4(const tflite::ConvParams& params,
const int32_t* output_multiplier, const int32_t* output_shift,
const tflite::RuntimeShape& input_shape,
const int8_t* input_data,
const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data,
const tflite::RuntimeShape& bias_shape, const int32_t* bias_data,
const tflite::RuntimeShape& output_shape, int8_t* output_data);
// filter depth 4n, W >= 8
void ConvS8W8D4(const tflite::ConvParams& params,
const int32_t* output_multiplier, const int32_t* output_shift,
const tflite::RuntimeShape& input_shape,
const int8_t* input_data,
const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data,
const tflite::RuntimeShape& bias_shape, const int32_t* bias_data,
const tflite::RuntimeShape& output_shape, int8_t* output_data);
// filter depth 32n
void ConvS8D32(const tflite::ConvParams& params,
const int32_t* output_multiplier, const int32_t* output_shift,
const tflite::RuntimeShape& input_shape,
const int8_t* input_data,
const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data,
const tflite::RuntimeShape& bias_shape, const int32_t* bias_data,
const tflite::RuntimeShape& output_shape, int8_t* output_data);
// input depth 3, filter depth 8n, stride 2
void ConvS8I3xD8(const tflite::ConvParams& params,
const int32_t* output_multiplier, const int32_t* output_shift,
const tflite::RuntimeShape& input_shape,
const int8_t* input_data,
const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data,
const tflite::RuntimeShape& bias_shape,
const int32_t* bias_data,
const tflite::RuntimeShape& output_shape, int8_t* output_data);
// filter size 48x3x1x48
void ConvS8K3x1D48(
const tflite::ConvParams& params, const int32_t* output_multiplier,
const int32_t* output_shift, const tflite::RuntimeShape& input_shape,
const int8_t* input_data, const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data, const tflite::RuntimeShape& bias_shape,
const int32_t* bias_data, const tflite::RuntimeShape& output_shape,
int8_t* output_data);
// Input depth = 1
void ConvPerChannelD1(
const tflite::ConvParams& params, const int32_t* output_multiplier,
const int32_t* output_shift, const tflite::RuntimeShape& input_shape,
const int8_t* input_data, const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data, const tflite::RuntimeShape& bias_shape,
const int32_t* bias_data, const tflite::RuntimeShape& output_shape,
int8_t* output_data);
// Input depth = 1, filter_width = 5, filter_height = 5, output_depth = 24
void ConvPerChannelD1OD24_5x5(
const tflite::ConvParams& params, const int32_t* output_multiplier,
const int32_t* output_shift, const tflite::RuntimeShape& input_shape,
const int8_t* input_data, const tflite::RuntimeShape& filter_shape,
const int8_t* filter_data, const tflite::RuntimeShape& bias_shape,
const int32_t* bias_data, const tflite::RuntimeShape& output_shape,
int8_t* output_data);
} // namespace kelvin::opt
#endif // TFLM_OPT_CONV_S8_H_