Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 传输到CUDA GPU时保持主机数据完整_C++_Cuda - Fatal编程技术网

C++ 传输到CUDA GPU时保持主机数据完整

C++ 传输到CUDA GPU时保持主机数据完整,c++,cuda,C++,Cuda,所以我有一个问题,让我陷入了一段时间。我正在使用NSight Eclipse版本(cuda7.0)在gt630(开普勒版本)GPU上编程 基本上,我有一个类的数组(Static_Box),我修改主机(CPU)上的数据。然后我想将数据发送到GPU进行计算,但是,我的代码没有这样做。以下是我的一些代码: #define SIZE_OF_BOX_ARRAY 3 class Edge { int x1, y1, x2, y2; } class Static_Box { Static_

所以我有一个问题,让我陷入了一段时间。我正在使用NSight Eclipse版本(cuda7.0)在gt630(开普勒版本)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));
    }
}
#定义_盒_数组3的大小
阶级边缘{
int-x1,y1,x2,y2;
}
类静态U盒{
静态_框(整数x、整数y、整数宽度、整数高度);
边缘e1、e2、e3、e4;
}
静态对话框::静态对话框(整数x,整数y,整数宽度,整数高度){
e1.x1=x;
e1.y1=y;
e1.x2=x+宽度;
e1.y2=y;
//e2.x1=x+宽度;以这种方式继续(无其他计算)
}
//现场的存储。d_*表示GPU内存
//Static_Box是我在另一个文件中定义的类,它包含
//我写的其他课程很少。
静态_盒*静态_盒;
静态_盒*d_静态_盒;
int main(int argc,字符**argv){
//创建主机数据存储
静态_盒=(静态_盒*)malloc(_盒数组的大小*sizeof(静态_盒));
//然后我在这里设置了一些静态_框的索引,这是
//我需要在CPU上写入的数据。
//例如:
静态_盒[0]=静态_盒(
//在GPU上分配内存
//CUDA_CHECK_返回来自NVIDIA的位反转示例(如果GPU出现故障,则退出应用程序)
CUDA检查返回(cudaMalloc((void**)和d_静态_盒,大小_的_盒数组*大小(静态_盒));
int j=0;
对于(;j<盒数组的大小;j++){
//根据麦陇东的建议删除了此项
//CUDA检查返回(cudaMalloc((无效**)和(静态框[j]),sizeof(静态框));
CUDA检查返回(cudaMemcpy(&(d_静态_框[j]),&(静态_框[j]),sizeof(静态_框),cudaMemcpyHostToDevice));
}
}
我在这里搜寻了很长一段时间,从Robert Crovella那里找到了一些有用的信息,并利用他的技巧取得了一些进展,但他给出的答案与我的问题不太相关。有人有办法在传输到GPU时保持主机数据完整吗?

非常感谢你的帮助

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


编辑2,包括来自Mai Longdong的第二个更改,并提供完整的示例。

如果
静态框
不包含指针(指针引用的成员数据需要独立分配),那么复制它们的数组实际上与复制POD类型的数组没有什么区别,比如
int
。这应该就是您所需要的:

#define SIZE_OF_BOX_ARRAY 3

Static_Box *static_boxes;
Static_Box *d_static_boxes;

int main(int argc, char **argv) {

    static_boxes = (Static_Box*)malloc(SIZE_OF_BOX_ARRAY*sizeof(Static_Box));
    CUDA_CHECK_RETURN(cudaMalloc((void**)&d_static_boxes, SIZE_OF_BOX_ARRAY * sizeof(Static_Box)));
    CUDA_CHECK_RETURN(cudaMemcpy(d_static_boxes, static_boxes, SIZE_OF_BOX_ARRAY*sizeof(Static_Box), cudaMemcpyHostToDevice));

如果您认为它不起作用,那么您需要给出一个具体的示例,说明您正在做什么,以及到底是什么让您相信它不起作用(数据不匹配、抛出CUDA运行时错误等)您提供的示例应该是完整的,以便其他人可以编译、运行它,并查看您报告的任何问题。如果您在问题中发布的代码未编译,则它不是(我的意见,这会影响我的投票模式)

在C++中不要使用<代码> Malc C/代码>。如果你真的需要动态分配,请使用<代码>新< /C>。但是在这个例子中你不使用,使用<代码> STD::数组< /代码>。还有你的代码> CUDAMOLC/<代码>分配<代码> siZeof(StasyBox)字节是指针的大小,这不是您想要的。最后,第二个
cudaMalloc
将其结果存储在
static\u BOX
,而不是
d\u static\u BOX
。好了,开始了。感谢您指出
sizeof(static\u BOX)
我已经将其替换为
size\u of\u BOX\u数组*sizeof(静电箱)
我刚刚尝试将第二个
cudamaloc
更改为使用
d\u static\u boxes
,但它给了我一个SIGBUS:Bus错误。我现在要从GPU复制数据,看看结果如何。感谢您的输入@MaiLongdong!这是一个想法,您不能
cudamaloc
到设备指针,我甚至不知道知道我为什么这么说,甚至不是星期一早上。第二版<代码> CUDAMOLC/完全。还有,你应该得到一本C++的书,因为你似乎很困惑基本的语义。除非<代码> StistaCox Box <代码>包含指针(你没有显示哪个定义)在第一次
Cudamaloc
之后,您就完成了。如果您的实际问题描述的程度是“我做这件事有困难”,那么写一个问题就很不清楚了,特别是当您没有提供MCVE时,这一点(我投票结束了这个问题,因为没有MCVE)如果
Static\u Box
确实包含指针,那么代码就要复杂得多。尝试在问题标题中添加“已解决”是不合适的。相反,向上投票或将其中一个答案标记为已接受,或者提供您自己的答案并接受。这就是将问题标记为“已解决”的方法顺便说一句,我删除了我的投票结果,因为你现在提供了一个近似于MCVE的东西(尽管里面仍然有不可编译的垃圾)。哇,看起来这一切都可以追溯到我认为指针是数组的实际大小。将其切换回旧的复制方式(不使用
for
循环正如您所描述的那样有效。感谢您的帮助!我将把这标记为已接受的答案。