У меня трудности с использованием комплексных чисел в 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?Я пытался вот так (в соответствии с книгой 'cuda by example'):
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
....
Некоторые ошибки, которые я принимаю:
Инициализация члена данных не разрешена
в этом объявлении нет класса хранения или спецификатора типа
Спасибо!
-------------------- -EDIT- ---------------------------------------------
Я сделал следующее, используя #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".
До сих пор я получаю сообщение об ошибке:
переменная "cmplx" не является именем типа
Если я использую pycuda :: complex cmplx;, тогда я получаю:
идентификатор "cmplx" не определен
имя, за которым следует "::", должно быть именем класса или пространства имен
Также:
выражение должно иметь указатель на тип объекта (но, возможно, это из другой части кода)