私の問題の説明は、以下のこのコードにあります。
class A
{
public :
__device__ __host__ virtual void foo() = 0;
__device__ __host__ void foo2()
{
//something to do...
}
};
class B : public A
{
public :
__device__ __host__ B()
{ }
//implementing virtual method foo from A
void foo()
{
//something to do...
}
};
__global__ void Test(A* ptr_device)
{
ptr_device->foo2(); //it's okey
ptr_device->foo(); //ERROR !!!
}
void main()
{
B* b_host = new B();
A* a_host = (A*)malloc(sizeof(A));
memcpy(a_host, b_host, sizeof(A));
a_host->foo();
a_host->foo2();
//it's okey
A* a_device;
cudaMalloc((void**)&a_device, sizeof(A));
cudaMemcpy(a_device, a_host, sizeof(A), cudaMemcpyHostToDevice);
Test<<<1, 1>>>(a_device);
}
問題は、カーネルでクラスAの仮想メソッドを呼び出したい場合です。最初にオブジェクトBを作成し、次にAオブジェクトのスペースを割り当ててBをAにコピーします。ホストコードでは正常に機能しますが、デバイスコードではfooメソッドの呼び出しでエラーが発生します。