在转移到CUDA GPU时保持主机数据完好无损

时间:2015-08-05 00:58:30

标签: c++ cuda

所以我遇到了一个让我陷入困境一段时间的问题。我使用NSight Eclipse Edition(CUDA 7.0)在GT 630(Kepler版本)GPU上进行编程。

基本上,我有一个类(Static_Box)的数组,我修改了主机(CPU)上的数据。然后,我想将数据发送到GPU进行计算,但是,我的代码没有这样做。这是我的一些代码:

#define SIZE_OF_BOX_ARRAY 3

class Edge {
    int x1, y1, x2, y2;
}

class Static_Box {
    Static_Box(int x, int y, int width, int height);
    Edge e1, e2, e3, e4;
}

Static_Box::Static_Box(int x, int y, int width, int height) {
    e1.x1 = x;
    e1.y1 = y;
    e1.x2 = x+width;
    e1.y2 = y;
    // e2.x1 = x+width;  Continuing in this manner (no other calculations)
}

// Storage of the scene. d_* indicates GPU memory
// Static_Box is a class I have defined in another file, it contains a
// few other classes that I wrote as well.
Static_Box *static_boxes;
Static_Box *d_static_boxes;

int main(int argc, char **argv) {
    // Create the host data storage
    static_boxes = (Static_Box*)malloc(SIZE_OF_BOX_ARRAY*sizeof(Static_Box));

    // I then set a few of the indexes of static_boxes here, which is
    // the data I need written while on the CPU.
    // Example:
    static_boxes[0] = Static_Box(

    // Allocate the memory on the GPU
    // CUDA_CHECK_RETURN is from NVIDIA's bit reverse example (exits the application if the GPU fails)
    CUDA_CHECK_RETURN(cudaMalloc((void**)&d_static_boxes, SIZE_OF_BOX_ARRAY * sizeof(Static_Box)));

    int j = 0;
    for (; j < SIZE_OF_BOX_ARRAY; j++) {
    //  Removed this do per Mai Longdong's suggestion
    //    CUDA_CHECK_RETURN(cudaMalloc((void**)&(static_boxes[j]), sizeof(Static_Box)));
        CUDA_CHECK_RETURN(cudaMemcpy(&(d_static_boxes[j]), &(static_boxes[j]), sizeof(Static_Box), cudaMemcpyHostToDevice));
    }
}

我在这里寻找了很长一段时间,并从罗伯特克罗维拉找到了一些有用的信息,并且使用他的提示进行了一些进展,但他给出的答案并不完全与我的问题有关。 是否有人有解决方案在传输到GPU时保持主机数据完好无损?

非常感谢你的帮助!

编辑,包括来自MaiLongdong的第一个cudaMalloc的更改

编辑2,包括麦龙洞的第二次更改,并提供了完整的示例。

1 个答案:

答案 0 :(得分:1)

如果Static_Box不包含指针(由需要独立分配的指针引用的成员数据),那么复制它们的数组与复制POD类型数组没有任何不同,例如{{1} }。这应该是你所需要的:

int

如果您认为这样做不起作用,您需要提供一个具体的示例,说明您正在做什么以及究竟是什么导致您认为它不起作用(数据不匹配,引发CUDA运行时错误等)您提供的示例应该是完整,以便其他人可以编译,运行它,并查看您报告的任何问题。如果你在问题中发布的代码没有编译,那就不是MCVE(我的意见,这会影响我的投票模式。)