1

我正在尝试在 cuda 中实现一个算法,我需要分配一个指向结构数组的指针数组。我的结构是,可以说:

    typedef struct {
       float x, y; 
    } point;

我知道如果我想为多个内核调用保留数组,我必须从主机控制它们,对吗?指针的初始化必须在内核中完成。更具体地说,Array of Struct P将包含笛卡尔点的随机顺序,而dev_S_x将是关于 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]->xdev_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 回答