나는 cuda, pycuda에서 복소수를 사용하는 데 어려움이 있습니다.cuda, pycuda - 복소수 작성법 - 오류 : 클래스 "cuComplex"에는 "i"회원이 없습니다
나는이 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 시도 :
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- --------------------- ------------------------
I했던 (위 상대적)#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 :: 복잡한 cmplx 사용하는 경우 아니다; 다음, 내가 얻을 :
식별자 "cmplx은"다음에 정의되지 않은
이름입니다 "::"클래스 또는 네임 스페이스 이름 또한
해야합니다 :
표현식에 포인터 대 객체 유형이 있어야합니다 (코드의 다른 부분에서 온 것일 수도 있음)
대답에 어떻게든지 간다, 그것은'대신 i'와''의 imag' 필드를'real'을 가지고 있으며, r'. 또한 그들은 C 코드 에서처럼'double'이 아니라'float'이라는 것에주의하십시오. – aland
좋아, 고마워! 지금 업데이트! 나는 (어쩌면 내가 틀렸다) cuda 코드에서 float가 잘못되었다고 생각하지 않는다. (나는 두번 시도했지만 여전히 같은 오류가있다.) – George
@George : 오류 "변수"cmplx "유형 이름이 아닙니다."문제를 해결하는 데 필요한 모든 것을 알려줍니다. 그렇지 않다면 기본 C++를 수정해야합니다. 이것은 매우 초보적이고 스스로 설명하는 실수입니다. – talonmies