diff options
author | A. Unique TensorFlower <gardener@tensorflow.org> | 2018-09-26 17:42:47 -0700 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2018-09-26 17:46:19 -0700 |
commit | 7b88cabfec45c9e04ab3d9cf1c2411c6dce4c694 (patch) | |
tree | 9bdc598fa33808d8689299438a50ad7445ebdec5 /tensorflow/core/kernels | |
parent | bfda65cc70526c919c57ef8321dd282e463ed8a3 (diff) |
Add xlogy and xdivy op.
PiperOrigin-RevId: 214700693
Diffstat (limited to 'tensorflow/core/kernels')
-rw-r--r-- | tensorflow/core/kernels/BUILD | 2 | ||||
-rw-r--r-- | tensorflow/core/kernels/cwise_op_gpu_xdivy.cu.cc | 26 | ||||
-rw-r--r-- | tensorflow/core/kernels/cwise_op_gpu_xlogy.cu.cc | 26 | ||||
-rw-r--r-- | tensorflow/core/kernels/cwise_op_xdivy.cc | 38 | ||||
-rw-r--r-- | tensorflow/core/kernels/cwise_op_xlogy.cc | 41 | ||||
-rw-r--r-- | tensorflow/core/kernels/cwise_ops.h | 45 |
6 files changed, 178 insertions, 0 deletions
diff --git a/tensorflow/core/kernels/BUILD b/tensorflow/core/kernels/BUILD index ed5aff58b8..b08562d7d1 100644 --- a/tensorflow/core/kernels/BUILD +++ b/tensorflow/core/kernels/BUILD @@ -5254,6 +5254,8 @@ filegroup( "cwise_op_squared_difference.cc", "cwise_op_sub.cc", "cwise_op_tanh.cc", + "cwise_op_xlogy.cc", + "cwise_op_xdivy.cc", "data_format_ops.cc", "decode_wav_op.cc", "deep_conv2d.cc", diff --git a/tensorflow/core/kernels/cwise_op_gpu_xdivy.cu.cc b/tensorflow/core/kernels/cwise_op_gpu_xdivy.cu.cc new file mode 100644 index 0000000000..e4b21a66c6 --- /dev/null +++ b/tensorflow/core/kernels/cwise_op_gpu_xdivy.cu.cc @@ -0,0 +1,26 @@ +/* Copyright 2015 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. +==============================================================================*/ + +#if GOOGLE_CUDA + +#include "tensorflow/core/kernels/cwise_ops_gpu_common.cu.h" + +namespace tensorflow { +namespace functor { +DEFINE_BINARY5(xdivy, Eigen::half, float, double, complex64, complex128); +} // namespace functor +} // namespace tensorflow + +#endif // GOOGLE_CUDA diff --git a/tensorflow/core/kernels/cwise_op_gpu_xlogy.cu.cc b/tensorflow/core/kernels/cwise_op_gpu_xlogy.cu.cc new file mode 100644 index 0000000000..1e1b5a426e --- /dev/null +++ b/tensorflow/core/kernels/cwise_op_gpu_xlogy.cu.cc @@ -0,0 +1,26 @@ +/* Copyright 2018 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. +==============================================================================*/ + +#if GOOGLE_CUDA + +#include "tensorflow/core/kernels/cwise_ops_gpu_common.cu.h" + +namespace tensorflow { +namespace functor { +DEFINE_BINARY5(xlogy, Eigen::half, float, double, complex64, complex128); +} // namespace functor +} // namespace tensorflow + +#endif // GOOGLE_CUDA diff --git a/tensorflow/core/kernels/cwise_op_xdivy.cc b/tensorflow/core/kernels/cwise_op_xdivy.cc new file mode 100644 index 0000000000..6a6aec5e86 --- /dev/null +++ b/tensorflow/core/kernels/cwise_op_xdivy.cc @@ -0,0 +1,38 @@ +/* Copyright 2018 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/core/kernels/cwise_ops_common.h" + +namespace tensorflow { +REGISTER5(BinaryOp, CPU, "Xdivy", functor::xdivy, float, Eigen::half, double, + complex64, complex128); + +#if TENSORFLOW_USE_SYCL +#define REGISTER_SYCL_KERNEL(TYPE) \ + REGISTER_KERNEL_BUILDER( \ + Name("Xdivy").Device(DEVICE_SYCL).TypeConstraint<TYPE>("T"), \ + BinaryOp<SYCLDevice, functor::xdivy<TYPE>>); +REGISTER_SYCL_KERNEL(float); +REGISTER_SYCL_KERNEL(double); +#undef REGISTER_SYCL_KERNEL + +#endif // TENSORFLOW_USE_SYCL + +#if GOOGLE_CUDA +REGISTER5(BinaryOp, GPU, "Xdivy", functor::xdivy, float, Eigen::half, double, + complex64, complex128); +#endif // GOOGLE_CUDA + +} // namespace tensorflow diff --git a/tensorflow/core/kernels/cwise_op_xlogy.cc b/tensorflow/core/kernels/cwise_op_xlogy.cc new file mode 100644 index 0000000000..e71a9109b2 --- /dev/null +++ b/tensorflow/core/kernels/cwise_op_xlogy.cc @@ -0,0 +1,41 @@ +/* Copyright 2018 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/core/kernels/cwise_ops_common.h" + +namespace tensorflow { +REGISTER5(BinaryOp, CPU, "Xlogy", functor::xlogy, float, Eigen::half, double, + complex64, complex128); + +#if TENSORFLOW_USE_SYCL +#define REGISTER_SYCL_KERNEL(TYPE) \ + REGISTER_KERNEL_BUILDER( \ + Name("Xlogy").Device(DEVICE_SYCL).TypeConstraint<TYPE>("T"), \ + BinaryOp<SYCLDevice, functor::xlogy<TYPE>>); +REGISTER_SYCL_KERNEL(Eigen::half); +REGISTER_SYCL_KERNEL(float); +REGISTER_SYCL_KERNEL(double); +REGISTER_SYCL_KERNEL(complex64); +REGISTER_SYCL_KERNEL(complex128); +#undef REGISTER_SYCL_KERNEL + +#endif // TENSORFLOW_USE_SYCL + +#if GOOGLE_CUDA +REGISTER5(BinaryOp, GPU, "Xlogy", functor::xlogy, float, Eigen::half, double, + complex64, complex128); +#endif // GOOGLE_CUDA + +} // namespace tensorflow diff --git a/tensorflow/core/kernels/cwise_ops.h b/tensorflow/core/kernels/cwise_ops.h index 22eb66e979..66ba827a90 100644 --- a/tensorflow/core/kernels/cwise_ops.h +++ b/tensorflow/core/kernels/cwise_ops.h @@ -471,6 +471,45 @@ struct functor_traits<bitwise_xor_op<Scalar>> { enum { Cost = Eigen::NumTraits<Scalar>::AddCost, PacketAccess = true }; }; +// TODO(srvasude): Add packet versions of this operation. +template <typename Scalar> +struct xlogy_op { + EIGEN_EMPTY_STRUCT_CTOR(xlogy_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar + operator()(const Scalar& x, const Scalar& y) const { + if (x == Scalar(0.)) { + return Scalar(0.); + } + return x * numext::log(y); + } +}; + +template <typename Scalar> +struct functor_traits<xlogy_op<Scalar>> { + enum { + Cost = (sizeof(Scalar) == 4 ? 40 : 85) + Eigen::NumTraits<Scalar>::MulCost, + PacketAccess = false + }; +}; + +template <typename Scalar> +// TODO(srvasude): Add packet versions of this operation. +struct xdivy_op { + EIGEN_EMPTY_STRUCT_CTOR(xdivy_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar + operator()(const Scalar& x, const Scalar& y) const { + if (x == Scalar(0.)) { + return Scalar(0.); + } + return x / y; + } +}; + +template <typename Scalar> +struct functor_traits<xdivy_op<Scalar>> { + enum { Cost = Eigen::NumTraits<Scalar>::MulCost, PacketAccess = false }; +}; + } // end namespace internal } // end namespace Eigen @@ -830,6 +869,12 @@ struct squared_difference Eigen::internal::scalar_difference_op<T>>> {}; template <typename T> +struct xdivy : base<T, Eigen::internal::xdivy_op<T>> {}; + +template <typename T> +struct xlogy : base<T, Eigen::internal::xlogy_op<T>> {}; + +template <typename T> struct less : base<T, Eigen::internal::less<T>, bool> {}; template <typename T> |