1

cuda でアルゴリズムを実装しようとしていますが、構造体の配列を指すポインターの配列を割り当てる必要があります。私の構造体は、言いましょう:

    typedef struct {
       float x, y; 
    } point;

複数のカーネル呼び出しの配列を保持したい場合は、ホストからそれらを制御する必要があることを知っていますか? ポインターの初期化は、カーネル内から行う必要があります。より具体的には、 にArray of Struct Pはデカルト ポイントのランダムな順序が含まれますがdev_S_x、 は のポイントの x 座標に関してソートされたバージョンになりPます。

私は試してみました:

__global__ void test( point *dev_P, point **dev_S_x) {
    unsigned int tid = threadIdx.x + blockIdx.x * blockDim.x;

    dev_P[tid].x = 3.141516;
    dev_P[tid].y = 3.141516;
    dev_S_x[tid] = &dev_P[tid];
   ...
}

と:

 int main( void ) {
     point *P, *dev_P, **S_x, *dev_S_x;
     P   = (point*)  malloc (N * sizeof (point) );
     S_x = (point**) malloc (N * sizeof (point*));

     // allocate the memory on the GPU
     cudaMalloc( (void**)  &dev_P,   N * sizeof(point) );
     cudaMalloc( (void***)  &dev_S_x, N * sizeof(point*));

     // copy the array P to the GPU
     cudaMemcpy( dev_P, P,  N * sizeof(point),  cudaMemcpyHostToDevice);
     cudaMemcpy( dev_S_x,S_x,N * sizeof(point*), cudaMemcpyHostToDevice);

     test <<<1, 1 >>>( dev_P, &dev_S_x);
        ...
     return 0;
}

多くのことにつながる

First-chance exception at 0x000007fefcc89e5d (KernelBase.dll) in Test_project_cuda.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0020f920.. Critical error detected c0000374

ポインターの配列の cudamalloc で何か間違ったことをしていますか、それとも何か他のことですか? の使い方は(void***)正しいですか?dev_S_x[tid]->xたとえば、dev_S_x[tid]->yデバイスメモリアドレスを指すカーネル内から使用したいと思います。それは実現可能ですか?前もって感謝します

4

1 に答える 1

1

dev_S_x は として宣言しpoint **、カーネルに値 (つまりtest <<<1, 1 >>>(dev_P, dev_S_x);) として渡す必要があります。

それを脇に置くと、あなたの説明はThrustに自然に適合するように聞こえます。これにより、よりシンプルなメモリ管理戦略と高速ソートルーチンへのアクセスが可能になります。

于 2013-07-31T10:13:07.933 に答える