diff options
author | Antonio Sanchez <cantonios@google.com> | 2021-02-01 13:23:53 -0800 |
---|---|---|
committer | Antonio Sanchez <cantonios@google.com> | 2021-02-01 13:27:45 -0800 |
commit | fb4548e27b650f2e9a3e840ab14b317632864e91 (patch) | |
tree | 87231e8f69cc25639a6fe10c5650656f92c4c04d /Eigen/src/Core/GenericPacketMath.h | |
parent | 1615a2799384a2964d01ba77fe98e3f6fcc412f4 (diff) |
Implement bit_* for device.
Unfortunately `std::bit_and` and the like are host-only functions prior
to c++14 (since they are not `constexpr`). They also never exist in the
global namespace, so the current implementation always fails to compile via
NVCC - since `EIGEN_USING_STD` tries to import the symbol from the global
namespace on device.
To overcome these limitations, we implement these functionals here.
Diffstat (limited to 'Eigen/src/Core/GenericPacketMath.h')
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index b02a9f20b..7160fa084 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -266,37 +266,43 @@ EIGEN_DEVICE_FUNC inline Packet bitwise_helper(const Packet& a, const Packet& b, return c; } +template<typename T> +struct bit_and { + EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { + return a & b; + } +}; + +template<typename T> +struct bit_or { + EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { + return a | b; + } +}; + +template<typename T> +struct bit_xor { + EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { + return a ^ b; + } +}; + /** \internal \returns the bitwise and of \a a and \a b */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet pand(const Packet& a, const Packet& b) { -#if defined(EIGEN_HIP_DEVICE_COMPILE) - return bitwise_helper(a ,b, std::bit_and<unsigned char>()); -#else - EIGEN_USING_STD(bit_and); - return bitwise_helper(a ,b, bit_and<unsigned char>()); -#endif + return bitwise_helper(a, b, bit_and<unsigned char>()); } /** \internal \returns the bitwise or of \a a and \a b */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet por(const Packet& a, const Packet& b) { -#if defined(EIGEN_HIP_DEVICE_COMPILE) - return bitwise_helper(a ,b, std::bit_or<unsigned char>()); -#else - EIGEN_USING_STD(bit_or); return bitwise_helper(a ,b, bit_or<unsigned char>()); -#endif } /** \internal \returns the bitwise xor of \a a and \a b */ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet pxor(const Packet& a, const Packet& b) { -#if defined(EIGEN_HIP_DEVICE_COMPILE) - return bitwise_helper(a ,b, std::bit_xor<unsigned char>()); -#else - EIGEN_USING_STD(bit_xor); return bitwise_helper(a ,b, bit_xor<unsigned char>()); -#endif } /** \internal \returns the bitwise and of \a a and not \a b */ |