Add tests logic moved to add_test_util that can be reused among different backends.
PiperOrigin-RevId: 351841484 Change-Id: I4520c6e75129c2a7e4ef382e2f5513408dbf9e9a
This commit is contained in:
parent
82ebf8f223
commit
1203ea6aad
tensorflow/lite/delegates/gpu
cl/kernels
common
@ -20,7 +20,7 @@ cc_test(
|
||||
":cl_test",
|
||||
"//tensorflow/lite/delegates/gpu/common:operations",
|
||||
"//tensorflow/lite/delegates/gpu/common:status",
|
||||
"//tensorflow/lite/delegates/gpu/common/tasks:add",
|
||||
"//tensorflow/lite/delegates/gpu/common/tasks:add_test_util",
|
||||
"@com_google_googletest//:gtest_main",
|
||||
],
|
||||
)
|
||||
|
@ -13,8 +13,6 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
#include "tensorflow/lite/delegates/gpu/common/tasks/add.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
@ -22,9 +20,7 @@ limitations under the License.
|
||||
#include "tensorflow/lite/delegates/gpu/cl/kernels/cl_test.h"
|
||||
#include "tensorflow/lite/delegates/gpu/common/operations.h"
|
||||
#include "tensorflow/lite/delegates/gpu/common/status.h"
|
||||
|
||||
using ::testing::FloatNear;
|
||||
using ::testing::Pointwise;
|
||||
#include "tensorflow/lite/delegates/gpu/common/tasks/add_test_util.h"
|
||||
|
||||
namespace tflite {
|
||||
namespace gpu {
|
||||
@ -32,96 +28,18 @@ namespace cl {
|
||||
namespace {
|
||||
|
||||
TEST_F(OpenCLOperationTest, AddTwoEqualTensors) {
|
||||
TensorFloat32 src0, src1;
|
||||
src0.shape = BHWC(1, 2, 1, 2);
|
||||
src0.data = {0.0f, -1.0f, -0.05f, 0.045f};
|
||||
src1.shape = BHWC(1, 2, 1, 2);
|
||||
src1.data = {0.0f, 1.0f, -0.05f, -0.045f};
|
||||
std::vector<int> channels = {2, 2};
|
||||
|
||||
for (auto storage : env_.GetSupportedStorages()) {
|
||||
for (auto precision : env_.GetSupportedPrecisions()) {
|
||||
const float eps = precision == CalculationsPrecision::F32 ? 1e-6f : 1e-3f;
|
||||
OperationDef op_def;
|
||||
op_def.precision = precision;
|
||||
auto data_type = DeduceDataTypeFromPrecision(precision);
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.dst_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
TensorFloat32 dst_tensor;
|
||||
GPUOperation operation = CreateAdd(op_def, channels, channels[0]);
|
||||
ASSERT_OK(ExecuteGPUOperation(
|
||||
{src0, src1}, creation_context_,
|
||||
absl::make_unique<GPUOperation>(std::move(operation)),
|
||||
BHWC(1, 2, 1, 2), &dst_tensor));
|
||||
EXPECT_THAT(dst_tensor.data,
|
||||
Pointwise(FloatNear(eps), {0.0f, 0.0f, -0.1f, 0.0f}));
|
||||
}
|
||||
}
|
||||
auto status = AddTwoEqualTensorsTest(&exec_env_);
|
||||
ASSERT_TRUE(status.ok()) << status.error_message();
|
||||
}
|
||||
|
||||
TEST_F(OpenCLOperationTest, AddFirstTensorHasMoreChannelsThanSecond) {
|
||||
TensorFloat32 src0, src1;
|
||||
src0.shape = BHWC(1, 2, 1, 6);
|
||||
src0.data = {0.0f, -1.0f, -0.05f, 0.045f, 1.0f, -2.0f,
|
||||
-1.05f, 1.045f, 2.0f, -3.0f, -2.05f, 2.045f};
|
||||
src1.shape = BHWC(1, 2, 1, 2);
|
||||
src1.data = {0.0f, 1.0f, -0.05f, -0.045f};
|
||||
std::vector<int> channels = {6, 2};
|
||||
|
||||
for (auto storage : env_.GetSupportedStorages()) {
|
||||
for (auto precision : env_.GetSupportedPrecisions()) {
|
||||
const float eps = precision == CalculationsPrecision::F32 ? 1e-6f : 1e-3f;
|
||||
OperationDef op_def;
|
||||
op_def.precision = precision;
|
||||
auto data_type = DeduceDataTypeFromPrecision(precision);
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.dst_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
TensorFloat32 dst_tensor;
|
||||
GPUOperation operation = CreateAdd(op_def, channels, channels[0]);
|
||||
ASSERT_OK(ExecuteGPUOperation(
|
||||
{src0, src1}, creation_context_,
|
||||
absl::make_unique<GPUOperation>(std::move(operation)),
|
||||
BHWC(1, 2, 1, 6), &dst_tensor));
|
||||
EXPECT_THAT(dst_tensor.data,
|
||||
Pointwise(FloatNear(eps),
|
||||
{0.0f, 0.0f, -0.05f, 0.045f, 1.0f, -2.0f, -1.1f,
|
||||
1.0f, 2.0f, -3.0f, -2.05f, 2.045f}));
|
||||
}
|
||||
}
|
||||
auto status = AddFirstTensorHasMoreChannelsThanSecondTest(&exec_env_);
|
||||
ASSERT_TRUE(status.ok()) << status.error_message();
|
||||
}
|
||||
|
||||
TEST_F(OpenCLOperationTest, AddFirstTensorHasLessChannelsThanSecond) {
|
||||
TensorFloat32 src0, src1;
|
||||
src1.shape = BHWC(1, 2, 1, 6);
|
||||
src1.data = {0.0f, -1.0f, -0.05f, 0.045f, 1.0f, -2.0f,
|
||||
-1.05f, 1.045f, 2.0f, -3.0f, -2.05f, 2.045f};
|
||||
src0.shape = BHWC(1, 2, 1, 2);
|
||||
src0.data = {0.0f, 1.0f, -0.05f, -0.045f};
|
||||
std::vector<int> channels = {2, 6};
|
||||
|
||||
for (auto storage : env_.GetSupportedStorages()) {
|
||||
for (auto precision : env_.GetSupportedPrecisions()) {
|
||||
const float eps = precision == CalculationsPrecision::F32 ? 1e-6f : 1e-3f;
|
||||
OperationDef op_def;
|
||||
op_def.precision = precision;
|
||||
auto data_type = DeduceDataTypeFromPrecision(precision);
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.dst_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
TensorFloat32 dst_tensor;
|
||||
GPUOperation operation = CreateAdd(op_def, channels, 6);
|
||||
ASSERT_OK(ExecuteGPUOperation(
|
||||
{src0, src1}, creation_context_,
|
||||
absl::make_unique<GPUOperation>(std::move(operation)),
|
||||
BHWC(1, 2, 1, 6), &dst_tensor));
|
||||
EXPECT_THAT(dst_tensor.data,
|
||||
Pointwise(FloatNear(eps),
|
||||
{0.0f, 0.0f, -0.05f, 0.045f, 1.0f, -2.0f, -1.1f,
|
||||
1.0f, 2.0f, -3.0f, -2.05f, 2.045f}));
|
||||
}
|
||||
}
|
||||
auto status = AddFirstTensorHasLessChannelsThanSecond(&exec_env_);
|
||||
ASSERT_TRUE(status.ok()) << status.error_message();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
@ -133,6 +133,8 @@ cc_library(
|
||||
|
||||
cc_library(
|
||||
name = "testing_util",
|
||||
testonly = 1,
|
||||
srcs = ["testing_util.cc"],
|
||||
hdrs = ["testing_util.h"],
|
||||
deps = [
|
||||
":gpu_operation",
|
||||
@ -141,6 +143,7 @@ cc_library(
|
||||
"//tensorflow/lite/delegates/gpu/common:precision",
|
||||
"//tensorflow/lite/delegates/gpu/common:shape",
|
||||
"//tensorflow/lite/delegates/gpu/common:tensor",
|
||||
"@com_google_absl//absl/strings",
|
||||
],
|
||||
)
|
||||
|
||||
|
42
tensorflow/lite/delegates/gpu/common/task/testing_util.cc
Normal file
42
tensorflow/lite/delegates/gpu/common/task/testing_util.cc
Normal file
@ -0,0 +1,42 @@
|
||||
/* Copyright 2021 The TensorFlow Authors. All Rights Reserved.
|
||||
|
||||
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.
|
||||
==============================================================================*/
|
||||
|
||||
#include "tensorflow/lite/delegates/gpu/common/task/testing_util.h"
|
||||
|
||||
#include "absl/strings/str_cat.h"
|
||||
|
||||
namespace tflite {
|
||||
namespace gpu {
|
||||
|
||||
absl::Status PointWiseNear(const std::vector<float>& ref,
|
||||
const std::vector<float>& to_compare, float eps) {
|
||||
if (ref.size() != to_compare.size()) {
|
||||
return absl::InternalError(absl::StrCat("ref size(", ref.size(),
|
||||
") != to_compare size(",
|
||||
to_compare.size(), ")"));
|
||||
}
|
||||
for (int i = 0; i < ref.size(); ++i) {
|
||||
const float abs_diff = fabs(ref[i] - to_compare[i]);
|
||||
if (abs_diff > eps) {
|
||||
return absl::InternalError(absl::StrCat(
|
||||
"ref[", i, "] = ", ref[i], ", to_compare[", i, "] = ", to_compare[i],
|
||||
", abs diff = ", abs_diff, " > ", eps, " (eps)"));
|
||||
}
|
||||
}
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
} // namespace gpu
|
||||
} // namespace tflite
|
@ -66,6 +66,10 @@ class TestExecutionEnvironment {
|
||||
}
|
||||
};
|
||||
|
||||
absl::Status PointWiseNear(const std::vector<float>& ref,
|
||||
const std::vector<float>& to_compare,
|
||||
float eps = 0.0f);
|
||||
|
||||
} // namespace gpu
|
||||
} // namespace tflite
|
||||
|
||||
|
@ -16,6 +16,19 @@ cc_library(
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "add_test_util",
|
||||
testonly = 1,
|
||||
srcs = ["add_test_util.cc"],
|
||||
hdrs = ["add_test_util.h"],
|
||||
deps = [
|
||||
":add",
|
||||
"//tensorflow/lite/delegates/gpu/common:operations",
|
||||
"//tensorflow/lite/delegates/gpu/common:status",
|
||||
"//tensorflow/lite/delegates/gpu/common/task:testing_util",
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "concat_xy",
|
||||
srcs = ["concat_xy.cc"],
|
||||
|
118
tensorflow/lite/delegates/gpu/common/tasks/add_test_util.cc
Normal file
118
tensorflow/lite/delegates/gpu/common/tasks/add_test_util.cc
Normal file
@ -0,0 +1,118 @@
|
||||
/* Copyright 2021 The TensorFlow Authors. All Rights Reserved.
|
||||
|
||||
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.
|
||||
==============================================================================*/
|
||||
|
||||
#include "tensorflow/lite/delegates/gpu/common/tasks/add_test_util.h"
|
||||
|
||||
#include "tensorflow/lite/delegates/gpu/common/operations.h"
|
||||
#include "tensorflow/lite/delegates/gpu/common/status.h"
|
||||
#include "tensorflow/lite/delegates/gpu/common/task/testing_util.h"
|
||||
#include "tensorflow/lite/delegates/gpu/common/tasks/add.h"
|
||||
|
||||
namespace tflite {
|
||||
namespace gpu {
|
||||
|
||||
absl::Status AddTwoEqualTensorsTest(TestExecutionEnvironment* env) {
|
||||
TensorFloat32 src0, src1;
|
||||
src0.shape = BHWC(1, 2, 1, 2);
|
||||
src0.data = {0.0f, -1.0f, -0.05f, 0.045f};
|
||||
src1.shape = BHWC(1, 2, 1, 2);
|
||||
src1.data = {0.0f, 1.0f, -0.05f, -0.045f};
|
||||
std::vector<int> channels = {2, 2};
|
||||
|
||||
for (auto storage : env->GetSupportedStorages()) {
|
||||
for (auto precision : env->GetSupportedPrecisions()) {
|
||||
const float eps = precision == CalculationsPrecision::F32 ? 1e-6f : 1e-3f;
|
||||
OperationDef op_def;
|
||||
op_def.precision = precision;
|
||||
auto data_type = DeduceDataTypeFromPrecision(precision);
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.dst_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
TensorFloat32 dst_tensor;
|
||||
GPUOperation operation = CreateAdd(op_def, channels, channels[0]);
|
||||
RETURN_IF_ERROR(env->ExecuteGPUOperation(
|
||||
{src0, src1}, absl::make_unique<GPUOperation>(std::move(operation)),
|
||||
BHWC(1, 2, 1, 2), &dst_tensor));
|
||||
RETURN_IF_ERROR(
|
||||
PointWiseNear({0.0f, 0.0f, -0.1f, 0.0f}, dst_tensor.data, eps));
|
||||
}
|
||||
}
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
absl::Status AddFirstTensorHasMoreChannelsThanSecondTest(
|
||||
TestExecutionEnvironment* env) {
|
||||
TensorFloat32 src0, src1;
|
||||
src0.shape = BHWC(1, 2, 1, 6);
|
||||
src0.data = {0.0f, -1.0f, -0.05f, 0.045f, 1.0f, -2.0f,
|
||||
-1.05f, 1.045f, 2.0f, -3.0f, -2.05f, 2.045f};
|
||||
src1.shape = BHWC(1, 2, 1, 2);
|
||||
src1.data = {0.0f, 1.0f, -0.05f, -0.045f};
|
||||
std::vector<int> channels = {6, 2};
|
||||
for (auto storage : env->GetSupportedStorages()) {
|
||||
for (auto precision : env->GetSupportedPrecisions()) {
|
||||
const float eps = precision == CalculationsPrecision::F32 ? 1e-6f : 1e-3f;
|
||||
OperationDef op_def;
|
||||
op_def.precision = precision;
|
||||
auto data_type = DeduceDataTypeFromPrecision(precision);
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.dst_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
TensorFloat32 dst_tensor;
|
||||
GPUOperation operation = CreateAdd(op_def, channels, channels[0]);
|
||||
RETURN_IF_ERROR(env->ExecuteGPUOperation(
|
||||
{src0, src1}, absl::make_unique<GPUOperation>(std::move(operation)),
|
||||
BHWC(1, 2, 1, 6), &dst_tensor));
|
||||
RETURN_IF_ERROR(PointWiseNear({0.0f, 0.0f, -0.05f, 0.045f, 1.0f, -2.0f,
|
||||
-1.1f, 1.0f, 2.0f, -3.0f, -2.05f, 2.045f},
|
||||
dst_tensor.data, eps));
|
||||
}
|
||||
}
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
absl::Status AddFirstTensorHasLessChannelsThanSecond(
|
||||
TestExecutionEnvironment* env) {
|
||||
TensorFloat32 src0, src1;
|
||||
src1.shape = BHWC(1, 2, 1, 6);
|
||||
src1.data = {0.0f, -1.0f, -0.05f, 0.045f, 1.0f, -2.0f,
|
||||
-1.05f, 1.045f, 2.0f, -3.0f, -2.05f, 2.045f};
|
||||
src0.shape = BHWC(1, 2, 1, 2);
|
||||
src0.data = {0.0f, 1.0f, -0.05f, -0.045f};
|
||||
std::vector<int> channels = {2, 6};
|
||||
for (auto storage : env->GetSupportedStorages()) {
|
||||
for (auto precision : env->GetSupportedPrecisions()) {
|
||||
const float eps = precision == CalculationsPrecision::F32 ? 1e-6f : 1e-3f;
|
||||
OperationDef op_def;
|
||||
op_def.precision = precision;
|
||||
auto data_type = DeduceDataTypeFromPrecision(precision);
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.src_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
op_def.dst_tensors.push_back({data_type, storage, Layout::HWC});
|
||||
TensorFloat32 dst_tensor;
|
||||
GPUOperation operation = CreateAdd(op_def, channels, 6);
|
||||
RETURN_IF_ERROR(env->ExecuteGPUOperation(
|
||||
{src0, src1}, absl::make_unique<GPUOperation>(std::move(operation)),
|
||||
BHWC(1, 2, 1, 6), &dst_tensor));
|
||||
RETURN_IF_ERROR(PointWiseNear({0.0f, 0.0f, -0.05f, 0.045f, 1.0f, -2.0f,
|
||||
-1.1f, 1.0f, 2.0f, -3.0f, -2.05f, 2.045f},
|
||||
dst_tensor.data, eps));
|
||||
}
|
||||
}
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
} // namespace gpu
|
||||
} // namespace tflite
|
36
tensorflow/lite/delegates/gpu/common/tasks/add_test_util.h
Normal file
36
tensorflow/lite/delegates/gpu/common/tasks/add_test_util.h
Normal file
@ -0,0 +1,36 @@
|
||||
/* Copyright 2021 The TensorFlow Authors. All Rights Reserved.
|
||||
|
||||
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 TENSORFLOW_LITE_DELEGATES_GPU_COMMON_TASKS_ADD_TEST_UTIL_H_
|
||||
#define TENSORFLOW_LITE_DELEGATES_GPU_COMMON_TASKS_ADD_TEST_UTIL_H_
|
||||
|
||||
#include "tensorflow/lite/delegates/gpu/common/status.h"
|
||||
#include "tensorflow/lite/delegates/gpu/common/task/testing_util.h"
|
||||
|
||||
namespace tflite {
|
||||
namespace gpu {
|
||||
|
||||
absl::Status AddTwoEqualTensorsTest(TestExecutionEnvironment* env);
|
||||
|
||||
absl::Status AddFirstTensorHasMoreChannelsThanSecondTest(
|
||||
TestExecutionEnvironment* env);
|
||||
|
||||
absl::Status AddFirstTensorHasLessChannelsThanSecond(
|
||||
TestExecutionEnvironment* env);
|
||||
|
||||
} // namespace gpu
|
||||
} // namespace tflite
|
||||
|
||||
#endif // TENSORFLOW_LITE_DELEGATES_GPU_COMMON_TASKS_ADD_TEST_UTIL_H_
|
Loading…
Reference in New Issue
Block a user