Skip to content

Commit

Permalink
[part 5]change type of function args
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangting2020 committed Jan 13, 2022
1 parent 8cc0955 commit 40ccb07
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 98 deletions.
58 changes: 28 additions & 30 deletions paddle/fluid/operators/elementwise/elementwise_functor.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@ using InverseDivFunctor = pten::funcs::InverseDivideFunctor<T>;
// Floor Divide
template <typename T>
struct FloorDivFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
PADDLE_ENFORCE(b != 0, DIV_ERROR_INFO);
return static_cast<T>(std::trunc(a / b));
}
};

template <typename T>
struct InverseFloorDivFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
PADDLE_ENFORCE(a != 0, DIV_ERROR_INFO);
return static_cast<T>(std::trunc(b / a));
}
Expand All @@ -73,15 +73,15 @@ struct InverseFloorDivFunctor {
// Maximum
template <typename T>
struct MaxFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
return a > b ? a : b;
}
};

// Minmum
template <typename T>
struct MinFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
return a < b ? a : b;
}
};
Expand Down Expand Up @@ -119,14 +119,14 @@ struct DivGradXYFunctor<Complex<InT>, Complex<OutT>> {
// Float div grad
template <typename T>
struct DivGradXFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return a / b; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return a / b; }
};

// Complex div grad
template <typename T>
struct DivGradXFunctor<Complex<T>> {
inline HOSTDEVICE Complex<T> operator()(const Complex<T>& a,
const Complex<T>& b) const {
inline HOSTDEVICE Complex<T> operator()(const Complex<T> a,
const Complex<T> b) const {
Complex<T> b_conj(b.real, -b.imag);
return a / b_conj;
}
Expand All @@ -135,17 +135,17 @@ struct DivGradXFunctor<Complex<T>> {
// Float mul and div
template <typename T>
struct DivGradYFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b, const T& c) const {
inline HOSTDEVICE T operator()(const T a, const T b, const T c) const {
return -a * b / c;
}
};

// Complex mul and div
template <typename T>
struct DivGradYFunctor<Complex<T>> {
inline HOSTDEVICE Complex<T> operator()(const Complex<T>& a,
const Complex<T>& b,
const Complex<T>& c) const {
inline HOSTDEVICE Complex<T> operator()(const Complex<T> a,
const Complex<T> b,
const Complex<T> c) const {
Complex<T> out_div_c_conj((b / c).real, -(b / c).imag);
return -a * out_div_c_conj;
}
Expand All @@ -154,16 +154,16 @@ struct DivGradYFunctor<Complex<T>> {
// Fmax
template <typename T>
struct FMaxFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
return std::fmax(a, b);
}
};

template <>
struct FMaxFunctor<paddle::platform::float16> {
inline HOSTDEVICE paddle::platform::float16 operator()(
const paddle::platform::float16& a,
const paddle::platform::float16& b) const {
const paddle::platform::float16 a,
const paddle::platform::float16 b) const {
float float_a = static_cast<float>(a);
float float_b = static_cast<float>(b);
auto result = std::fmax(float_a, float_b);
Expand All @@ -173,7 +173,7 @@ struct FMaxFunctor<paddle::platform::float16> {

template <>
struct FMaxFunctor<int> {
inline HOSTDEVICE int operator()(const int& a, const int& b) const {
inline HOSTDEVICE int operator()(const int a, const int b) const {
float float_a = static_cast<float>(a);
float float_b = static_cast<float>(b);
auto result = std::fmax(float_a, float_b);
Expand All @@ -183,8 +183,7 @@ struct FMaxFunctor<int> {

template <>
struct FMaxFunctor<int64_t> {
inline HOSTDEVICE int64_t operator()(const int64_t& a,
const int64_t& b) const {
inline HOSTDEVICE int64_t operator()(const int64_t a, const int64_t b) const {
double double_a = static_cast<double>(a);
double double_b = static_cast<double>(b);
auto result = std::fmax(double_a, double_b);
Expand All @@ -195,16 +194,16 @@ struct FMaxFunctor<int64_t> {
// Fmin
template <typename T>
struct FMinFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
return std::fmin(a, b);
}
};

template <>
struct FMinFunctor<paddle::platform::float16> {
inline HOSTDEVICE paddle::platform::float16 operator()(
const paddle::platform::float16& a,
const paddle::platform::float16& b) const {
const paddle::platform::float16 a,
const paddle::platform::float16 b) const {
float float_a = static_cast<float>(a);
float float_b = static_cast<float>(b);
auto result = std::fmin(float_a, float_b);
Expand All @@ -214,7 +213,7 @@ struct FMinFunctor<paddle::platform::float16> {

template <>
struct FMinFunctor<int> {
inline HOSTDEVICE int operator()(const int& a, const int& b) const {
inline HOSTDEVICE int operator()(const int a, const int b) const {
float float_a = static_cast<float>(a);
float float_b = static_cast<float>(b);
auto result = std::fmin(float_a, float_b);
Expand All @@ -224,8 +223,7 @@ struct FMinFunctor<int> {

template <>
struct FMinFunctor<int64_t> {
inline HOSTDEVICE int64_t operator()(const int64_t& a,
const int64_t& b) const {
inline HOSTDEVICE int64_t operator()(const int64_t a, const int64_t b) const {
double double_a = static_cast<double>(a);
double double_b = static_cast<double>(b);
auto result = std::fmin(double_a, double_b);
Expand All @@ -235,22 +233,22 @@ struct FMinFunctor<int64_t> {

template <typename T>
struct MulGradFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return a * b; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return a * b; }
};
template <typename T>
struct MulGradFunctor<Complex<T>> {
inline HOSTDEVICE Complex<T> operator()(const Complex<T>& a,
const Complex<T>& b) const {
inline HOSTDEVICE Complex<T> operator()(const Complex<T> a,
const Complex<T> b) const {
Complex<T> b_conj(b.real, -b.imag);
return a * b_conj;
}
};

template <typename InT, typename OutT>
struct MulGradXYFunctor {
inline HOSTDEVICE paddle::framework::Array<OutT, 2> operator()(const InT& a,
const InT& b,
const InT& c) {
inline HOSTDEVICE paddle::framework::Array<OutT, 2> operator()(const InT a,
const InT b,
const InT c) {
paddle::framework::Array<OutT, 2> outs;
// dx = dout * y
outs[0] = a * b;
Expand All @@ -263,7 +261,7 @@ struct MulGradXYFunctor {
template <typename InT, typename OutT>
struct MulGradXYFunctor<Complex<InT>, Complex<OutT>> {
inline HOSTDEVICE paddle::framework::Array<Complex<OutT>, 2> operator()(
const Complex<InT>& a, const Complex<InT>& b, const Complex<InT>& c) {
const Complex<InT> a, const Complex<InT> b, const Complex<InT> c) {
paddle::framework::Array<Complex<OutT>, 2> outs;
// dx = dout * y
Complex<InT> b_conj(b.real, -b.imag);
Expand Down
27 changes: 1 addition & 26 deletions paddle/fluid/operators/elementwise/elementwise_mod_op.cu
Original file line number Diff line number Diff line change
Expand Up @@ -20,31 +20,6 @@ namespace plat = paddle::platform;
namespace paddle {
namespace operators {

template <typename T, typename Enable = void>
struct CudaModFunctor {
inline HOSTDEVICE T operator()(const T* args) const {
T res = args[0] % args[1];

// Accoding to #PR26732: in dividen % divsor
// remainder shall have the same sign as divsor.
if ((res != 0) && ((args[1] ^ res) < 0)) res += args[1];
return res;
}
};

template <typename T>
struct CudaModFunctor<
T, typename std::enable_if_t<std::is_floating_point<T>::value>> {
inline HOSTDEVICE T operator()(const T* args) const {
T res = fmod(args[0], args[1]);

// Accoding to #PR26732: in dividen % divsor
// remainder shall have the same sign as divsor.
if ((res != 0) && ((res < 0) != (args[1] < 0))) res += args[1];
return res;
}
};

template <typename T>
class ElementwiseModKernel<platform::CUDADeviceContext, T>
: public framework::OpKernel<T> {
Expand All @@ -56,7 +31,7 @@ class ElementwiseModKernel<platform::CUDADeviceContext, T>
ctx.template device_context<platform::CUDADeviceContext>();
int axis = PackTensorsIntoVector<T>(ctx, &ins, &outs);
LaunchElementwiseCudaKernel<ElementwiseType::kBinary, T, T>(
cuda_ctx, ins, &outs, axis, CudaModFunctor<T>());
cuda_ctx, ins, &outs, axis, ModFunctor<T>());
}
};

Expand Down
31 changes: 19 additions & 12 deletions paddle/fluid/operators/elementwise/elementwise_mod_op.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,36 @@ limitations under the License. */
namespace paddle {
namespace operators {

template <typename T>
template <typename T, typename Enable = void>
struct ModFunctor {
inline HOSTDEVICE T operator()(T a, T b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
T res = a % b;
if ((res != 0) && ((res < 0) != (b < 0))) res += b;

// Accoding to #PR26732: in dividen % divsor
// remainder shall have the same sign as divsor.
if ((res != 0) && ((b ^ res) < 0)) res += b;
return res;
}
};

template <typename T>
struct InverseModFunctor {
inline HOSTDEVICE T operator()(T a, T b) const {
T res = b % a;
if ((res != 0) && ((res < 0) != (a < 0))) res += a;
struct ModFunctor<T,
typename std::enable_if_t<std::is_floating_point<T>::value>> {
inline HOSTDEVICE T operator()(const T a, const T b) const {
T res = fmod(a, b);

// Accoding to #PR26732: in dividen % divsor
// remainder shall have the same sign as divsor.
if ((res != 0) && ((res < 0) != (b < 0))) res += b;
return res;
}
};

template <typename T>
struct ModFunctorFP {
struct InverseModFunctor {
inline HOSTDEVICE T operator()(T a, T b) const {
T res = fmod(a, b);
if ((res != 0) && ((b < 0) != (res < 0))) res += b;
T res = b % a;
if ((res != 0) && ((res < 0) != (a < 0))) res += a;
return res;
}
};
Expand Down Expand Up @@ -79,8 +86,8 @@ void elementwise_mod_fp(const framework::ExecutionContext &ctx,
auto x_dims = x->dims();
auto y_dims = y->dims();
if (x_dims.size() >= y_dims.size()) {
ElementwiseComputeEx<ModFunctorFP<T>, DeviceContext, T>(
ctx, x, y, axis, ModFunctorFP<T>(), z);
ElementwiseComputeEx<ModFunctor<T>, DeviceContext, T>(ctx, x, y, axis,
ModFunctor<T>(), z);
} else {
ElementwiseComputeEx<InverseModFunctorFP<T>, DeviceContext, T>(
ctx, x, y, axis, InverseModFunctorFP<T>(), z);
Expand Down
22 changes: 1 addition & 21 deletions paddle/fluid/operators/elementwise/elementwise_pow_op.cu
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,6 @@ namespace ops = paddle::operators;
namespace paddle {
namespace operators {

template <typename T, typename Enable = void>
struct CudaPowFunctor {
inline HOSTDEVICE T operator()(const T args[]) const {
return std::pow(args[0], args[1]);
}
};

template <typename T>
struct CudaPowFunctor<
T, typename std::enable_if<std::is_integral<T>::value>::type> {
// On CUDAPlace, std::pow(3, 1) calls pow(float, float), and
// it will return a float number like 2.99... , which floor to 2
// when cast to int by default and it is wrong.
// Use llrint to cast it to the nearest integer, which is 3.
inline HOSTDEVICE T operator()(const T args[]) const {
return std::llrint(
std::pow(static_cast<double>(args[0]), static_cast<double>(args[1])));
}
};

template <typename T>
class ElementwisePowKernel<platform::CUDADeviceContext, T>
: public framework::OpKernel<T> {
Expand All @@ -48,7 +28,7 @@ class ElementwisePowKernel<platform::CUDADeviceContext, T>

int axis = PackTensorsIntoVector<T>(ctx, &ins, &outs);
LaunchElementwiseCudaKernel<ElementwiseType::kBinary, T, T>(
cuda_ctx, ins, &outs, axis, CudaPowFunctor<T>());
cuda_ctx, ins, &outs, axis, PowFunctor<T>());
}
};

Expand Down
18 changes: 9 additions & 9 deletions paddle/pten/kernels/funcs/elementwise_functor.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,31 +26,31 @@ namespace funcs {
// Add
template <typename T>
struct AddFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return a + b; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return a + b; }
};
template <typename T>
struct InverseAddFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return b + a; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return b + a; }
};

// Subtract
template <typename T>
struct SubtractFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return a - b; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return a - b; }
};
template <typename T>
struct InverseSubtractFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return b - a; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return b - a; }
};

// Multiply
template <typename T>
struct MultiplyFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return a * b; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return a * b; }
};
template <typename T>
struct InverseMultiplyFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return b * a; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return b * a; }
};

// Divide
Expand All @@ -60,14 +60,14 @@ struct InverseMultiplyFunctor {

template <typename T, typename Enable = void>
struct DivideFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return a / b; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return a / b; }
};

template <typename T>
struct DivideFunctor<
T,
typename std::enable_if<std::is_integral<T>::value>::type> {
inline HOSTDEVICE T operator()(const T& a, const T& b) const {
inline HOSTDEVICE T operator()(const T a, const T b) const {
// For int32/int64, need to check whether the divison is zero.
PADDLE_ENFORCE(b != 0, DIV_ERROR_INFO);
return a / b;
Expand All @@ -76,7 +76,7 @@ struct DivideFunctor<

template <typename T, typename Enable = void>
struct InverseDivideFunctor {
inline HOSTDEVICE T operator()(const T& a, const T& b) const { return b / a; }
inline HOSTDEVICE T operator()(const T a, const T b) const { return b / a; }
};

} // namespace funcs
Expand Down

1 comment on commit 40ccb07

@paddle-bot-old
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Congratulation! Your pull request passed all required CI. You could ask reviewer(s) to approve and merge. 🎉

Please sign in to comment.