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

时间:2016-03-23 16:48:07

标签: cuda

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

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));

但是,我想知道是否有更有效的方法,例如在统一内存中自动处理深层复制的方式。

1 个答案:

答案 0 :(得分:2)

以下是从上述评论中提取的问题的简短回答。

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

但是,在这种情况下,index不应该是指针,因为my_buff已经可以访问GPU并且index作为指针会花费更多的全局内存访问。一般来说,指针追逐方案并不是GPU使用的最佳选择,通常的建议是扁平化这种结构,有效地从AoS转换为SoA方法。