diff --git a/tensorflow/core/kernels/mlir_generated/BUILD b/tensorflow/core/kernels/mlir_generated/BUILD index 0862b37848a..bff0811c63e 100644 --- a/tensorflow/core/kernels/mlir_generated/BUILD +++ b/tensorflow/core/kernels/mlir_generated/BUILD @@ -197,6 +197,7 @@ tf_cuda_cc_test( "no_cuda_asan", # TODO(b/171341759): re-enable. ], deps = [ + ":gpu_ops_test_util", "//tensorflow/core:framework", "//tensorflow/core:framework_internal", "//tensorflow/core:tensorflow", diff --git a/tensorflow/core/kernels/mlir_generated/gpu_ops_test_util.h b/tensorflow/core/kernels/mlir_generated/gpu_ops_test_util.h index 30c34c1405c..1f2bc105e1a 100644 --- a/tensorflow/core/kernels/mlir_generated/gpu_ops_test_util.h +++ b/tensorflow/core/kernels/mlir_generated/gpu_ops_test_util.h @@ -48,10 +48,12 @@ absl::InlinedVector RepeatInputToMatchShape( return result; } -/// Helper functions to get default input values. +/// Helper functions to get default input shapes. TensorShape DefaultInputShape(); +/// Helper functions to get default input data. + template ::value, bool> = true> @@ -72,17 +74,10 @@ T DefaultScalarInput() { return static_cast(true); } -template -absl::InlinedVector InfZeroInput() { - return InputAsVector({-std::numeric_limits::infinity(), - -0.1, -0.0, 0.0, 0.1, - std::numeric_limits::infinity()}); -} - template ::value, bool> = true> -absl::InlinedVector DefaultInput(absl::string_view op_name) { +absl::InlinedVector DefaultInput(absl::string_view op_name = "") { // Only generate values less than the bitwidth of the data type. if (op_name == "LeftShift" || op_name == "RightShift") { auto max_shift = sizeof(T) * 8 - 1; @@ -96,16 +91,65 @@ absl::InlinedVector DefaultInput(absl::string_view op_name) { template ::value, bool> = true> -absl::InlinedVector DefaultInput(absl::string_view op_name) { +absl::InlinedVector DefaultInput(absl::string_view op_name = "") { return InputAsVector({-18.0, -9.0, -1e-6, -0.0, 0.0, 1e-6, 0.1, 0.2, 0.3, 0.5, 0.7, 0.9, 9.0, 18.0}); } template ::value, bool> = true> -absl::InlinedVector DefaultInput(absl::string_view op_name) { +absl::InlinedVector DefaultInput(absl::string_view op_name = "") { return InputAsVector({true, false, true, true, false}); } + +/// Helper functions to get more specific input data. + +template ::value, + bool> = true> +absl::InlinedVector, 10> DefaultComplexInput() { + auto input = test::DefaultInput(); + absl::InlinedVector, 10> complex_input; + for (T value : input) { + complex_input.emplace_back(value, -value); + } + return complex_input; +} + +template ::value, + bool> = true> +absl::InlinedVector NearZeroAndExtremeInput() { + return InputAsVector({-std::numeric_limits::infinity(), + -0.1, -0.0, 0.0, 0.1, + std::numeric_limits::infinity()}); +} + +template ::value, + bool> = true> +absl::InlinedVector NearZeroAndExtremeInput() { + return InputAsVector({std::numeric_limits::min(), + std::numeric_limits::min() + 1, -1, 0, 1, + std::numeric_limits::max()}); +} + +template ::value, + bool> = true> +absl::InlinedVector DefaultInputGreaterThanZero() { + return test::InputAsVector({18.0, 9.0, 1e-6, 1.0, 0.1, 1e-6, 0.1, + 0.2, 0.3, 0.5, 0.7, 0.9, 9.0, 18.0}); +} + +template ::value, + bool> = true> +absl::InlinedVector DefaultInputGreaterOrEqualToZero() { + return test::InputAsVector({18.0, 9.0, 1e-6, 0.0, 0.1, 1e-6, 0.1, + 0.2, 0.3, 0.5, 0.7, 0.9, 9.0, 18.0}); +} + } // namespace test } // namespace tensorflow diff --git a/tensorflow/core/kernels/mlir_generated/gpu_unary_ops_test.cc b/tensorflow/core/kernels/mlir_generated/gpu_unary_ops_test.cc index 64c548e2e41..a3308b5c01f 100644 --- a/tensorflow/core/kernels/mlir_generated/gpu_unary_ops_test.cc +++ b/tensorflow/core/kernels/mlir_generated/gpu_unary_ops_test.cc @@ -28,6 +28,7 @@ limitations under the License. #include "tensorflow/core/framework/node_def_builder.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/framework/tensor_testutil.h" +#include "tensorflow/core/kernels/mlir_generated/gpu_ops_test_util.h" #include "tensorflow/core/kernels/ops_testutil.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/test.h" @@ -44,20 +45,10 @@ class GpuUnaryOpTest : public OpsTestBase { SetDevice(tensorflow::DEVICE_GPU, std::move(device_gpu)); } - // 'T' is the input type, 'RT' is the input type for the callback function, - // 'OutT' is the output type, 'ROutT' is the output type for the callback - // function. In most cases it is enough to just provide the input type, - // because all the types are the same. - template - void Run(std::vector input_shape, absl::InlinedVector input, - const std::string op_name, ROutT (*expected_callback)(RT), - bool expect_equal = true, bool add_tout = false, - bool expect_buffer_reuse = true, bool add_t = true) { - assert(std::accumulate(input_shape.begin(), input_shape.end(), 1, - std::multiplies()) == input.size() && - "Expected input length to equal to shape's number of elements."); - - TensorShape shape(input_shape); + template + void SetOpKernel(const std::string& op_name, const TensorShape& shape, + const absl::InlinedVector& input, bool add_t, + bool add_tout) { NodeDefBuilder builder("some_name", op_name); builder.Input(FakeInput(DataTypeToEnum::v())); if (add_t) { @@ -70,6 +61,15 @@ class GpuUnaryOpTest : public OpsTestBase { TF_ASSERT_OK(InitOp()); AddInputFromArray(shape, input); + } + + template + void RunAndExpectResult(const std::string& op_name, const TensorShape& shape, + const absl::InlinedVector& input, + const absl::InlinedVector& expected_output, + bool add_t, bool add_tout, bool expect_buffer_reuse, + bool expect_equal) { + SetOpKernel(op_name, shape, input, add_t, add_tout); TF_ASSERT_OK(RunOpKernel()); // Assert buffer reuse if expected. @@ -81,13 +81,7 @@ class GpuUnaryOpTest : public OpsTestBase { // Assert expected results. Tensor expected_tensor(allocator(), DataTypeToEnum::value, shape); - absl::InlinedVector expected; - expected.reserve(input.size()); - for (const T& inp : input) { - expected.push_back( - static_cast(expected_callback(static_cast(inp)))); - } - test::FillValues(&expected_tensor, expected); + test::FillValues(&expected_tensor, expected_output); if (expect_equal) { test::ExpectEqual(expected_tensor, *GetOutput(0)); } else { @@ -95,241 +89,225 @@ class GpuUnaryOpTest : public OpsTestBase { } } - // Some helper functions to get default input values. + template + void Test(const std::string op_name, const TensorShape& shape, + absl::InlinedVector input, + BaselineOutT (*baseline_callback)(BaselineT), + bool expect_equal = true, bool add_tout = false, + bool expect_buffer_reuse = true, bool add_t = true) { + // Prepare inputs and compute expected results. + auto repeated_input = + test::RepeatInputToMatchShape(input, shape.num_elements()); + absl::InlinedVector expected_output = + ComputeExpectedOutput( + repeated_input, baseline_callback); - std::vector DefaultInputShape() { return std::vector{2, 7}; } - - template - absl::InlinedVector DefaultInput() { - return InputAsVector({-18.0, -9.0, -1e-6, -0.0, 0.0, 1e-6, 0.1, 0.2, 0.3, - 0.5, 0.7, 0.9, 9.0, 18.0}); - } - - template - absl::InlinedVector, 10> DefaultComplexInput() { - auto input = DefaultInput(); - absl::InlinedVector, 10> complex_input; - for (T value : input) { - complex_input.emplace_back(value, -value); - } - return complex_input; - } - - template - absl::InlinedVector DefaultInputGreaterThanZero() { - return InputAsVector({18.0, 9.0, 1e-6, 1.0, 0.1, 1e-6, 0.1, 0.2, 0.3, - 0.5, 0.7, 0.9, 9.0, 18.0}); - } - - template - absl::InlinedVector DefaultInputGreaterOrEqualToZero() { - return InputAsVector({18.0, 9.0, 1e-6, 0.0, 0.1, 1e-6, 0.1, 0.2, 0.3, - 0.5, 0.7, 0.9, 9.0, 18.0}); + RunAndExpectResult(op_name, shape, repeated_input, expected_output, + add_t, add_tout, expect_buffer_reuse, + expect_equal); } private: - template - absl::InlinedVector InputAsVector( - std::initializer_list input) { - absl::InlinedVector result; - result.reserve(input.size()); - for (const auto& value : input) { - result.push_back(static_cast(value)); + template + absl::InlinedVector ComputeExpectedOutput( + absl::InlinedVector input, + BaselineOutT (*baseline_callback)(BaselineT)) { + absl::InlinedVector expected_output; + for (int i = 0; i < input.size(); i++) { + auto arg = static_cast(input[i]); + auto result = static_cast(baseline_callback(arg)); + expected_output.push_back(result); } - return result; + return expected_output; } }; /// Test `tf.Abs`. TEST_F(GpuUnaryOpTest, AbsFloat) { - Run( - /*input_shape=*/{2, 3}, - /*input=*/ - {-std::numeric_limits::infinity(), -0.1f, -0.0f, 0.0f, 0.1f, - std::numeric_limits::infinity()}, - /*op_name=*/"Abs", - /*expected_callback=*/std::abs, + Test( + /*op_name=*/"Abs", test::DefaultInputShape(), + test::NearZeroAndExtremeInput(), + /*baseline_callback=*/std::abs, /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, AbsDouble) { - Run( - /*input_shape=*/{2, 3}, - /*input=*/ - {-std::numeric_limits::infinity(), -0.1, -0.0, 0.0, 0.1, - std::numeric_limits::infinity()}, - /*op_name=*/"Abs", - /*expected_callback=*/std::abs, + Test( + /*op_name=*/"Abs", test::DefaultInputShape(), + test::NearZeroAndExtremeInput(), + /*baseline_callback=*/std::abs, /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, AbsHalf) { - Run( - /*input_shape=*/{2, 3}, - /*input=*/ - {static_cast(-std::numeric_limits::infinity()), - static_cast(-0.1), static_cast(-0.0), - static_cast(0.0), static_cast(0.1), - static_cast(std::numeric_limits::infinity())}, - /*op_name=*/"Abs", - /*expected_callback=*/std::abs, + Test( + /*op_name=*/"Abs", test::DefaultInputShape(), + test::NearZeroAndExtremeInput(), + /*baseline_callback=*/std::abs, /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, AbsInt32) { - Run( - /*input_shape=*/{2, 3}, - /*input=*/ - {std::numeric_limits::min(), std::numeric_limits::min() + 1, - -1, 0, 1, std::numeric_limits::max()}, - /*op_name=*/"Abs", - /*expected_callback=*/std::abs, + Test( + /*op_name=*/"Abs", test::DefaultInputShape(), + test::NearZeroAndExtremeInput(), + /*baseline_callback=*/std::abs, /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, AbsInt64) { - Run( - /*input_shape=*/{2, 3}, - /*input=*/ - {std::numeric_limits::min(), std::numeric_limits::min() + 1, - -1, 0, 1, std::numeric_limits::max()}, - /*op_name=*/"Abs", - /*expected_callback=*/std::abs, + Test( + /*op_name=*/"Abs", test::DefaultInputShape(), + test::NearZeroAndExtremeInput(), + /*baseline_callback=*/std::abs, /*expect_equal=*/true); } /// Test `tf.Ceil`. TEST_F(GpuUnaryOpTest, CeilFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Ceil", - /*expected_callback=*/std::ceil, - /*expect_equal=*/true); + Test( + /*op_name=*/"Ceil", test::DefaultInputShape(), + test::DefaultInput("Ceil"), + /*baseline_callback=*/std::ceil, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, CeilDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Ceil", - /*expected_callback=*/std::ceil, - /*expect_equal=*/true); + Test( + /*op_name=*/"Ceil", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::ceil, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, CeilHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Ceil", - /*expected_callback=*/std::ceil, - /*expect_equal=*/true); + Test( + /*op_name=*/"Ceil", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::ceil, + /*expect_equal=*/true); } /// Test `tf.Conj`. TEST_F(GpuUnaryOpTest, ConjFloat) { - Run, const std::complex&, std::complex, - std::complex>(DefaultInputShape(), DefaultComplexInput(), - /*op_name=*/"Conj", - /*expected_callback=*/std::conj, - /*expect_equal=*/false, - /*add_tout=*/false, - /*expect_buffer_reuse=*/false); -} - -TEST_F(GpuUnaryOpTest, ConjDouble) { - Run, const std::complex&, std::complex, - std::complex>(DefaultInputShape(), DefaultComplexInput(), - /*op_name=*/"Conj", - /*expected_callback=*/std::conj, + Test, const std::complex&, std::complex, + std::complex>(/*op_name=*/"Conj", test::DefaultInputShape(), + test::DefaultComplexInput(), + /*baseline_callback=*/std::conj, /*expect_equal=*/false, /*add_tout=*/false, /*expect_buffer_reuse=*/false); } +TEST_F(GpuUnaryOpTest, ConjDouble) { + Test, const std::complex&, std::complex, + std::complex>( + /*op_name=*/"Conj", test::DefaultInputShape(), + test::DefaultComplexInput(), + /*baseline_callback=*/std::conj, + /*expect_equal=*/false, + /*add_tout=*/false, + /*expect_buffer_reuse=*/false); +} + /// Test `tf.Cos`. TEST_F(GpuUnaryOpTest, CosFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Cos", - /*expected_callback=*/std::cos, - /*expect_equal=*/false); + Test( + /*op_name=*/"Cos", test::DefaultInputShape(), test::DefaultInput(), + /*baseline_callback=*/std::cos, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, CosDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Cos", - /*expected_callback=*/std::cos, - /*expect_equal=*/false); + Test(/*op_name=*/"Cos", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::cos, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, CosHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Cos", - /*expected_callback=*/std::cos, - /*expect_equal=*/false); + Test( + /*op_name=*/"Cos", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::cos, + /*expect_equal=*/false); } /// Test `tf.Exp`. TEST_F(GpuUnaryOpTest, ExpFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Exp", - /*expected_callback=*/std::exp, - /*expect_equal=*/false); + Test(/*op_name=*/"Exp", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::exp, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, ExpDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Exp", - /*expected_callback=*/std::exp, - /*expect_equal=*/false); + Test(/*op_name=*/"Exp", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::exp, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, ExpHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Exp", - /*expected_callback=*/std::exp, - /*expect_equal=*/false); + Test( + /*op_name=*/"Exp", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::exp, + /*expect_equal=*/false); } /// Test `tf.Floor`. TEST_F(GpuUnaryOpTest, FloorFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Floor", - /*expected_callback=*/std::floor, - /*expect_equal=*/true); + Test(/*op_name=*/"Floor", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::floor, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, FloorDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Floor", - /*expected_callback=*/std::floor, - /*expect_equal=*/true); + Test(/*op_name=*/"Floor", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::floor, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, FloorHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Floor", - /*expected_callback=*/std::floor, - /*expect_equal=*/true); + Test( + /*op_name=*/"Floor", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::floor, + /*expect_equal=*/true); } /// Test `tf.Imag`. TEST_F(GpuUnaryOpTest, ImagFloat) { - Run, const std::complex&, float, float>( - DefaultInputShape(), DefaultComplexInput(), - /*op_name=*/"Imag", - /*expected_callback=*/std::imag, + Test, const std::complex&, float, float>( + /*op_name=*/"Imag", test::DefaultInputShape(), + test::DefaultComplexInput(), + /*baseline_callback=*/std::imag, /*expect_equal=*/false, /*add_tout=*/true, /*expect_buffer_reuse=*/false); } TEST_F(GpuUnaryOpTest, ImagDouble) { - Run, const std::complex&, double, double>( - DefaultInputShape(), DefaultComplexInput(), - /*op_name=*/"Imag", - /*expected_callback=*/std::imag, + Test, const std::complex&, double, double>( + /*op_name=*/"Imag", test::DefaultInputShape(), + test::DefaultComplexInput(), + /*baseline_callback=*/std::imag, /*expect_equal=*/false, /*add_tout=*/true, /*expect_buffer_reuse=*/false); @@ -338,64 +316,65 @@ TEST_F(GpuUnaryOpTest, ImagDouble) { /// Test `tf.IsInf`. // TODO(b/162575339): The tests currently still fails with CUDA_ILLEGAL_ADDRESS -// when run with unranked kernels. +// when Test with unranked kernels. TEST_F(GpuUnaryOpTest, DISABLED_IsInfFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"IsInf", - /*expected_callback=*/std::isinf, - /*expect_equal=*/true); + Test(/*op_name=*/"IsInf", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::isinf, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, DISABLED_IsInfDouble) { // Workaround for gcc bug, it would fail with "unresolved overloaded function // type" if passing std::isinf with type double. So we use type float for // comparing expected values. - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"IsInf", - /*expected_callback=*/std::isinf, - /*expect_equal=*/true); + Test(/*op_name=*/"IsInf", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::isinf, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, DISABLED_IsInfHalf) { - Run(DefaultInputShape(), - DefaultInput(), - /*op_name=*/"IsInf", - /*expected_callback=*/std::isinf, - /*expect_equal=*/true); + Test(/*op_name=*/"IsInf", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::isinf, + /*expect_equal=*/true); } /// Test `tf.Log`. TEST_F(GpuUnaryOpTest, LogFloat) { - Run(DefaultInputShape(), DefaultInputGreaterThanZero(), - /*op_name=*/"Log", - /*expected_callback=*/std::log, - /*expect_equal=*/false); + Test(/*op_name=*/"Log", test::DefaultInputShape(), + test::DefaultInputGreaterThanZero(), + /*baseline_callback=*/std::log, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, LogDouble) { - Run(DefaultInputShape(), DefaultInputGreaterThanZero(), - /*op_name=*/"Log", - /*expected_callback=*/std::log, - /*expect_equal=*/false); + Test( + /*op_name=*/"Log", test::DefaultInputShape(), + test::DefaultInputGreaterThanZero(), + /*baseline_callback=*/std::log, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, LogHalf) { - Run(DefaultInputShape(), - /*input=*/ - DefaultInputGreaterThanZero(), - /*op_name=*/"Log", - /*expected_callback=*/std::log, - /*expect_equal=*/false); + Test( + /*op_name=*/"Log", test::DefaultInputShape(), + test::DefaultInputGreaterThanZero(), + /*baseline_callback=*/std::log, + /*expect_equal=*/false); } /// Test `tf.LogicalNot` TEST_F(GpuUnaryOpTest, LogicalNot) { - Run( - DefaultInputShape(), DefaultInput(), - /*op_name=*/"LogicalNot", - /*expected_callback=*/[](bool v) { return !v; }, + Test( + /*op_name=*/"LogicalNot", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/[](bool v) { return !v; }, /*expect_equal=*/true, /*add_tout=*/false, /*expect_buffer_reuse=*/true, @@ -406,69 +385,71 @@ TEST_F(GpuUnaryOpTest, LogicalNot) { /// Reference implementation. template -T expected_neg(T x) { +T baseline_neg(T x) { return -x; } TEST_F(GpuUnaryOpTest, NegFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Neg", - /*expected_callback=*/expected_neg, - /*expect_equal=*/false); + Test( + /*op_name=*/"Neg", test::DefaultInputShape(), test::DefaultInput(), + /*baseline_callback=*/baseline_neg, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, NegDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Neg", - /*expected_callback=*/expected_neg, - /*expect_equal=*/false); + Test( + /*op_name=*/"Neg", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/baseline_neg, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, NegHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Neg", - /*expected_callback=*/expected_neg, - /*expect_equal=*/false); + Test( + /*op_name=*/"Neg", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/baseline_neg, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, NegInt8) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Neg", - /*expected_callback=*/expected_neg, - /*expect_equal=*/true); + Test( + /*op_name=*/"Neg", test::DefaultInputShape(), test::DefaultInput(), + /*baseline_callback=*/baseline_neg, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, NegInt16) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Neg", - /*expected_callback=*/expected_neg, - /*expect_equal=*/true); + Test(/*op_name=*/"Neg", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/baseline_neg, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, NegInt64) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Neg", - /*expected_callback=*/expected_neg, - /*expect_equal=*/true); + Test(/*op_name=*/"Neg", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/baseline_neg, + /*expect_equal=*/true); } /// Test `tf.Real`. TEST_F(GpuUnaryOpTest, RealFloat) { - Run, const std::complex&, float, float>( - DefaultInputShape(), DefaultComplexInput(), - /*op_name=*/"Real", - /*expected_callback=*/std::real, + Test, const std::complex&, float, float>( + /*op_name=*/"Real", test::DefaultInputShape(), + test::DefaultComplexInput(), + /*baseline_callback=*/std::real, /*expect_equal=*/false, /*add_tout=*/true, /*expect_buffer_reuse=*/false); } TEST_F(GpuUnaryOpTest, RealDouble) { - Run, const std::complex&, double, double>( - DefaultInputShape(), DefaultComplexInput(), - /*op_name=*/"Real", - /*expected_callback=*/std::real, + Test, const std::complex&, double, double>( + /*op_name=*/"Real", test::DefaultInputShape(), + test::DefaultComplexInput(), + /*baseline_callback=*/std::real, /*expect_equal=*/false, /*add_tout=*/true, /*expect_buffer_reuse=*/false); @@ -478,141 +459,153 @@ TEST_F(GpuUnaryOpTest, RealDouble) { /// Reference implementation. template -T expected_rsqrt(T x) { +T baseline_rsqrt(T x) { return 1.0 / std::sqrt(x); } TEST_F(GpuUnaryOpTest, RsqrtFloat) { - Run(DefaultInputShape(), DefaultInputGreaterThanZero(), - /*op_name=*/"Rsqrt", - /*expected_callback=*/expected_rsqrt, - /*expect_equal=*/false); + Test(/*op_name=*/"Rsqrt", + test::DefaultInputShape(), + test::DefaultInputGreaterThanZero(), + /*baseline_callback=*/baseline_rsqrt, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, RsqrtDouble) { - Run(DefaultInputShape(), DefaultInputGreaterThanZero(), - /*op_name=*/"Rsqrt", - /*expected_callback=*/expected_rsqrt, - /*expect_equal=*/false); + Test( + /*op_name=*/"Rsqrt", test::DefaultInputShape(), + test::DefaultInputGreaterThanZero(), + /*baseline_callback=*/baseline_rsqrt, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, RsqrtHalf) { - Run(DefaultInputShape(), - /*input=*/ - DefaultInputGreaterThanZero(), - /*op_name=*/"Rsqrt", - /*expected_callback=*/expected_rsqrt, - /*expect_equal=*/false); + Test( + /*op_name=*/"Rsqrt", test::DefaultInputShape(), + test::DefaultInputGreaterThanZero(), + /*baseline_callback=*/baseline_rsqrt, + /*expect_equal=*/false); } /// Test `tf.Sign`. // Reference implementation template -T expected_sign(T x) { +T baseline_sign(T x) { if (x == 0) return 0; if (x < 0) return -1; return 1; } TEST_F(GpuUnaryOpTest, SignFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Sign", - /*expected_callback=*/expected_sign, - /*expect_equal=*/true); + Test(/*op_name=*/"Sign", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/baseline_sign, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, SignDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Sign", - /*expected_callback=*/expected_sign, - /*expect_equal=*/true); + Test(/*op_name=*/"Sign", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/baseline_sign, + /*expect_equal=*/true); } TEST_F(GpuUnaryOpTest, SignHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Sign", - /*expected_callback=*/expected_sign, - // TODO(b/162577610): We should actually use true - // here. This requires returning 0.0 for input -0.0. - /*expect_equal=*/false); + Test( + /*op_name=*/"Sign", test::DefaultInputShape(), + test::DefaultInput(), + /*expected_callback=*/baseline_sign, + // TODO(b/162577610): We should actually use true + // here. This requires returning 0.0 for input -0.0. + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, SignInt64) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Sign", - /*expected_callback=*/expected_sign, - /*expect_equal=*/true); + Test( + /*op_name=*/"Sign", test::DefaultInputShape(), + test::DefaultInput(), + /*expected_callback=*/baseline_sign, + /*expect_equal=*/true); } /// Test `tf.Sin`. TEST_F(GpuUnaryOpTest, SinFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Sin", - /*expected_callback=*/std::sin, - /*expect_equal=*/false); + Test(/*op_name=*/"Sin", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::sin, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, SinDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Sin", - /*expected_callback=*/std::sin, - /*expect_equal=*/false); + Test(/*op_name=*/"Sin", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::sin, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, SinHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Sin", - /*expected_callback=*/std::sin, - /*expect_equal=*/false); + Test( + /*op_name=*/"Sin", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::sin, + /*expect_equal=*/false); } /// Test `tf.Sqrt`. TEST_F(GpuUnaryOpTest, SqrtFloat) { - Run(DefaultInputShape(), DefaultInputGreaterOrEqualToZero(), - /*op_name=*/"Sqrt", - /*expected_callback=*/std::sqrt, - /*expect_equal=*/false); + Test( + /*op_name=*/"Sqrt", test::DefaultInputShape(), + test::DefaultInputGreaterOrEqualToZero(), + /*baseline_callback=*/std::sqrt, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, SqrtDouble) { - Run(DefaultInputShape(), DefaultInputGreaterOrEqualToZero(), - /*op_name=*/"Sqrt", - /*expected_callback=*/std::sqrt, - /*expect_equal=*/false); + Test( + /*op_name=*/"Sqrt", test::DefaultInputShape(), + test::DefaultInputGreaterOrEqualToZero(), + /*baseline_callback=*/std::sqrt, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, SqrtHalf) { - Run(DefaultInputShape(), - DefaultInputGreaterOrEqualToZero(), - /*op_name=*/"Sqrt", - /*expected_callback=*/std::sqrt, - /*expect_equal=*/false); + Test( + /*op_name=*/"Sqrt", test::DefaultInputShape(), + test::DefaultInputGreaterOrEqualToZero(), + /*baseline_callback=*/std::sqrt, + /*expect_equal=*/false); } /// Test `tf.Tanh`. TEST_F(GpuUnaryOpTest, TanhFloat) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Tanh", - /*expected_callback=*/std::tanh, - /*expect_equal=*/false); + Test(/*op_name=*/"Tanh", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::tanh, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, TanhDouble) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Tanh", - /*expected_callback=*/std::tanh, - /*expect_equal=*/false); + Test(/*op_name=*/"Tanh", + test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::tanh, + /*expect_equal=*/false); } TEST_F(GpuUnaryOpTest, TanhHalf) { - Run(DefaultInputShape(), DefaultInput(), - /*op_name=*/"Tanh", - /*expected_callback=*/std::tanh, - /*expect_equal=*/false); + Test( + /*op_name=*/"Tanh", test::DefaultInputShape(), + test::DefaultInput(), + /*baseline_callback=*/std::tanh, + /*expect_equal=*/false); } } // namespace