mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-28 23:04:18 +08:00
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.
This commit is contained in:
parent
1615a27993
commit
fb4548e27b
@ -266,37 +266,43 @@ EIGEN_DEVICE_FUNC inline Packet bitwise_helper(const Packet& a, const Packet& b,
|
|||||||
return c;
|
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 */
|
/** \internal \returns the bitwise and of \a a and \a b */
|
||||||
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
|
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
|
||||||
pand(const Packet& a, const Packet& b) {
|
pand(const Packet& a, const Packet& b) {
|
||||||
#if defined(EIGEN_HIP_DEVICE_COMPILE)
|
return bitwise_helper(a, b, bit_and<unsigned char>());
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \internal \returns the bitwise or of \a a and \a b */
|
/** \internal \returns the bitwise or of \a a and \a b */
|
||||||
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
|
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
|
||||||
por(const Packet& a, const Packet& b) {
|
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>());
|
return bitwise_helper(a ,b, bit_or<unsigned char>());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \internal \returns the bitwise xor of \a a and \a b */
|
/** \internal \returns the bitwise xor of \a a and \a b */
|
||||||
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
|
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
|
||||||
pxor(const Packet& a, const Packet& b) {
|
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>());
|
return bitwise_helper(a ,b, bit_xor<unsigned char>());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \internal \returns the bitwise and of \a a and not \a b */
|
/** \internal \returns the bitwise and of \a a and not \a b */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user