我想知道分配主机和设备可访问的结构的最佳方法是什么。以下面的结构为例:
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));
但是,我想知道是否有更有效的方法,例如在统一内存中自动处理深层复制的方式。
答案 0 :(得分:2)
以下是从上述评论中提取的问题的简短回答。
似乎该方法的基本思想是正确的,首先是为结构分配零拷贝内存,然后为每个指针成员分配零拷贝内存。
但是,在这种情况下,index
不应该是指针,因为my_buff
已经可以访问GPU并且index
作为指针会花费更多的全局内存访问。一般来说,指针追逐方案并不是GPU使用的最佳选择,通常的建议是扁平化这种结构,有效地从AoS转换为SoA方法。