|
|
@ -15,12 +15,11 @@
|
|
|
|
#pragma once
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <complex>
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <limits>
|
|
|
|
#include <limits>
|
|
|
|
#if !defined(_WIN32)
|
|
|
|
|
|
|
|
#define PADDLE_ALIGN(x) __attribute__((aligned(x)))
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define PADDLE_ALIGN(x) __declspec(align(x))
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PADDLE_WITH_CUDA
|
|
|
|
#ifdef PADDLE_WITH_CUDA
|
|
|
|
#include <cuComplex.h>
|
|
|
|
#include <cuComplex.h>
|
|
|
@ -32,16 +31,23 @@
|
|
|
|
#include <thrust/complex.h> // NOLINT
|
|
|
|
#include <thrust/complex.h> // NOLINT
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
#if !defined(_WIN32)
|
|
|
|
|
|
|
|
#define PADDLE_ALIGN(x) __attribute__((aligned(x)))
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define PADDLE_ALIGN(x) __declspec(align(x))
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#include "paddle/fluid/platform/complex128.h"
|
|
|
|
#if (defined(__CUDACC__) || defined(__HIPCC__))
|
|
|
|
#include "paddle/fluid/platform/hostdevice.h"
|
|
|
|
#define HOSTDEVICE __host__ __device__
|
|
|
|
#include "unsupported/Eigen/CXX11/Tensor"
|
|
|
|
#define DEVICE __device__
|
|
|
|
|
|
|
|
#define HOST __host__
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define HOSTDEVICE
|
|
|
|
|
|
|
|
#define DEVICE
|
|
|
|
|
|
|
|
#define HOST
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
namespace Eigen {
|
|
|
|
#include "complex128.h" // NOLINT
|
|
|
|
template <typename T>
|
|
|
|
|
|
|
|
struct NumTraits;
|
|
|
|
|
|
|
|
} // namespace Eigen
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace paddle {
|
|
|
|
namespace paddle {
|
|
|
|
namespace platform {
|
|
|
|
namespace platform {
|
|
|
@ -510,98 +516,5 @@ struct numeric_limits<paddle::platform::complex64> {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace std
|
|
|
|
} // namespace std
|
|
|
|
namespace Eigen {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using complex64 = paddle::platform::complex64;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
struct NumTraits<complex64> : GenericNumTraits<std::complex<float>> {
|
|
|
|
|
|
|
|
typedef float Real;
|
|
|
|
|
|
|
|
typedef typename NumTraits<float>::Literal Literal;
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
|
|
|
IsComplex = 1,
|
|
|
|
|
|
|
|
RequireInitialization = NumTraits<float>::RequireInitialization,
|
|
|
|
|
|
|
|
ReadCost = 2 * NumTraits<float>::ReadCost,
|
|
|
|
|
|
|
|
AddCost = 2 * NumTraits<Real>::AddCost,
|
|
|
|
|
|
|
|
MulCost = 4 * NumTraits<Real>::MulCost + 2 * NumTraits<Real>::AddCost
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EIGEN_DEVICE_FUNC
|
|
|
|
|
|
|
|
static inline Real epsilon() { return NumTraits<Real>::epsilon(); }
|
|
|
|
|
|
|
|
EIGEN_DEVICE_FUNC
|
|
|
|
|
|
|
|
static inline Real dummy_precision() {
|
|
|
|
|
|
|
|
return NumTraits<Real>::dummy_precision();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
EIGEN_DEVICE_FUNC
|
|
|
|
|
|
|
|
static inline int digits10() { return NumTraits<Real>::digits10(); }
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace numext {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline bool(isnan)(const complex64& a) {
|
|
|
|
|
|
|
|
return (paddle::platform::isnan)(a);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline bool(isinf)(const complex64& a) {
|
|
|
|
|
|
|
|
return (paddle::platform::isinf)(a);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline bool(isfinite)(const complex64& a) {
|
|
|
|
|
|
|
|
return (paddle::platform::isfinite)(a);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 exp(const complex64& a) {
|
|
|
|
|
|
|
|
float com = ::expf(a.real);
|
|
|
|
|
|
|
|
float res_real = com * ::cosf(a.imag);
|
|
|
|
|
|
|
|
float res_imag = com * ::sinf(a.imag);
|
|
|
|
|
|
|
|
return complex64(res_real, res_imag);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 log(const complex64& a) {
|
|
|
|
|
|
|
|
return paddle::platform::log(a);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 tanh(const complex64& a) {
|
|
|
|
|
|
|
|
return paddle::platform::tanh(a);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 sqrt(const complex64& a) {
|
|
|
|
|
|
|
|
return paddle::platform::sqrt(a);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 ceil(const complex64& a) {
|
|
|
|
|
|
|
|
return complex64(::ceilf(a.real), ::ceilf(a.imag));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 floor(const complex64& a) {
|
|
|
|
|
|
|
|
return complex64(::floorf(a.real), ::floor(a.imag));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 round(const complex64& a) {
|
|
|
|
|
|
|
|
return complex64(::roundf(a.real), ::roundf(a.imag));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline complex64 pow(const complex64& a, const complex64& b) {
|
|
|
|
|
|
|
|
return paddle::platform::pow(a, b);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
|
|
|
HOSTDEVICE inline float abs(const complex64& a) {
|
|
|
|
|
|
|
|
return paddle::platform::abs(a);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace numext
|
|
|
|
|
|
|
|
} // namespace Eigen
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define MKL_Complex8 paddle::platform::complex64
|
|
|
|
#define MKL_Complex8 paddle::platform::complex64
|
|
|
|