所以我遇到了一个让我陷入困境一段时间的问题。我使用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,包括麦龙洞的第二次更改,并提供了完整的示例。
答案 0 :(得分:1)
如果Static_Box
不包含指针(由需要独立分配的指针引用的成员数据),那么复制它们的数组与复制POD类型数组没有任何不同,例如{{1} }。这应该是你所需要的:
int
如果您认为这样做不起作用,您需要提供一个具体的示例,说明您正在做什么以及究竟是什么导致您认为它不起作用(数据不匹配,引发CUDA运行时错误等)您提供的示例应该是完整,以便其他人可以编译,运行它,并查看您报告的任何问题。如果你在问题中发布的代码没有编译,那就不是MCVE(我的意见,这会影响我的投票模式。)