我改变了方法,将方法1中的主机内存分配给方法2,如下面的代码所示。代码可以编译和运行,没有任何错误。 我只是想知道使用方法2为指针指针分配内存是一种正确的方法还是任何副作用。
#define TESTSIZE 10
#define DIGITSIZE 5
//Method 1
int **ra;
ra = (int**)malloc(TESTSIZE * sizeof(int));
for(int i = 0; i < TESTSIZE; i++){
ra[i] = (int *)malloc(DIGITSIZE * sizeof(int));
}
//Method 2
int **ra;
cudaMallocHost((void**)&ra, TESTSIZE * sizeof(int));
for(int i = 0; i < TESTSIZE; i++){
cudaMallocHost((void**)&ra[i], DIGITSIZE * sizeof(int));
}
答案 0 :(得分:1)
他们两个都很好。但是,cudaMallocHost
和malloc
之间存在差异。原因是cudaMallocHost
分配固定内存,因此操作系统执行与malloc
类似的操作以及一些额外的功能来固定页面。这意味着cudaMallocHost
通常需要更长时间。
话虽这么说,如果您反复想要cudaMemcpy
来自单个缓冲区,那么cudaMallocHost
可能会从长远来看受益,因为它可以更快地从固定内存传输数据。
此外,您必需使用固定内存与streams
重叠数据传输/计算。