2012-09-11 3 views
0

장치의 호스트 기능을 어떻게 사용할 수 있습니까? 아래 기능의 예를 들어
, 나는 값장치의 호스트 기능 사용

__device__ float magnitude2(void) { 
    return r * r + i * i; 
} 

을 반환하려면하지만이 기능은 장치 기능이며,이 오류 접수 :
calling a host function from a __device__/__global__ function is not allowed
이 문제에 대한 가장 좋은 방법은 무엇입니까? 나는이 구조체 정의 할

: 코드에 추가 코멘트

이제 우리는 질문 C++ 구조를 포함 알고

struct cuComplex { 
    float r; 
    float i; 
    cuComplex(float a, float b) : r(a), i(b) {} 
    __device__ float magnitude2(void) { 
     return r * r + i * i; 
    } 
    __device__ cuComplex operator*(const cuComplex& a) { 
     return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i); 
    } 
    __device__ cuComplex operator+(const cuComplex& a) { 
     return cuComplex(r+a.r, i+a.i); 
    } 
}; 
+3

컴파일 오류를 생성하는보다 구체적인 코드 예제를 게시 할 수 있습니까? 당신이 게시하고 쓴 것은 특별히 동의하거나별로 의미가 없습니다. – talonmies

+2

[code] __ host__ __device __ [/ code] 함수를 선언 할 수 있습니다. 즉, 컴파일러에서 호스트 코드와 장치 코드의 두 가지 버전을 생성합니다. – njuffa

+0

동의 함, 해당 오류 메시지는 해당 장치 기능에 대한 호출에서 오는 것 같지 않습니다. – harrism

답변

2

는 대답은 분명하다 - 생성자 클래스 내에서 클래스를 인스턴스화 할 수 있으려면 __device__ 함수로 사용할 수 있어야합니다. 당신의 예에서, 구조는 다음과 같이 정의한다 : 생성자는 클래스가 인스턴스화 될 때마다 호출 할 필요가 있기 때문에

struct cuComplex { 
    float r; 
    float i; 

    __device__ __host__ 
    cuComplex(float a, float b) : r(a), i(b) {} 

    __device__ 
    float magnitude2(void) { 
     return r * r + i * i; 
    } 

    __device__ 
    cuComplex operator*(const cuComplex& a) { 
     return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i); 
    } 

    __device__ 
    cuComplex operator+(const cuComplex& a) { 
     return cuComplex(r+a.r, i+a.i); 
    } 
}; 

당신이보고있는 오류가 발생합니다. 원래 코드에서 생성자는 호스트 함수로만 선언되므로 컴파일 오류가 발생합니다.