cuda、pycudaで複素数を使用するのが困難です。
私はCでこれを持っています:
#include <complex>
typedef std::complex<double> cmplx;
....
cmplx j(0.,1.);
また、同じコードで:
#include <boost/python.hpp>
#include <boost/array.hpp>
...
typedef std::vector< boost::array<std::complex<double>,3 > > ComplexFieldType;
typedef std::vector< boost::array<double,3> > RealFieldType;
...
__global__ void compute(RealFieldType const & Rs,ComplexFieldType const & M,..)
...
これをpycudaで使用するように変換するにはどうすればよいですか? 私はこのようにsthを試しました(本「例によるcuda」によると):
struct cuComplex {
float real;
float imag;
cuComplex(float a,float b): real(a),imag(b){}
cuComplex operator *(const cuComplex& a) {
return cuComplex(real*a.real -imag*a.imag ,imag*a.real +real*a.imag);
}
cuComplex operator +(const cuComplex& a) {
return cuComplex(real+a.real ,imag+a.imag);
};
cuComplex j(0.,1.); //instead of cmplx j(0.,1.);
__global__ void compute(float *Rs,cuComplex * M,..) //instead of RealFieldType const & Rs,ComplexFieldType const & M
....
私が取るエラーのいくつかは次のとおりです。
データ メンバー初期化子は許可されていません
この宣言にはストレージ クラスまたは型指定子がありません
ありがとうございました!
-------------------- -編集- --------------------------- ------------------
私は#include <pycuda-complex.hpp>
(上記に関連して)を使用して次のことを行いました:
pycuda::complex<float> cmplx;
cmplx j(0.,1.);
そして、typedef std::vector< boost::array<std::complex<double>,3 > > ComplexFieldType;
そしてComplexFieldType const & M
、グローバル関数内で、「float *M」または「cmplx *M」だけを試しました。
今まで、私はエラーが発生しています:
変数「cmlx」は型名ではありません
pycuda::complex cmplx; を使用する場合 、そして私は得る:
識別子「cmlx」は定義されていません
"::" が後に続く名前は、クラスまたは名前空間の名前でなければなりません
また:
式はオブジェクトへのポインター型でなければなりません (ただし、これはコードの別の部分からのものである可能性があります)