1

次のように指定された構造体としてカーネル関数のパラメーターを渡したい

struct kernel_data {
    double *A;
    double *B;
    double *C;
    const int *A_dims;
    const int *B_dims;
    int C_dims[2];
};

目的のために、デバイスポインタを初期化する必要がありますcudaMalloc()が、どうすれば初期化できますか. 私が渡すことを目指しているこれらのパラメーターを含むこの関数によるそのような構造体。または、それらを別々に渡す必要がありますか?

4

2 に答える 2

5

他の引数と同様に、構造体を値でカーネルに渡すだけです。

struct kernel_data args;

cudaMalloc(&(args.A), sizeof(double)*.....);
cudaMalloc(&(args.B), sizeof(double)*.....);
cudaMalloc(&(args.C), sizeof(double)*.....);
cudaMalloc(&(args.A_dims), sizeof(int)*.....);
cudaMalloc(&(args.B_dims), sizeof(int)*.....);

kernel<<<....>>>(args);

引数リストのサイズには理論上の制限があり、使用するハードウェアに応じて 256 バイトから 4Kb までの範囲になります。それを超えた場合は、args構造体をデバイス割り当てにコピーしてポインターとして渡すか、定数にコピーします。メモリポインタ。

ホストから配列を初期化するには、標準cudaMemcpy呼び出しを使用します。

cudaMemcpy(args.A, hostA, sizeof(double)*....., cudaMemcpyHostToDevice);

于 2013-02-03T17:52:09.697 に答える
2

この構造体をコピーしてカーネルに渡すことができます。カーネルに渡されるパラメータの合計サイズは、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);
于 2013-02-03T15:37:16.417 に答える