Cuda 在集成GPU上分配零拷贝结构

Cuda 在集成GPU上分配零拷贝结构,cuda,Cuda,我想知道分配主机和设备都可以访问的结构的最佳方法是什么。以以下结构为例: struct Buff { int * index; Chunk * chunks; } 其中Chunk是数组的简单结构: struct Chunk { int sas[CHUNK_SIZE]; int das[CHUNK_SIZE]; }; 现在,我首先为结构分配零拷贝内存,然后为结构成员分配零拷贝内存,如下所示: Buff * my_buff; // Allocate zero-

我想知道分配主机和设备都可以访问的结构的最佳方法是什么。以以下结构为例:

struct Buff {
    int * index; 
    Chunk * chunks;
}
其中Chunk是数组的简单结构:

struct Chunk {
    int sas[CHUNK_SIZE];
    int das[CHUNK_SIZE];
};
现在,我首先为结构分配零拷贝内存,然后为结构成员分配零拷贝内存,如下所示:

Buff * my_buff;

// Allocate zero-copy memory for the struct (as the container)
checkCudaErrors(cudaHostAlloc(&my_buff, sizeof(Buff), cudaHostAllocMapped));

// Allocate zero-copy memory for index
checkCudaErrors(cudaHostAlloc(&my_buff->index, sizeof(int), cudaHostAllocMapped));

// Allocate zero-copy memory for the array of chunks
checkCudaErrors(cudaHostAlloc(&my_buff->chunks, sizeof(Chunk) * NUM_CHUNKS, cudaHostAllocMapped));

然而,我想知道是否有一种更有效的方法,比如在统一内存中自动处理深度拷贝的方法。

以下是我从上面的评论中摘录的问题的简短答案

该方法的基本思想似乎是正确的,即首先为结构分配零拷贝内存,然后为每个指针成员分配零拷贝内存


但是,在这种情况下,
index
不应该是指针,因为
my_buff
已经可以被GPU访问,并且将
index
作为指针将需要一次全局内存访问。一般来说,指针追踪方案对于GPU的使用不是最优的,通常的建议是将此类结构扁平化,有效地从AoS转换为SoA方法。

我相信您的方法是最好的。我假设你正在研究Tegra TK1或TX1。在这种情况下,为了获得最佳性能,您通常希望避免任何内存到内存的复制。零拷贝应该可以做到这一点。@RobertCrovella谢谢!是的,事实上,我和他们一起工作。作为后续问题:读/写my_buff->index需要多少次全局内存访问?我希望只有一个。我看不出索引作为指针有什么意义。如果
buff
已经可以被GPU访问,那么它的作用是什么?应该只有一个值可以读写该值。它实际上只是从
my\u buff
指针取消引用偏移量。但是,正如@Talonmes所指出的,
index
也是一个指针。因此,需要一次访问才能读取指针值,如果您取消引用该指针,则还需要一次访问。因此,一般来说,这些指针追踪方案对于GPU的使用不是最优的。通常的建议是扁平化这些结构,有效地将AoS转换为SoA方法。@Talonmes你说得对!但原因是cudaHostAlloc将指针指向指针作为第一个参数,所以我认为这是唯一的方法!