2

C++ コードを CUDA & CUBLAS に移植しています。複雑な計算 (つまり、pow、log、exp など) に stl::complex を使用していますが、CuComplex ライブラリで定義されている同じ関数は見当たりませんでした。これらの関数を作成する方法はわかりませんが、オンラインでいくつかのコードを見つけました

#include <iostream>
#include <cublas_v2.h>
#include <cuComplex.h>
using namespace std;

typedef cuDoubleComplex Complex;

#define complex(x, y) make_cuDoubleComplex(x, y)

__host__ __device__ double cabs(const Complex& z) {return cuCabs(z);}
__host__ __device__ double carg(const Complex& z) {return atan2(cuCreal(z),   cuCimag(z));}
__host__ __device__ Complex polar(const double &magnitude, const double &angle) {return complex(magnitude*cos(angle), magnitude*sin(angle));}
__host__ __device__ Complex cexp(const Complex& z) {return polar( exp(cuCreal(z)), cuCimag(z));}
__host__ __device__ Complex czlog(const Complex& z) {return complex( ::log(cabs(z)), carg(z) );}
__host__ __device__ Complex cpow(const Complex& z, const int &exponent) {return cexp( cuCmul(czlog(z), complex((double )exponent, 0)) );}

void main(void)
{
  Complex z=complex(0.34, 0.56);
  cout << cuCreal(cpow(z, 2)) << "  " << cuCimag(cpow(z, 2)) << endl;
}

上記の結果は正しい答えを与えませんでした。それはcpowに何か問題がありますか?複素数で累乗やその他の関数を実行する方が良いですか?

4

1 に答える 1