gpt4 book ai didi

c++ - 在传输到 CUDA GPU 时保持主机数据完好无损

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:14 28 4
gpt4 key购买 nike

所以我遇到了一个让我卡住了一段时间的问题。我正在使用 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));
}
}

我在这里搜索了很长时间,从 Robert Crovella 那里找到了一些有用的信息,并利用他的技巧取得了一些进展,但他给出的答案与我的问题并不完全相关。 有没有人有在传输到 GPU 时保持主机数据完整的解决方案?

非常感谢您的帮助!

编辑,包括对来自麦龙洞的第一个 cudaMalloc 的更改

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

最佳答案

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

#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 运行时错误等)您提供的示例应该完整,以便其他人可以编译、运行它并查看您报告的任何问题。如果您在问题中发布的代码无法编译,则它不是 MCVE (我的意见,影响我的投票模式。)

关于c++ - 在传输到 CUDA GPU 时保持主机数据完好无损,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31821749/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com