9

オブジェクトをカーネル関数に渡すことはできますか?

クラスがあると考えてください

class MyClass
{
    public:
        int value;
        float rate;
        MyClass()
        {
            value = 0; rate = 0;
        }
        MyClass(int v,float r)
        {
            value = v; rate = r;
        }
};

私のカーネルは MyClass のオブジェクトの配列を取ります

__global__ void MyKernel(MyClass * mc)
{
    //Some Calculation
}

配列を渡すことはできますか? メモリを割り当てる方法?? 今、私は次のコードで試してみました CudaMemcpy エラーが発生しました

cudaError_t cudaStatus;

MyClass darr[10] ;
cudaStatus = cudaMalloc((void**)&darr, size * sizeof(MyClass));

if (cudaStatus != cudaSuccess) {
    fprintf(stderr, "cudaMalloc failed!");
    goto label1;
}

cudaStatus = cudaMemcpy(darr, arr, size * sizeof(MyClass), cudaMemcpyHostToDevice);
//arr is a host array
4

1 に答える 1

15

ここにはいくつかの問題がありますが、すべてが表示されているエラーに直接関係しているわけではありません。

まず、ホストとデバイスの両方で各クラス メソッドを定義して、両方のメモリ空間でクラスをインスタンス化できるようにする必要があります (コピーを実行すると、各インスタンスのデータ メンバーのみがコピーされます)。したがって、クラス宣言は次のようになります。

class MyClass
{
    public :
        int value;
        float rate;
        __device__ __host__ MyClass()
        {
            value = 0; rate = 0;
        }
        __device__ __host__ MyClass(int v,float r)
        {
            value = v; rate = r;
        }
        __device__ __host__ ~MyClass() {};
}

次に、デバイス メモリを正しく割り当てる必要があります。デバイスに 10 メンバーの配列が必要な場合は、次MyClassのようにデバイスに割り当ててコピーします。

MyClass arr[10];
MyClass *darr;
const size_t sz = size_t(10) * sizeof(MyClass);
cudaMalloc((void**)&darr, sz);
cudaMemcpy(darr, &arr[0], sz, cudaMemcpyHostToDevice);

[免責事項: すべてのコードはブラウザで記述されており、準拠もテストもされていません。自己責任で使用してください]

darrその後、ホストからカーネルに引数として渡すことができます。

于 2013-01-02T09:00:51.807 に答える