简体   繁体   English

发送结构数组到CUDA内核

[英]sending struct array to cuda kernel

I'm working on a project and I have to sent a struct array to cuda kernel. 我正在做一个项目,必须将结构数组发送到cuda内核。 The struct also contains an array. 该结构还包含一个数组。 To test it I have written a simple program. 为了测试它,我编写了一个简单的程序。

struct Point {
    short     x;
    short     *y;
};

my kernel code: 我的内核代码:

__global__ void addKernel(Point *a, Point *b, Point *c)
{
    int i = threadIdx.x;

    c[i].x = a[i].x + b[i].x;
    for (int j = 0; j<4; j++){
        c[i].y[j] = a[i].y[j] + a[i].y[j];
    }
}

my main code: 我的主要代码:

int main()
{
    const int arraySize = 4;
    const int arraySize2 = 4;

    short *ya, *yb, *yc;
    short *dev_ya, *dev_yb, *dev_yc;

    Point *a;
    Point *b;
    Point *c;
    Point *dev_a;
    Point *dev_b;
    Point *dev_c;

    size_t sizeInside = sizeof(short) * arraySize2;

    ya = (short *)malloc(sizeof(short) * arraySize2);
    yb = (short *)malloc(sizeof(short) * arraySize2);
    yc = (short *)malloc(sizeof(short) * arraySize2);

    ya[0] = 1; ya[1] =2; ya[2]=3; ya[3]=4;
    yb[0] = 2; yb[1] =3; yb[2]=4; yb[3]=5;

    size_t sizeGeneral = (sizeInside+sizeof(short)) * arraySize;

    a = (Point *)malloc( sizeGeneral );  
    b = (Point *)malloc( sizeGeneral );
    c = (Point *)malloc( sizeGeneral );


    a[0].x = 2;  a[0].y = ya;
    a[1].x = 2;  a[1].y = ya;
    a[2].x = 2;  a[2].y = ya;
    a[3].x = 2;  a[3].y = ya;

    b[0].x = 4;  b[0].y = yb;
    b[1].x = 4;  b[1].y = yb;
    b[2].x = 4;  b[2].y = yb;
    b[3].x = 4;  b[3].y = yb;

    cudaMalloc((void**)&dev_a, sizeGeneral);
    cudaMalloc((void**)&dev_b, sizeGeneral);
    cudaMalloc((void**)&dev_c, sizeGeneral);

    cudaMemcpy(dev_a, a, sizeGeneral, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, sizeGeneral, cudaMemcpyHostToDevice);

    addKernel<<<1, 4>>>(dev_a, dev_b, dev_c);

    cudaError_t err = cudaMemcpy(c, dev_c, sizeGeneral, cudaMemcpyDeviceToHost);   

    printf("{%d-->%d,%d,%d,%d} \n err= %d",c[0].x,c[0].y[0],c[1].y[1],c[1].y[2],c[2].y[3], err);        

    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);

    return 0;
}

It seems cuda kernel is not working. 似乎cuda内核无法正常工作。 Actually I can access structs 'x' variable but I cannot access 'y' array. 实际上,我可以访问结构'x'变量,但不能访问'y'数组。 What can I do to access the 'y' array? 我该怎么做才能访问“ y”数组? Thanks in advance. 提前致谢。

When you are sending this struct to kernel you send short and pointer to short in host memory not device . 当您将此结构发送到内核时,您在主机内存而不是device中发送short和short指针。 This is crucial. 这很关键。 For simple type - as short this works, because kernel has its local copy in memory designated to accept parameters. 对于简单类型-简而言之,这是可行的,因为内核在内存中将其本地副本指定为接受参数。 So when you call this kernel you have moved x and y to device, but not the area pointed by y . 所以,当你调用这个内核您移动xy到设备,但不被指向的区域y This you have to do manually by allocating space for it and updating pointer y to point to device memory. 您必须为此手动分配空间,并更新指针y以指向设备内存。

You are not passin the array to the device. 您没有将阵列传递给设备。 You can either make the array a part of the struct, by defining it like this: 您可以通过如下定义数组,使数组成为结构的一部分:

struct {
  short normalVal;
  short inStructArr[4];
}

Or pass the array into the device memory and update the pointer in the struct. 或将数组传递到设备内存中并更新结构中的指针。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM