1445 lines
36 KiB
Python
1445 lines
36 KiB
Python
load("@bazel_skylib//lib:selects.bzl", "selects")
|
|
load("@rules_cc//cc:cc_library.bzl", "cc_library")
|
|
load("@rules_cc//cc:cc_test.bzl", "cc_test")
|
|
load("//tensorflow:tensorflow.bzl", "transitive_hdrs")
|
|
load("//tensorflow:tensorflow.default.bzl", "get_compatible_with_portable")
|
|
load("//tensorflow/lite:build_def.bzl", "tflite_copts")
|
|
load("//tensorflow/lite:special_rules.bzl", "tflite_portable_test_suite_combined")
|
|
load("//tensorflow/lite/core/shims:cc_library_with_tflite.bzl", "cc_library_with_tflite")
|
|
|
|
package(
|
|
# copybara:uncomment default_applicable_licenses = ["//tensorflow:LICENSE"],
|
|
default_visibility = [
|
|
"//visibility:public",
|
|
],
|
|
licenses = ["notice"],
|
|
)
|
|
|
|
HARD_FP_FLAGS_IF_APPLICABLE = select({
|
|
"//tensorflow:android_arm": ["-mfloat-abi=softfp"],
|
|
"//tensorflow:android_armeabi": ["-mfloat-abi=softfp"],
|
|
"//conditions:default": [],
|
|
})
|
|
|
|
NEON_FLAGS_IF_APPLICABLE = select({
|
|
":armhf": [
|
|
"-O3",
|
|
"-mfpu=neon",
|
|
],
|
|
":armv7": [
|
|
"-O3",
|
|
"-mfpu=neon",
|
|
],
|
|
"//conditions:default": [
|
|
"-O3",
|
|
],
|
|
})
|
|
|
|
filegroup(
|
|
name = "tflite_internal_cc_3p_api_deps_src",
|
|
srcs = ["compatibility.h"],
|
|
visibility = [
|
|
"//tensorflow/lite:__pkg__",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "compatibility",
|
|
hdrs = ["compatibility.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
"//tensorflow/lite/kernels:op_macros",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "runtime_shape",
|
|
srcs = ["runtime_shape.cc"],
|
|
hdrs = ["runtime_shape.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":compatibility",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "types",
|
|
hdrs = [
|
|
"runtime_shape.h",
|
|
"types.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":compatibility",
|
|
":runtime_shape",
|
|
"//tensorflow/lite/types:half",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "legacy_types",
|
|
hdrs = ["legacy_types.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":types",
|
|
],
|
|
)
|
|
|
|
config_setting(
|
|
name = "armv7",
|
|
constraint_values = [
|
|
"@platforms//cpu:armv7",
|
|
],
|
|
)
|
|
|
|
config_setting(
|
|
name = "aarch64",
|
|
constraint_values = [
|
|
"@platforms//cpu:aarch64",
|
|
],
|
|
)
|
|
|
|
config_setting(
|
|
name = "armhf",
|
|
constraint_values = [
|
|
"@platforms//cpu:armv7e-mf",
|
|
],
|
|
)
|
|
|
|
config_setting(
|
|
name = "x86",
|
|
constraint_values = [
|
|
"@platforms//cpu:x86_32",
|
|
],
|
|
)
|
|
|
|
config_setting(
|
|
name = "x86_64",
|
|
constraint_values = [
|
|
"@platforms//cpu:x86_64",
|
|
],
|
|
)
|
|
|
|
selects.config_setting_group(
|
|
name = "x86_any",
|
|
match_any = [
|
|
":x86_32_any",
|
|
":x86_64_any",
|
|
],
|
|
)
|
|
|
|
selects.config_setting_group(
|
|
name = "arm_any",
|
|
match_any = [
|
|
":arm32_any",
|
|
":aarch64_any",
|
|
],
|
|
)
|
|
|
|
selects.config_setting_group(
|
|
name = "arm32_any",
|
|
match_any = [
|
|
"@platforms//cpu:aarch32",
|
|
"@platforms//cpu:armv7",
|
|
"@platforms//cpu:armv7-m",
|
|
"@platforms//cpu:armv7e-m",
|
|
"@platforms//cpu:armv7e-mf",
|
|
],
|
|
)
|
|
|
|
selects.config_setting_group(
|
|
name = "aarch64_any",
|
|
match_any = [
|
|
"@platforms//cpu:aarch64",
|
|
"@platforms//cpu:arm64e",
|
|
],
|
|
)
|
|
|
|
config_setting(
|
|
name = "x86_32_any",
|
|
constraint_values = [
|
|
"@platforms//cpu:x86_32",
|
|
],
|
|
)
|
|
|
|
config_setting(
|
|
name = "x86_64_any",
|
|
constraint_values = [
|
|
"@platforms//cpu:x86_64",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "common",
|
|
srcs = ["common.cc"],
|
|
hdrs = ["common.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":cppmath",
|
|
":cpu_check",
|
|
":types",
|
|
"//tensorflow/lite/core:macros",
|
|
"@gemmlowp//:fixedpoint",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "optimized_base",
|
|
hdrs = [
|
|
"optimized/depthwiseconv_3x3_filter_common.h",
|
|
"optimized/depthwiseconv_float.h",
|
|
"optimized/depthwiseconv_multithread.h",
|
|
"optimized/depthwiseconv_uint8.h",
|
|
"optimized/depthwiseconv_uint8_3x3_filter.h",
|
|
"optimized/fully_connected_4bit.h",
|
|
"optimized/im2col_utils.h",
|
|
"optimized/integer_ops/add.h",
|
|
"optimized/integer_ops/conv.h",
|
|
"optimized/integer_ops/depthwise_conv.h",
|
|
"optimized/integer_ops/depthwise_conv_3x3_filter.h",
|
|
"optimized/integer_ops/depthwise_conv_hybrid.h",
|
|
"optimized/integer_ops/depthwise_conv_hybrid_3x3_filter.h",
|
|
"optimized/integer_ops/fully_connected.h",
|
|
"optimized/integer_ops/leaky_relu.h",
|
|
"optimized/integer_ops/lut.h",
|
|
"optimized/integer_ops/mean.h",
|
|
"optimized/integer_ops/mul.h",
|
|
"optimized/integer_ops/pooling.h",
|
|
"optimized/integer_ops/sub.h",
|
|
"optimized/integer_ops/transpose_conv.h",
|
|
"optimized/optimized_ops.h",
|
|
"optimized/optimized_ops_utils.h",
|
|
"optimized/reduce.h",
|
|
"optimized/resize_bilinear.h",
|
|
"optimized/sparse_ops/fully_connected.h",
|
|
"reduce_common.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
defines = ["EIGEN_NEON_GEBP_NR=4"],
|
|
deps = [
|
|
":avx2_quantization_utils",
|
|
":common",
|
|
":compatibility",
|
|
":cppmath",
|
|
":cpu_check",
|
|
":optimized_4bit",
|
|
":quantization_util",
|
|
":reduce_utils",
|
|
":reference_base",
|
|
":strided_slice_logic",
|
|
":tensor",
|
|
":tensor_utils",
|
|
":transpose_utils",
|
|
":types",
|
|
"//tensorflow/lite:macros",
|
|
"//tensorflow/lite/core/c:common",
|
|
"//tensorflow/lite/kernels:cpu_backend_context",
|
|
"//tensorflow/lite/kernels:cpu_backend_gemm",
|
|
"//tensorflow/lite/kernels:cpu_backend_threadpool",
|
|
"//tensorflow/lite/kernels:kernel_util",
|
|
"@eigen_archive//:eigen3",
|
|
"@gemmlowp//:fixedpoint",
|
|
"@ruy//ruy/profiler:instrumentation",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "legacy_optimized_base",
|
|
srcs = [],
|
|
hdrs = [
|
|
"optimized/depthwiseconv_3x3_filter_common.h",
|
|
"optimized/depthwiseconv_float.h",
|
|
"optimized/depthwiseconv_uint8.h",
|
|
"optimized/depthwiseconv_uint8_3x3_filter.h",
|
|
"optimized/im2col_utils.h",
|
|
"optimized/legacy_optimized_ops.h",
|
|
"optimized/optimized_ops.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":common",
|
|
":compatibility",
|
|
":cppmath",
|
|
":cpu_check",
|
|
":legacy_reference_base",
|
|
":optimized_base",
|
|
":quantization_util",
|
|
":strided_slice_logic",
|
|
":tensor",
|
|
":tensor_utils",
|
|
":transpose_utils",
|
|
":types",
|
|
"//tensorflow/lite:macros",
|
|
"//tensorflow/lite/core/c:common",
|
|
"//tensorflow/lite/kernels:cpu_backend_context",
|
|
"//tensorflow/lite/kernels:cpu_backend_gemm",
|
|
"//tensorflow/lite/kernels:cpu_backend_threadpool",
|
|
"@eigen_archive//:eigen3",
|
|
"@gemmlowp",
|
|
"@ruy//ruy/profiler:instrumentation",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "optimized_eigen",
|
|
hdrs = [
|
|
"optimized/eigen_spatial_convolutions.h",
|
|
"optimized/multithreaded_conv.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":common",
|
|
":optimized_base",
|
|
":types",
|
|
"//tensorflow/lite/core/c:common",
|
|
"@eigen_archive//:eigen3",
|
|
"@xla//xla/tsl/framework/convolution:eigen_spatial_convolutions-inl",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "optimized_4bit",
|
|
srcs = select({
|
|
":x86_64_any": [
|
|
"optimized/4bit/sse_fully_connected.cc",
|
|
],
|
|
":aarch64_any": [
|
|
"optimized/4bit/neon_fully_connected.cc",
|
|
"optimized/4bit/neon_fully_connected_aarch64_nosdot.cc",
|
|
"optimized/4bit/neon_fully_connected_aarch64_sdot.cc",
|
|
"optimized/4bit/neon_fully_connected_impl.h",
|
|
],
|
|
":arm32_any": [
|
|
"optimized/4bit/neon_fully_connected.cc",
|
|
"optimized/4bit/neon_fully_connected_arm32_nosdot.cc",
|
|
"optimized/4bit/neon_fully_connected_arm32_sdot.cc",
|
|
"optimized/4bit/neon_fully_connected_impl.h",
|
|
],
|
|
"//conditions:default": [],
|
|
}) + [
|
|
"optimized/4bit/fully_connected_common.h",
|
|
"optimized/4bit/fully_connected_reference.cc",
|
|
"optimized/4bit/fully_connected_reference_impl.h",
|
|
],
|
|
hdrs = [
|
|
"optimized/4bit/fully_connected_reference.h",
|
|
"optimized/fully_connected_4bit.h",
|
|
] + select({
|
|
":x86_64_any": [
|
|
"optimized/4bit/sse_fully_connected.h",
|
|
"optimized/4bit/sse_fully_connected_impl.h",
|
|
],
|
|
":aarch64_any": [
|
|
"optimized/4bit/neon_fully_connected.h",
|
|
],
|
|
":arm32_any": [
|
|
"optimized/4bit/neon_fully_connected.h",
|
|
],
|
|
"//conditions:default": [],
|
|
}),
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts() + NEON_FLAGS_IF_APPLICABLE,
|
|
defines = select({
|
|
":x86_64_any": ["FC_4BIT_SSE"],
|
|
":aarch64_any": [
|
|
"FC_4BIT_NEON",
|
|
],
|
|
":arm32_any": [
|
|
"FC_4BIT_NEON",
|
|
],
|
|
"//conditions:default": [],
|
|
}),
|
|
deps = [
|
|
":cppmath",
|
|
"@cpuinfo//:cpuinfo_with_unstripped_include_path",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "optimized_4bit_test",
|
|
srcs = ["optimized/optimized_4bit_test.cc"],
|
|
deps = [
|
|
":common",
|
|
":optimized_4bit",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "tensor_test",
|
|
srcs = ["tensor_test.cc"],
|
|
deps = [
|
|
":tensor",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "cppmath",
|
|
srcs = [],
|
|
hdrs = [
|
|
"cppmath.h",
|
|
"max.h",
|
|
"min.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
)
|
|
|
|
cc_library(
|
|
name = "quantization_util",
|
|
srcs = ["quantization_util.cc"],
|
|
hdrs = ["quantization_util.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
linkopts = select({
|
|
"//tensorflow:windows": [],
|
|
"//conditions:default": ["-lm"],
|
|
}),
|
|
deps = [
|
|
":compatibility",
|
|
":cppmath",
|
|
":types",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "quantization_util_test",
|
|
srcs = ["quantization_util_test.cc"],
|
|
defines = [
|
|
"TFLITE_SINGLE_ROUNDING=0",
|
|
],
|
|
deps = [
|
|
":common",
|
|
":quantization_util",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "quantization_util_single_rounding",
|
|
srcs = ["quantization_util.cc"],
|
|
hdrs = ["quantization_util.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
defines = [
|
|
"TFLITE_SINGLE_ROUNDING=1",
|
|
],
|
|
linkopts = select({
|
|
"//tensorflow:windows": [],
|
|
"//conditions:default": ["-lm"],
|
|
}),
|
|
deps = [
|
|
":compatibility",
|
|
":cppmath",
|
|
":types",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "quantization_util_test_single_rounding",
|
|
srcs = ["quantization_util_test.cc"],
|
|
defines = [
|
|
"TFLITE_SINGLE_ROUNDING=1",
|
|
],
|
|
deps = [
|
|
":common",
|
|
":quantization_util_single_rounding",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "transpose_utils",
|
|
srcs = [
|
|
"transpose_utils.cc",
|
|
],
|
|
hdrs = [
|
|
"transpose_utils.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":types",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "transpose_utils_test",
|
|
srcs = ["transpose_utils_test.cc"],
|
|
deps = [
|
|
":transpose_utils",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "strided_slice_logic",
|
|
srcs = [],
|
|
hdrs = [
|
|
"strided_slice_logic.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":compatibility",
|
|
":types",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "reference_comparisons",
|
|
srcs = [],
|
|
hdrs = [
|
|
"reference/broadcast_loop.h",
|
|
"reference/comparisons.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":common",
|
|
":compatibility",
|
|
":runtime_shape",
|
|
":types",
|
|
"//tensorflow/lite:macros",
|
|
"//tensorflow/lite/core/c:common",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "reference_base",
|
|
srcs = [],
|
|
hdrs = [
|
|
"reduce_common.h",
|
|
"reference/add.h",
|
|
"reference/add_n.h",
|
|
"reference/arg_min_max.h",
|
|
"reference/batch_matmul.h",
|
|
"reference/batch_to_space_nd.h",
|
|
"reference/binary_function.h",
|
|
"reference/broadcast_args.h",
|
|
"reference/broadcast_loop.h",
|
|
"reference/broadcast_to.h",
|
|
"reference/cast.h",
|
|
"reference/ceil.h",
|
|
"reference/comparisons.h",
|
|
"reference/concatenation.h",
|
|
"reference/conv.h",
|
|
"reference/conv3d.h",
|
|
"reference/conv3d_transpose.h",
|
|
"reference/cumsum.h",
|
|
"reference/densify.h",
|
|
"reference/depth_to_space.h",
|
|
"reference/depthwiseconv_float.h",
|
|
"reference/depthwiseconv_uint8.h",
|
|
"reference/dequantize.h",
|
|
"reference/div.h",
|
|
"reference/elu.h",
|
|
"reference/exp.h",
|
|
"reference/fill.h",
|
|
"reference/floor.h",
|
|
"reference/floor_div.h",
|
|
"reference/floor_mod.h",
|
|
"reference/fully_connected.h",
|
|
"reference/gather.h",
|
|
"reference/gelu.h",
|
|
"reference/hard_swish.h",
|
|
"reference/integer_ops/add.h",
|
|
"reference/integer_ops/conv.h",
|
|
"reference/integer_ops/depthwise_conv.h",
|
|
"reference/integer_ops/fully_connected.h",
|
|
"reference/integer_ops/l2normalization.h",
|
|
"reference/integer_ops/logistic.h",
|
|
"reference/integer_ops/lut.h",
|
|
"reference/integer_ops/mean.h",
|
|
"reference/integer_ops/mul.h",
|
|
"reference/integer_ops/pooling.h",
|
|
"reference/integer_ops/tanh.h",
|
|
"reference/integer_ops/transpose_conv.h",
|
|
"reference/l2normalization.h",
|
|
"reference/leaky_relu.h",
|
|
"reference/log_softmax.h",
|
|
"reference/logistic.h",
|
|
"reference/lstm_cell.h",
|
|
"reference/maximum_minimum.h",
|
|
"reference/mul.h",
|
|
"reference/neg.h",
|
|
"reference/non_max_suppression.h",
|
|
"reference/pad.h",
|
|
"reference/pooling.h",
|
|
"reference/prelu.h",
|
|
"reference/process_broadcast_shapes.h",
|
|
"reference/quantize.h",
|
|
"reference/reduce.h",
|
|
"reference/requantize.h",
|
|
"reference/resize_bilinear.h",
|
|
"reference/resize_nearest_neighbor.h",
|
|
"reference/reverse.h",
|
|
"reference/round.h",
|
|
"reference/select.h",
|
|
"reference/slice.h",
|
|
"reference/softmax.h",
|
|
"reference/space_to_batch_nd.h",
|
|
"reference/space_to_depth.h",
|
|
"reference/strided_slice.h",
|
|
"reference/sub.h",
|
|
"reference/svdf.h",
|
|
"reference/tanh.h",
|
|
"reference/transpose.h",
|
|
"reference/transpose_conv.h",
|
|
] + select({
|
|
"//tensorflow/lite:tf_lite_static_memory": [],
|
|
"//conditions:default": [
|
|
"reference/integer_ops/dequantize.h",
|
|
"reference/integer_ops/log_softmax.h",
|
|
"reference/reference_ops.h",
|
|
"reference/sparse_ops/fully_connected.h",
|
|
"reference/string_comparisons.h",
|
|
],
|
|
}),
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
# We are disabling parse_headers for this header-only target so that the
|
|
# external and internal builds are consistent. The primary issue here is
|
|
# that parse_headers is not supported with bazel and the TFLM team would
|
|
# really like to have all build errors in shared Micro/Lite code be
|
|
# reproducible from the OSS build as well.
|
|
#
|
|
# See b/175817116 for more details.
|
|
features = ["-parse_headers"],
|
|
deps = [
|
|
":common",
|
|
":compatibility",
|
|
":constants",
|
|
":cppmath",
|
|
":quantization_util",
|
|
":reference_comparisons",
|
|
":runtime_shape",
|
|
":strided_slice_logic",
|
|
":tensor",
|
|
":tensor_utils",
|
|
":types",
|
|
"//tensorflow/lite:macros",
|
|
"//tensorflow/lite:string_util",
|
|
"//tensorflow/lite/core/c:c_api_types",
|
|
"//tensorflow/lite/core/c:common",
|
|
"//tensorflow/lite/kernels:kernel_util",
|
|
"//tensorflow/lite/kernels:op_macros",
|
|
"//tensorflow/lite/kernels/internal/utils:sparsity_format_converter",
|
|
"@eigen_archive//:eigen3",
|
|
"@gemmlowp//:fixedpoint",
|
|
"@ruy//ruy/profiler:instrumentation",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "legacy_reference_base",
|
|
srcs = [],
|
|
hdrs = [
|
|
"reference/add.h",
|
|
"reference/add_n.h",
|
|
"reference/arg_min_max.h",
|
|
"reference/batch_matmul.h",
|
|
"reference/batch_to_space_nd.h",
|
|
"reference/binary_function.h",
|
|
"reference/broadcast_loop.h",
|
|
"reference/cast.h",
|
|
"reference/ceil.h",
|
|
"reference/comparisons.h",
|
|
"reference/concatenation.h",
|
|
"reference/conv.h",
|
|
"reference/conv3d.h",
|
|
"reference/cumsum.h",
|
|
"reference/densify.h",
|
|
"reference/depth_to_space.h",
|
|
"reference/depthwiseconv_float.h",
|
|
"reference/depthwiseconv_uint8.h",
|
|
"reference/dequantize.h",
|
|
"reference/div.h",
|
|
"reference/elu.h",
|
|
"reference/exp.h",
|
|
"reference/fill.h",
|
|
"reference/floor.h",
|
|
"reference/floor_div.h",
|
|
"reference/floor_mod.h",
|
|
"reference/fully_connected.h",
|
|
"reference/gather.h",
|
|
"reference/hard_swish.h",
|
|
"reference/l2normalization.h",
|
|
"reference/leaky_relu.h",
|
|
"reference/legacy_reference_ops.h",
|
|
"reference/log_softmax.h",
|
|
"reference/logistic.h",
|
|
"reference/lstm_cell.h",
|
|
"reference/maximum_minimum.h",
|
|
"reference/mul.h",
|
|
"reference/neg.h",
|
|
"reference/pad.h",
|
|
"reference/pooling.h",
|
|
"reference/prelu.h",
|
|
"reference/process_broadcast_shapes.h",
|
|
"reference/quantize.h",
|
|
"reference/reduce.h",
|
|
"reference/reference_ops.h",
|
|
"reference/requantize.h",
|
|
"reference/resize_nearest_neighbor.h",
|
|
"reference/reverse.h",
|
|
"reference/round.h",
|
|
"reference/select.h",
|
|
"reference/slice.h",
|
|
"reference/softmax.h",
|
|
"reference/space_to_batch_nd.h",
|
|
"reference/space_to_depth.h",
|
|
"reference/strided_slice.h",
|
|
"reference/string_comparisons.h",
|
|
"reference/sub.h",
|
|
"reference/tanh.h",
|
|
"reference/transpose.h",
|
|
"reference/transpose_conv.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
# We are disabling parse_headers for this header-only target so that the
|
|
# external and internal builds are consistent. The primary issue here is
|
|
# that parse_headers is not supported with bazel and the TFLM team would
|
|
# really like to have all build errors in shared Micro/Lite code be
|
|
# reproducible from the OSS build as well.
|
|
#
|
|
# See b/175817116 for more details.
|
|
features = ["-parse_headers"],
|
|
deps = [
|
|
":common",
|
|
":compatibility",
|
|
":cppmath",
|
|
":legacy_types",
|
|
":quantization_util",
|
|
":reference_base",
|
|
":reference_comparisons",
|
|
":strided_slice_logic",
|
|
":tensor",
|
|
":tensor_utils",
|
|
":types",
|
|
"//tensorflow/lite:macros",
|
|
"//tensorflow/lite:string_util",
|
|
"//tensorflow/lite/core/c:c_api_types",
|
|
"//tensorflow/lite/core/c:common",
|
|
"//tensorflow/lite/kernels:op_macros",
|
|
"//tensorflow/lite/kernels/internal/utils:sparsity_format_converter",
|
|
"@eigen_archive//:eigen3",
|
|
"@gemmlowp",
|
|
"@ruy//ruy/profiler:instrumentation",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "tensor_ctypes",
|
|
srcs = ["tensor_ctypes.cc"],
|
|
hdrs = ["tensor_ctypes.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":types",
|
|
"//tensorflow/lite/core:macros",
|
|
"//tensorflow/lite/core/c:common",
|
|
],
|
|
)
|
|
|
|
cc_library_with_tflite(
|
|
name = "opaque_tensor_ctypes",
|
|
srcs = ["opaque_tensor_ctypes.cc"],
|
|
hdrs = ["opaque_tensor_ctypes.h"],
|
|
copts = tflite_copts(),
|
|
tflite_deps = [
|
|
"//tensorflow/lite/c:c_api_experimental_without_op_resolver",
|
|
"//tensorflow/lite:namespace",
|
|
],
|
|
deps = [
|
|
":types",
|
|
"//tensorflow/lite/core:macros",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "tensor",
|
|
hdrs = [
|
|
"portable_tensor.h",
|
|
"tensor_ctypes.h",
|
|
] + select({
|
|
"//tensorflow/lite:tf_lite_static_memory": [],
|
|
"//conditions:default": [
|
|
"tensor.h",
|
|
],
|
|
}),
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":tensor_ctypes",
|
|
":types",
|
|
"//tensorflow/lite:macros",
|
|
"//tensorflow/lite:string_util",
|
|
"//tensorflow/lite/core/c:common",
|
|
],
|
|
)
|
|
|
|
# Deprecated version of :tensor, kept for backwards compatibility.
|
|
cc_library(
|
|
name = "reference",
|
|
hdrs = [
|
|
"portable_tensor.h",
|
|
"tensor_ctypes.h",
|
|
] + select({
|
|
"//tensorflow/lite:tf_lite_static_memory": [],
|
|
"//conditions:default": [
|
|
"tensor.h",
|
|
],
|
|
}),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":tensor_ctypes",
|
|
":types",
|
|
"//tensorflow/lite:macros",
|
|
"//tensorflow/lite:string_util",
|
|
"//tensorflow/lite/core/c:common",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "portable_tensor_utils",
|
|
srcs = [
|
|
"reference/portable_tensor_utils.cc",
|
|
],
|
|
hdrs = [
|
|
"reference/portable_tensor_utils.h",
|
|
"reference/portable_tensor_utils_impl.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":common",
|
|
":compatibility",
|
|
":cppmath",
|
|
"@gemmlowp//:fixedpoint",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "neon_tensor_utils",
|
|
srcs = [
|
|
"optimized/neon_tensor_utils.cc",
|
|
],
|
|
hdrs = [
|
|
"optimized/neon_tensor_utils.h",
|
|
"optimized/neon_tensor_utils_impl.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts() + NEON_FLAGS_IF_APPLICABLE + HARD_FP_FLAGS_IF_APPLICABLE,
|
|
deps = [
|
|
":common",
|
|
":compatibility",
|
|
":cppmath",
|
|
":cpu_check",
|
|
":portable_tensor_utils",
|
|
"//tensorflow/lite/kernels:cpu_backend_context",
|
|
"//tensorflow/lite/kernels:cpu_backend_gemm",
|
|
"@ruy//ruy",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "sse_tensor_utils",
|
|
srcs = [
|
|
"compatibility.h",
|
|
"optimized/sse_tensor_utils.cc",
|
|
],
|
|
hdrs = [
|
|
"optimized/sse_tensor_utils.h",
|
|
"optimized/sse_tensor_utils_impl.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":cpu_check",
|
|
":neon_tensor_utils",
|
|
":portable_tensor_utils",
|
|
"//tensorflow/lite/core/c:common",
|
|
"//tensorflow/lite/kernels:cpu_backend_context",
|
|
"//tensorflow/lite/kernels:cpu_backend_gemm",
|
|
"//tensorflow/lite/kernels:op_macros",
|
|
"@com_google_absl//absl/base:prefetch",
|
|
"@ruy//ruy/profiler:instrumentation",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "avx2_quantization_utils",
|
|
hdrs = [
|
|
"optimized/avx2_quantization_utils.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":compatibility",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "kernel_utils",
|
|
srcs = ["kernel_utils.cc"],
|
|
hdrs = ["kernel_utils.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
":tensor_utils",
|
|
"//tensorflow/lite/core/c:common",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "reduce_utils",
|
|
hdrs = [
|
|
"optimized/reduce_utils.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
)
|
|
|
|
# Audio support classes imported directly from TensorFlow.
|
|
cc_library(
|
|
name = "audio_utils",
|
|
srcs = [
|
|
"mfcc.cc",
|
|
"mfcc_dct.cc",
|
|
"mfcc_mel_filterbank.cc",
|
|
"spectrogram.cc",
|
|
],
|
|
hdrs = [
|
|
"mfcc.h",
|
|
"mfcc_dct.h",
|
|
"mfcc_mel_filterbank.h",
|
|
"spectrogram.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = [
|
|
"//third_party/fft2d:fft2d_headers",
|
|
"@fft2d",
|
|
],
|
|
)
|
|
|
|
# This target is helpful to allow builds that can not use Eigen. See
|
|
# http://b/269699951 for more information. Ideally we could call this target
|
|
# portable_tensor_utils but that name is already being used for
|
|
# reference/portable_tensor_utils.cc and more.
|
|
cc_library(
|
|
name = "tensor_utils_no_eigen",
|
|
srcs = [
|
|
"portable_tensor_utils.cc",
|
|
],
|
|
hdrs = [
|
|
"portable_tensor_utils.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts() + NEON_FLAGS_IF_APPLICABLE,
|
|
deps = [
|
|
":cpu_check",
|
|
"//tensorflow/lite/core/c:common",
|
|
] + selects.with_or({
|
|
(
|
|
":arm_any",
|
|
): [":neon_tensor_utils"],
|
|
(
|
|
":x86_any",
|
|
): [
|
|
":portable_tensor_utils", # If SSSE3 isn't available, we fall back to portable
|
|
":sse_tensor_utils",
|
|
],
|
|
(
|
|
"//tensorflow/lite:tf_lite_static_memory",
|
|
"//conditions:default",
|
|
): [":portable_tensor_utils"],
|
|
}),
|
|
)
|
|
|
|
# Without adding portable_tensor_utils.h in the exported headers, targets will
|
|
# run into layering check build failure unless they list both :tensor_utils and
|
|
# :tensor_utils_no_eigen in their deps which can be quite confusing.
|
|
cc_library(
|
|
name = "tensor_utils",
|
|
srcs = [
|
|
"tensor_utils.cc",
|
|
],
|
|
hdrs = [
|
|
"portable_tensor_utils.h",
|
|
"tensor_utils.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts() + NEON_FLAGS_IF_APPLICABLE,
|
|
deps = [
|
|
":cpu_check",
|
|
":tensor_utils_no_eigen",
|
|
"//tensorflow/lite/core/c:common",
|
|
"@eigen_archive//:eigen3",
|
|
] + selects.with_or({
|
|
(
|
|
":arm_any",
|
|
): [":neon_tensor_utils"],
|
|
(
|
|
":x86_any",
|
|
): [
|
|
":portable_tensor_utils", # If SSSE3 isn't available, we fall back to portable
|
|
":sse_tensor_utils",
|
|
],
|
|
(
|
|
"//tensorflow/lite:tf_lite_static_memory",
|
|
"//conditions:default",
|
|
): [":portable_tensor_utils"],
|
|
}),
|
|
)
|
|
|
|
cc_library(
|
|
name = "test_util",
|
|
srcs = ["test_util.cc"],
|
|
hdrs = ["test_util.h"],
|
|
copts = tflite_copts(),
|
|
linkopts = select({
|
|
"//tensorflow:windows": [],
|
|
"//conditions:default": ["-lm"],
|
|
}),
|
|
deps = [
|
|
":types",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "tensor_utils_test",
|
|
srcs = ["tensor_utils_test.cc"],
|
|
linkopts = select({
|
|
"//tensorflow:android": [
|
|
"-fPIE -pie",
|
|
],
|
|
"//conditions:default": [],
|
|
}),
|
|
linkstatic = 1,
|
|
deps = [
|
|
":common",
|
|
":quantization_util",
|
|
":tensor_utils",
|
|
"//tensorflow/lite/core/c:common",
|
|
"//tensorflow/lite/kernels:cpu_backend_context",
|
|
"//tensorflow/lite/kernels:test_util",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "depthwiseconv_float_test",
|
|
srcs = ["depthwiseconv_float_test.cc"],
|
|
deps = [
|
|
":common",
|
|
":cpu_check",
|
|
":optimized_base",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "depthwiseconv_quantized_test",
|
|
srcs = [
|
|
"depthwiseconv_quantized_test.cc",
|
|
"optimized/depthwiseconv_uint8_transitional.h",
|
|
],
|
|
copts = tflite_copts(),
|
|
shard_count = 2,
|
|
deps = [
|
|
":compatibility",
|
|
":cpu_check",
|
|
":optimized_base",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"//tensorflow/lite/kernels:cpu_backend_context",
|
|
"@com_google_absl//absl/strings",
|
|
"@com_google_googletest//:gtest_main",
|
|
"@ruy//ruy:context",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "depthwiseconv_per_channel_quantized_test",
|
|
srcs = [
|
|
"depthwiseconv_per_channel_quantized_test.cc",
|
|
],
|
|
shard_count = 2,
|
|
deps = [
|
|
":common",
|
|
":optimized_base",
|
|
":quantization_util",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "depthwiseconv_per_channel_quantized_16x8_test",
|
|
srcs = [
|
|
"depthwiseconv_per_channel_quantized_16x8_test.cc",
|
|
],
|
|
shard_count = 2,
|
|
deps = [
|
|
":common",
|
|
":quantization_util",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "conv_per_channel_quantized_16x8_test",
|
|
srcs = [
|
|
"conv_per_channel_quantized_16x8_test.cc",
|
|
],
|
|
shard_count = 2,
|
|
deps = [
|
|
":common",
|
|
":quantization_util",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "resize_bilinear_test",
|
|
srcs = ["resize_bilinear_test.cc"],
|
|
defines = [
|
|
"TFLITE_SINGLE_ROUNDING=0",
|
|
],
|
|
deps = [
|
|
":optimized_base",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "resize_bilinear_test_single_rounding",
|
|
srcs = ["resize_bilinear_test.cc"],
|
|
defines = [
|
|
"TFLITE_SINGLE_ROUNDING=1",
|
|
],
|
|
deps = [
|
|
":optimized_base",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "resize_nearest_neighbor_test",
|
|
srcs = ["resize_nearest_neighbor_test.cc"],
|
|
deps = [
|
|
":optimized_base",
|
|
":reference_base",
|
|
":test_util",
|
|
":types",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "softmax_quantized_test",
|
|
timeout = "long",
|
|
srcs = [
|
|
"softmax_quantized_test.cc",
|
|
],
|
|
shard_count = 4,
|
|
deps = [
|
|
":optimized_base",
|
|
":quantization_util",
|
|
":reference_base",
|
|
":test_util",
|
|
"//tensorflow/lite:string",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "strided_slice_logic_test",
|
|
timeout = "moderate",
|
|
srcs = [
|
|
"strided_slice_logic_test.cc",
|
|
],
|
|
deps = [
|
|
":strided_slice_logic",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "logsoftmax_quantized_test",
|
|
timeout = "long",
|
|
srcs = [
|
|
"logsoftmax_quantized_test.cc",
|
|
],
|
|
shard_count = 4,
|
|
tags = [
|
|
# TODO(b/122242739): Reenable after fixing the flakiness?
|
|
"nomac",
|
|
"tflite_not_portable",
|
|
],
|
|
deps = [
|
|
":optimized_base",
|
|
":quantization_util",
|
|
":reference_base",
|
|
":test_util",
|
|
"//tensorflow/lite:string",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "averagepool_quantized_test",
|
|
timeout = "long",
|
|
srcs = [
|
|
"averagepool_quantized_test.cc",
|
|
],
|
|
shard_count = 1,
|
|
deps = [
|
|
":optimized_base",
|
|
":reference_base",
|
|
":test_util",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "maxpool_quantized_test",
|
|
timeout = "long",
|
|
srcs = [
|
|
"maxpool_quantized_test.cc",
|
|
],
|
|
shard_count = 1,
|
|
deps = [
|
|
":optimized_base",
|
|
":reference_base",
|
|
":test_util",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "log_quantized_test",
|
|
srcs = ["log_quantized_test.cc"],
|
|
linkopts = select({
|
|
"//tensorflow:windows": [],
|
|
"//conditions:default": ["-lm"],
|
|
}),
|
|
deps = [
|
|
":optimized_base",
|
|
":reference_base",
|
|
"//tensorflow/lite:string",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "cpu_check",
|
|
srcs = ["optimized/cpu_check.cc"],
|
|
hdrs = [
|
|
"optimized/cpu_check.h",
|
|
"optimized/neon_check.h",
|
|
"optimized/sse_check.h",
|
|
],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
deps = select({
|
|
":x86_any": ["@arm_neon_2_x86_sse"],
|
|
"//conditions:default": [],
|
|
}),
|
|
)
|
|
|
|
cc_library(
|
|
name = "constants",
|
|
hdrs = ["constants.h"],
|
|
compatible_with = get_compatible_with_portable(),
|
|
copts = tflite_copts(),
|
|
)
|
|
|
|
cc_test(
|
|
name = "batch_to_space_nd_test",
|
|
srcs = ["batch_to_space_nd_test.cc"],
|
|
deps = [
|
|
":optimized_base",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "non_max_suppression_test",
|
|
srcs = ["non_max_suppression_test.cc"],
|
|
deps = [
|
|
":reference_base",
|
|
"//tensorflow/lite/kernels:test_util",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "per_channel_dequantize_test",
|
|
srcs = ["per_channel_dequantize_test.cc"],
|
|
deps = [
|
|
":reference_base",
|
|
":tensor_utils_no_eigen",
|
|
":types",
|
|
"//tensorflow/lite/kernels:test_util",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "per_channel_quantize_test",
|
|
srcs = ["per_channel_quantize_test.cc"],
|
|
deps = [
|
|
":reference_base",
|
|
":types",
|
|
"//tensorflow/lite/kernels:test_util",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "avx2_quantization_utils_test",
|
|
srcs = ["optimized/avx2_quantization_utils_test.cc"],
|
|
copts = select(
|
|
{
|
|
":x86_64": [
|
|
"-mavx2",
|
|
],
|
|
"//conditions:default": [
|
|
],
|
|
},
|
|
),
|
|
deps = [
|
|
":avx2_quantization_utils",
|
|
":common",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "reduce_utils_test",
|
|
srcs = ["optimized/reduce_utils_test.cc"],
|
|
deps = [
|
|
":common",
|
|
":reduce_utils",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "runtime_shape_test",
|
|
srcs = ["runtime_shape_test.cc"],
|
|
deps = [
|
|
":types",
|
|
"@com_google_absl//absl/algorithm:container",
|
|
"@com_google_absl//absl/types:span",
|
|
"@com_google_googletest//:gtest_main",
|
|
],
|
|
)
|
|
|
|
filegroup(
|
|
name = "optimized_op_headers",
|
|
srcs = glob([
|
|
"optimized/*.h",
|
|
]),
|
|
visibility = ["//visibility:private"],
|
|
)
|
|
|
|
filegroup(
|
|
name = "reference_op_headers",
|
|
srcs = glob([
|
|
"reference/*.h",
|
|
]),
|
|
visibility = ["//visibility:private"],
|
|
)
|
|
|
|
filegroup(
|
|
name = "headers",
|
|
srcs = glob([
|
|
"*.h",
|
|
]),
|
|
visibility = ["//visibility:private"],
|
|
)
|
|
|
|
transitive_hdrs(
|
|
name = "nnapi_external_headers",
|
|
visibility = ["//visibility:private"],
|
|
deps = [
|
|
"@eigen_archive//:eigen3",
|
|
"@gemmlowp",
|
|
],
|
|
)
|
|
|
|
# ---------------------------------------------------------
|
|
# The public target "install_nnapi_extra_headers" is only
|
|
# used for external targets that requires exporting optmized
|
|
# and reference op headers.
|
|
|
|
genrule(
|
|
name = "install_nnapi_extra_headers",
|
|
srcs = [
|
|
":nnapi_external_headers",
|
|
":headers",
|
|
":optimized_op_headers",
|
|
":reference_op_headers",
|
|
],
|
|
outs = ["include"],
|
|
cmd = """
|
|
mkdir $@
|
|
for f in $(SRCS); do
|
|
d="$${f%/*}"
|
|
d="$${d#bazel-out*genfiles/}"
|
|
d="$${d#*external/eigen_archive/}"
|
|
|
|
if [[ $${d} == *local_config_* ]]; then
|
|
continue
|
|
fi
|
|
|
|
if [[ $${d} == external* ]]; then
|
|
extname="$${d#*external/}"
|
|
extname="$${extname%%/*}"
|
|
if [[ $${TF_SYSTEM_LIBS:-} == *$${extname}* ]]; then
|
|
continue
|
|
fi
|
|
fi
|
|
|
|
mkdir -p "$@/$${d}"
|
|
cp "$${f}" "$@/$${d}/"
|
|
done
|
|
""",
|
|
tags = ["manual"],
|
|
visibility = ["//visibility:private"],
|
|
)
|
|
|
|
tflite_portable_test_suite_combined(combine_conditions = {"deps": ["@com_google_googletest//:gtest_main"]})
|