Specialize std::complex operators for use on GPU device.

NVCC and older versions of clang do not fully support `std::complex` on device,
leading to either compile errors (Cannot call `__host__` function) or worse,
runtime errors (Illegal instruction).  For most functions, we can
implement specialized `numext` versions. Here we specialize the standard
operators (with the exception of stream operators and member function operators
with a scalar that are already specialized in `<complex>`) so they can be used
in device code as well.

To import these operators into the current scope, use
`EIGEN_USING_STD_COMPLEX_OPERATORS`. By default, these are imported into
the `Eigen`, `Eigen:internal`, and `Eigen::numext` namespaces.

This allow us to remove specializations of the
sum/difference/product/quotient ops, and allow us to treat complex
numbers like most other scalars (e.g. in tests).
This commit is contained in:
Antonio Sanchez
2021-01-06 09:41:15 -08:00
committed by Antonio Sánchez
parent 65e2169c45
commit f19bcffee6
3 changed files with 336 additions and 76 deletions

View File

@@ -117,6 +117,7 @@ struct compile_time_device_info {
void operator()(int i, const int* /*in*/, int* info) const
{
if (i == 0) {
EIGEN_UNUSED_VARIABLE(info)
#if defined(__CUDA_ARCH__)
info[0] = int(__CUDA_ARCH__ +0);
#endif