2

CUDA 内で C++ クラスを利用しようとしています。

私はそのようなクラスを持っています:

#include<string>
#include<stdlib.h>

class exampleClass{
int i;
__host__ __device__ exampleClass(int _i):i(_i){};
__host__ __device__ void increment(){i++;}
__host__ __device__ string outputMessage(return itoa(i);}

};

これを .cu ファイルに設定し、CUDA c/c++ をコンパイルするように設定しました

cuda には文字列がないため、これは nvcc でのコンパイルに失敗します。

私がやりたいのは、次のようなことを行って CUDA のみの機能を保持することです。

#ifndef __CUDA_ARCH__
  #include<string>
#endif
    #include<stdlib.h>

    class exampleClass{
    int i;
    __host__ __device__ exampleClass(int _i):i(_i){};
    __host__ __device__ void increment(){i++;}
#ifndef __CUDA_ARCH__
     string outputMessage(return itoa(i);}
#endif

    };

しかし、これがうまくいかないことはわかっています...少なくとも、私にとってはうまくいきません。nvcc は、文字列を含めることも、明らかに文字列型を必要とする関数も好きではありません。

例が一流でない場合はお詫び申し上げます。要約すると、私がやりたいことは、コア クラス メンバーを CUDA で実行できるようにする一方で、ホスト側での分析と出力のための複雑なホスト操作を行う機能を維持することです。

更新: ここでの私の最終目標は、いくつかのポリモーフィック クラスへのいくつかのポインター型を含む基本クラスを持つことです。この基本クラス自体は派生可能になります。これはCUDA5.0で可能だと思いました。私は間違っていますか?

4

1 に答える 1

2

私は実行しませんでしたが、次のコードがビルドされます。

class exampleClass{
int i;
public:
__host__ __device__ exampleClass(int _i):i(_i){};
__host__ __device__ void increment(){i++;}

 __host__ string outputMessage(){ return "asdf";}


};

__global__ void testkernel (                        
    exampleClass *a,
    int IH, int IW)
{
    const int i = IMUL(blockIdx.x, blockDim.x) + threadIdx.x;
    const int j = IMUL(blockIdx.y, blockDim.y) + threadIdx.y;


    if (i<IW && j<IH) 
    {
        const int i_idx = i + IMUL(j, IW);  
        exampleClass* ptr = a+i_idx;
        ptr->increment();
    }
}

__host__ void test_function(exampleClass *a,
    int IH, int IW)
{
    for (int i = 0; i < IW; i++)
        for (int j = 0; j < IH; j++)
        {
            const int i_idx = i + j*IW;
            exampleClass* ptr = a+i_idx;
            cout << ptr->outputMessage();
        }
}

これを適切に「機能させる」には、クラスをデバイスからホストメモリに移動する必要があることに注意してください。クラスに凝ったこと (例えばポリモーフィズムなど) を行おうとすると、おそらく失敗するでしょう。

于 2013-03-28T20:16:30.290 に答える