diff --git a/paddle/fluid/operators/jit/more/CMakeLists.txt b/paddle/fluid/operators/jit/more/CMakeLists.txt index a740d1a840f22c2403a06437d81a555605627586..fa503356baa73cb76e50ff19901a56d0c987ad99 100644 --- a/paddle/fluid/operators/jit/more/CMakeLists.txt +++ b/paddle/fluid/operators/jit/more/CMakeLists.txt @@ -11,4 +11,7 @@ if(WITH_AVX) add_subdirectory(intrinsic) endif() +# mix should be last +add_subdirectory(mix) + set(JIT_KERNEL_DEPS ${JIT_KERNEL_DEPS} PARENT_SCOPE) diff --git a/paddle/fluid/operators/jit/more/mix/CMakeLists.txt b/paddle/fluid/operators/jit/more/mix/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..3b1c67a6db0ec3b619972c57dbe4ab28cecbb31c --- /dev/null +++ b/paddle/fluid/operators/jit/more/mix/CMakeLists.txt @@ -0,0 +1,9 @@ + + +file(GLOB jit_kernel_mix_cc RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.cc") +cc_library(jit_kernel_mix SRCS ${jit_kernel_mix_cc} DEPS jit_kernel_base) + +set(JIT_KERNEL_DEPS ${JIT_KERNEL_DEPS} jit_kernel_mix PARENT_SCOPE) + +USE_JITKERNEL_MORE(vsigmoid, mix) +USE_JITKERNEL_MORE(vtanh, mix) diff --git a/paddle/fluid/operators/jit/more/mix/mix.cc b/paddle/fluid/operators/jit/more/mix/mix.cc new file mode 100644 index 0000000000000000000000000000000000000000..708e22549ad02ba36962a06c10179b053b5b16e8 --- /dev/null +++ b/paddle/fluid/operators/jit/more/mix/mix.cc @@ -0,0 +1,89 @@ +/* Copyright (c) 2018 PaddlePaddle 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 "paddle/fluid/operators/jit/more/mix/mix.h" +#include "paddle/fluid/operators/jit/kernels.h" +#include "paddle/fluid/operators/jit/registry.h" +#include "paddle/fluid/platform/cpu_info.h" + +namespace paddle { +namespace operators { +namespace jit { +namespace more { +namespace mix { + +template +void VSigmoid(const T* x, T* y, int n) { + const float min = SIGMOID_THRESHOLD_MIN; + const float max = SIGMOID_THRESHOLD_MAX; + for (int i = 0; i < n; ++i) { + y[i] = (x[i] < min) ? min : ((x[i] > max) ? max : x[i]); + y[i] = static_cast(0) - y[i]; + } + auto compute = Get, platform::CPUPlace>(n); + compute(y, y, n); + for (int i = 0; i < n; ++i) { + y[i] = static_cast(1) / (static_cast(1) + y[i]); + } +} + +template +void VTanh(const T* x, T* y, int n) { + const T a = 2, b = -1; + auto compute_scal = Get, platform::CPUPlace>(n); + auto compute_addbias = Get, platform::CPUPlace>(n); + auto compute_sigmoid = Get, platform::CPUPlace>(n); + compute_scal(&a, x, y, n); + compute_sigmoid(y, y, n); + compute_scal(&a, y, y, n); + compute_addbias(&b, y, y, n); +} + +template <> +bool VSigmoidKernel::UseMe(int d) const { + return true; +} + +template <> +bool VTanhKernel::UseMe(int d) const { + return true; +} + +#define AWALYS_USE_ME_WITH_DOUBLE(func) \ + template <> \ + bool func##Kernel::UseMe(int d) const { \ + return true; \ + } + +AWALYS_USE_ME_WITH_DOUBLE(VSigmoid); +AWALYS_USE_ME_WITH_DOUBLE(VTanh); + +#undef AWALYS_USE_ME_WITH_DOUBLE + +} // namespace mix +} // namespace more +} // namespace jit +} // namespace operators +} // namespace paddle + +namespace mix = paddle::operators::jit::more::mix; + +#define REGISTER_MORE_KERNEL(key, func) \ + REGISTER_JITKERNEL_MORE(key, mix, mix::func##Kernel, \ + mix::func##Kernel) + +REGISTER_MORE_KERNEL(vsigmoid, VSigmoid); +REGISTER_MORE_KERNEL(vtanh, VTanh); + +#undef REGISTER_MORE_KERNEL diff --git a/paddle/fluid/operators/jit/more/mix/mix.h b/paddle/fluid/operators/jit/more/mix/mix.h new file mode 100644 index 0000000000000000000000000000000000000000..38b738a8b1125264d099d4131cdc59b7809d443e --- /dev/null +++ b/paddle/fluid/operators/jit/more/mix/mix.h @@ -0,0 +1,50 @@ +/* Copyright (c) 2018 PaddlePaddle 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. */ + +#pragma once + +#include +#include "paddle/fluid/operators/jit/kernel_base.h" + +namespace paddle { +namespace operators { +namespace jit { +namespace more { +namespace mix { + +template +void VSigmoid(const T* x, T* y, int n); + +template +void VTanh(const T* x, T* y, int n); + +#define DECLARE_MORE_KERNEL(name, tuples) \ + template \ + class name##Kernel : public KernelImpl> { \ + public: \ + name##Kernel() { this->func = name; } \ + bool UseMe(typename tuples::attr_type) const override; \ + } + +// XYN +DECLARE_MORE_KERNEL(VSigmoid, XYNTuples); +DECLARE_MORE_KERNEL(VTanh, XYNTuples); + +#undef DECLARE_MORE_KERNEL + +} // namespace mix +} // namespace more +} // namespace jit +} // namespace operators +} // namespace paddle