2012-01-13 3 views
0

나는 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은"다음에 정의되지 않은

이름입니다 "::"클래스 또는 네임 스페이스 이름 또한

해야합니다 :

표현식에 포인터 대 객체 유형이 있어야합니다 (코드의 다른 부분에서 온 것일 수도 있음)

+0

대답에 어떻게든지 간다, 그것은'대신 i'와''의 imag' 필드를'real'을 가지고 있으며, r'. 또한 그들은 C 코드 에서처럼'double'이 아니라'float'이라는 것에주의하십시오. – aland

+0

좋아, 고마워! 지금 업데이트! 나는 (어쩌면 내가 틀렸다) cuda 코드에서 float가 잘못되었다고 생각하지 않는다. (나는 두번 시도했지만 여전히 같은 오류가있다.) – George

+0

@George : 오류 "변수"cmplx "유형 이름이 아닙니다."문제를 해결하는 데 필요한 모든 것을 알려줍니다. 그렇지 않다면 기본 C++를 수정해야합니다. 이것은 매우 초보적이고 스스로 설명하는 실수입니다. – talonmies

답변

2

실제로 무엇을하려고하는지 명확하게 알지 못하지만 (실제로 자신을 아는 사람이라면) 편집 및 댓글이 계속 올라감에 따라 점차 혼란스러워지고 있습니다.

#include <pycuda-complex.hpp> 

template<typename T> 
__global__ void kernel(const T * x, const T *y, T *z) 
{ 
    int tid = threadIdx.x + blockDim.x * blockIdx.x; 

    z[tid] = x[tid] + y[tid]; 
} 


typedef pycuda::complex<float> scmplx; 
typedef pycuda::complex<double> dcmplx; 

template void kernel<float>(const float *, const float *, float *); 
template void kernel<double>(const double *, const double *, double *); 
template void kernel<scmplx>(const scmplx *, const scmplx *, scmplx *); 
template void kernel<dcmplx>(const dcmplx *, const dcmplx *, dcmplx *); 

이 당신에게 사소한 커널 컴파일의 단일 및 이중 실수와 복소수 버전을 제공 :하지만, 여기에 제대로 pycuda 기본 복합 형식을 사용 CUDA 코드의 간단한, 컴파일 가능한 부분이며, 안드레아스의 대답은 조금 확장 이 같은 NVCC의 뭔가 :

$ nvcc -arch=sm_20 -Xptxas="-v" -I$HOME/pycuda-2011.1.2/src/cuda -c scmplx.cu 
ptxas info : Compiling entry function '_Z6kernelIN6pycuda7complexIdEEEvPKT_S5_PS3_' for 'sm_20' 
ptxas info : Used 12 registers, 44 bytes cmem[0], 168 bytes cmem[2], 4 bytes cmem[16] 
ptxas info : Compiling entry function '_Z6kernelIN6pycuda7complexIfEEEvPKT_S5_PS3_' for 'sm_20' 
ptxas info : Used 8 registers, 44 bytes cmem[0], 168 bytes cmem[2] 
ptxas info : Compiling entry function '_Z6kernelIdEvPKT_S2_PS0_' for 'sm_20' 
ptxas info : Used 8 registers, 44 bytes cmem[0], 168 bytes cmem[2] 
ptxas info : Compiling entry function '_Z6kernelIfEvPKT_S2_PS0_' for 'sm_20' 
ptxas info : Used 4 registers, 44 bytes cmem[0], 168 bytes cmem[2] 

아마도이 구조 정의에 따르면 귀하의 질문에 ....

+0

typedef pycuda :: complex를 사용하고 있습니다. cmplx; 하지만 나에게 "연산자가 없다"* "이 피연산자와 일치하는 피연산자 유형은 다음과 같습니다. cmplx * double"왜냐하면 "Cn2 = Cn1 * 3.0 - 2.0;"과 같은 계산이 있기 때문입니다. 여기서, Cn2 및 Cn1은 cmplx이다. 감사합니다. (i votes up) – George

+0

오류 메시지는 단 정밀도 및 배정도 유형을 혼합하고 있음을 알려줍니다. '3.0'은 배정도 상수입니다. '3.0f'는 단일 정밀도 상수입니다. 진지하게, 당신은 최선을 다해 시간을내어 기본 C++을 배워야합니다. 왜냐하면 당신이 그렇게 멀리까지 가지 않을 것이기 때문에 고통스럽게 분명하기 때문입니다. – talonmies

+0

: 우선 감사합니다! 그게 문제였습니다. 두 번째로, 전에 그런 문제가 발생하지 않았고 C++에 대한 경험이별로 없다고 말했죠. 물론, 많은 운동이 필요합니다!하지만 당신은 보았습니다. 프로젝트가 실행 중입니다! :). 어쨌든, "표현식에 포인터가있는 객체 유형이 있어야합니다"오류가 발생합니다. sth를 염두에 두시겠습니까? 고마워요! – George

2

사용하는의 된 STLport 버전에서 파생 된 사실 std::complex<>

#include <pycuda-complex.hpp> 

{ 
    pycuda::complex<float> x(5, 17); 
} 

같은 인터페이스.

+0

: 안녕하세요 안드레아스, 내 소식을 다시 확인할 수 있습니까? 말씀 하셨지만 문제가 있습니다. 업데이트했습니다. 고맙습니다! – George