我正在研究一个项目,我有一个包含指针的结构。当我使用cudaMalloc()并将结构复制到设备内存时,似乎它不会复制主机内存中指针所指向的内容,这是很明显的。我在这里发了几篇文章,人们建议复制整个struct的内容。
我的问题是,如果我使用cudaMallocHost(),我是否可以访问驻留在主机内存中的struct中的指针。
请原谅我,如果这个问题听起来很愚蠢,我对CUDA编程很陌生。
编辑:我正在进行人脸识别,我想将图像传递给设备内存。这些是我正在使用的一些结构
typedef struct {
char *name;
int rows, cols;
int *data;
} IMAGE;
typedef struct
{
int n;
IMAGE **list;
} IMAGELIST;
我试图这样做,这显然是错误的。
IMAGELIST *d_ptr;
cudaMalloc((void **) &d_ptr, sizeof(IMAGELIST));
这样的方法会让我访问struct IMAGELIST中的“list”吗?
IMAGELIST *d_ptr;
cudaMallocHost((void **)&d_ptr, sizeof(IMAGELIST));
答案 0 :(得分:1)
似乎您可能不太熟悉一些相当重要的概念,如主机/设备内存空间,寻址,页面锁定内存等,因此您可能会更好地理解基础知识(CUDA programming guide是一个不错的起点)。
您似乎想要做的是构建一个在主机上具有指针字段并将其传输到GPU的结构。虽然您可以将结构直接传递给内核,但指针指向的内存显然不会被复制。这是一个被称为deep-copying的问题,在这种情况下,使用当前的CUDA,可以在依赖unified memory features introduced in CUDA 6.0时由CUDA运行时手动或自动完成(特别参见“消除深度拷贝”) “例子)。现在,您需要注意,除非复制的数据足够大并且有足够的计算来隐藏延迟,否则依赖自动副本会导致性能非常差。
虽然你说你想要使用你展示的那些数据结构,但我想鼓励你考虑“扁平化”数据结构,而不是像动态分配的结构域和链表那样常用的指针 - 重型数据结构,在可能和合理的情况下,考虑使用固定大小的数组(例如char name[MAX_NAME_LEN]
)或至少在数组中连续存储(您可以使用缓冲分配,它可以帮助避免在某些情况下频繁的重新分配)。这些可以使主机设备数据混洗代码相当简单。
您询问是否在主机上访问了使用cudaMallocHost()
分配的内存。答案是肯定的,但我强烈建议您仔细阅读what page-locked memory is and how is it used。