Как мне работать с комплексными числами в CUSPARSE? - PullRequest
2 голосов
/ 12 марта 2012

Я сейчас работаю с CUSPARSE. У меня проблемы, потому что я не знаю, как напечатать комплексное число. Например, когда я пишу:

cuComplex a;

A.x = 1,2;

a.y = 2,2;

Как мне распечатать varable a? Я пробовал:

cout << a; </p>

но это не работает.

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Вам потребуется перегрузить оператор << для получения типов данных 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

0 голосов
/ 12 марта 2012

Данные в 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 ed, например,

  std::complex<double> result;
  xhandle->cublasstat = yhandle->cublasstat
     = cublasZdotc( *xhandle->cublashandle
                  , xhandle->vect_dimension
                  , xhandle->vector, 1
                  , yhandle->vector, 1
                  , reinterpret_cast<cuDoubleComplex*>(&result) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...