如何使用CUSPARSE中的复数?

时间:2012-03-12 18:33:37

标签: cuda

我目前正在与CUSPARSE合作。我遇到了麻烦,因为我不知道如何打印复杂的数字。例如,当我写:

cuComplex a;

a.x = 1.2;

a.y = 2.2;

如何打印varable? 我试过了:

COUT<<一个;

但它没有用。

2 个答案:

答案 0 :(得分:3)

您需要重载<<运算符以接受cuComplex和cuDoubleComplex数据类型。

std::ostream& operator<<(std::ostream& strm, const cuComplex& in)
{
    char sgn[2] = "+-"
    strm << in.x << sgn[in.y < 0] << " i"<< std::abs(in.y);
    return strm;
} 

您可以对cuDoubleComplex

执行相同的操作

答案 1 :(得分:0)

std::complex中的数据与cuComplex中的相应数据相同,即你可以reinterpret_cast指向一个类型的指针(也就是阵列) - 它在实践中起作用,是我认为,实际上由C ++ 11保证,你可以像这样测试它:

namespace check_stdComplexdouble_to_cuDoubleComplex_binary_compatibility{
  using std::complex;

  const complex<double> testarr[] = { complex<double>(0.,.5)
                                    , complex<double>(1.,1.5) };
  const cuDoubleComplex* cucomplexd
     = reinterpret_cast<const cuDoubleComplex*>(testarr);
  auto tester() -> bool {
    assert( cuCreal(cucomplexd[0])==0. && cuCimag(cucomplexd[0])==.5
                && cuCreal(cucomplexd[1])==1. && cuCimag(cucomplexd[1])==1.5 );
    return true;
  }
  const bool ok = tester();
  bool good(){return ok;}
};

如果你调用一个CUBLAS函数,该函数应该从/ std::complex<float>读/写,你可以给它一个reinterpret_cast指针,例如。

  std::complex<double> result;
  xhandle->cublasstat = yhandle->cublasstat
     = cublasZdotc( *xhandle->cublashandle
                  , xhandle->vect_dimension
                  , xhandle->vector, 1
                  , yhandle->vector, 1
                  , reinterpret_cast<cuDoubleComplex*>(&result) );