From fb4548e27b650f2e9a3e840ab14b317632864e91 Mon Sep 17 00:00:00 2001 From: Antonio Sanchez Date: Mon, 1 Feb 2021 13:23:53 -0800 Subject: 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. --- Eigen/src/Core/GenericPacketMath.h | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'Eigen/src/Core/GenericPacketMath.h') 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 +struct bit_and { + EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { + return a & b; + } +}; + +template +struct bit_or { + EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { + return a | b; + } +}; + +template +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 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()); -#else - EIGEN_USING_STD(bit_and); - return bitwise_helper(a ,b, bit_and()); -#endif + return bitwise_helper(a, b, bit_and()); } /** \internal \returns the bitwise or of \a a and \a b */ template 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()); -#else - EIGEN_USING_STD(bit_or); return bitwise_helper(a ,b, bit_or()); -#endif } /** \internal \returns the bitwise xor of \a a and \a b */ template 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()); -#else - EIGEN_USING_STD(bit_xor); return bitwise_helper(a ,b, bit_xor()); -#endif } /** \internal \returns the bitwise and of \a a and not \a b */ -- cgit v1.2.3