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
デバイスメモリアドレスを指すカーネル内から使用したいと思います。それは実現可能ですか?前もって感謝します