0

デバイス1でホスト機能を使用するにはどうすればよいですか?
たとえば、以下の関数では、値を返したい

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

しかし、この関数はデバイス関数であり、このエラーを受け取りました:
calling a host function from a __device__/__global__ function is not allowed
この問題の最善のアプローチは何ですか?

コードに関する追加のコメント:

この構造体を定義したい:

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);
    }
};
4

1 に答える 1

2

質問にC++構造が含まれていることがわかったので、答えは明らかです。カーネル内でクラスをインスタンス化できるようにするには、クラスのコンストラクターも__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);
    }
};

表示されているエラーは、クラスがインスタンス化されるたびにコンストラクターを呼び出す必要があるために発生します。元のコードでは、コンストラクターはホスト関数としてのみ宣言されているため、コンパイルエラーが発生します。

于 2012-09-12T07:28:29.380 に答える