我在使用複數cuda,pycuda時遇到了困難。cuda,pycuda - 如何編寫複數 - 錯誤:class「cuComplex」沒有會員「我」
我有這個在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使用它呢? I(根據書的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
....
一些I採取錯誤是:
數據成員的初始值是不允許的
此聲明沒有存儲類別或類型說明符
謝謝!
-------------------- -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
,全局函數裏面, 我嘗試了 「浮動* M」 或 「CMPLX * M」。
到現在爲止,我得到錯誤:
變量 「CMPLX」 不是一個類型名稱
如果我使用pycuda ::複雜CMPLX; ,然後我得到:
標識符 「CMPLX」 未定義
名後加 「::」 必須是類或命名空間名稱
另外:
表達式必須具有指針對象類型(但也許這是來自代碼的另一部分)
根據結構定義,它有'real'和'imag'領域,而不是'i'和' r'。還要注意,它們是'float',而不是像你的C代碼中的'double'。 – aland 2012-01-13 20:55:20
好的,謝謝!我現在更新了!我不認爲(也許我錯了)將它們作爲浮點數存放在cuda代碼中是錯誤的(我也嘗試過使用double但仍然是相同的錯誤)。 – George 2012-01-13 21:00:56
@George:錯誤「變量」cmplx「不是類型名稱」應該告訴你一切你需要解決的問題。如果沒有,你需要修改一些基本的C++ - 這是一個非常基本和自我解釋的錯誤。 – talonmies 2012-01-14 15:13:05