この構造体をコピーしてカーネルに渡すことができます。カーネルに渡されるパラメータの合計サイズは、Fermi より前のカードでは 256B、Fermi では 4KB を超えてはならないことに注意してください。
そのため、構造体でデバイス メモリへのポインタを設定するよりも、cudaMalloc を使用してデバイス メモリを割り当てる必要があります。最後に、構造体をコピーしてカーネルに渡します。
C++ コードでこの構造体を使用しないことを強くお勧めします。それ以外の
struct kernel_data {
double *A;
double *B;
double *C;
const int *A_dims;
const int *B_dims;
int C_dims[2];
};
あなたはそのようなことをすべきです
class DeviceData{
public:
DeviceData(...){//Do cudaMalloc here}
~DeviceData(...){//Do cudaFree here}
private:
double *_A;
int _dims;
};
このクラスは、デバイスで利用可能なデータを保持し、例外セーフです。カーネルに渡すことができるラッパーを実装できるよりも
class DeviceDataWrapper{
public:
__host__ DeviceDataWrapper(DeviceData& device):
_A(device._A),
_dims(device._dims)
{}
__forceinline__ __device__ double* data(){return _A;}
__forceinline__ __device__ int dims()const{return _dims;}
private:
double *_A;
int _dims;
}
そして、この方法でカーネルを呼び出します
__global__ void myKernel(DeviceDataWrapper a, DeviceDataWrapper b, DeviceData2Wrapper c){
//do something like a.data()[0] = 1;
}
DeviceData A,B;
DeviceData2 C;
myKernel<<< >>>(A,B,C);