Данные в 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) );