在CUDA中声明和初始化数组的数组

PL

我正在尝试声明和初始化CUDA中的数组数组。我正在使用以下代码:

int** h_array = (int**)malloc(num_of_arrays * sizeof(int*));
int** d_array;
cudaMallocHost((void**)&d_array, num_of_arrays * sizeof(int*));

for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMallocHost(&h_array[i], array_size * sizeof(int));
}
for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMemcpy(d_array[i], h_array[i], array_size * sizeof(int), cudaMemcpyHostToDevice);
}

int** h_array2 = (int**)malloc(num_of_arrays * sizeof(int*));

请注意,h_array2已正确初始化(它是一个数组数组,每个数组均已正确初始化)。然后,我尝试执行以下操作:

for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMemcpy(d_array[i], h_arra2[i], array_size * sizeof(int), cudaMemcpyHostToDevice);
}

总而言之,我尝试声明并初始化设备内存中的数组数组。我知道我无法从主机内存访问设备内存。

上面的代码似乎不起作用。

您能告诉我哪里出了问题并帮助我吗?先感谢您。

罗伯特·克罗维拉

这样的事情应该起作用:

// create intermediate host array for storage of device row-pointers
int** h_array = (int**)malloc(num_of_arrays * sizeof(int*));
// create top-level device array pointer
int** d_array;
cudaMalloc((void**)&d_array, num_of_arrays * sizeof(int*));
// allocate each device row-pointer, then copy host data to it
for(size_t i = 0 ; i < num_of_arrays ; i++){
    cudaMalloc(&h_array[i], array_size * sizeof(int));
    cudaMemcpy(h_array[i], h_array2[i], array_size * sizeof(int), cudaMemcpyHostToDevice);
}
// fixup top level device array pointer to point to array of device row-pointers
cudaMemcpy(d_array, h_array, num_of_arrays * sizeof(int*), cudaMemcpyHostToDevice);

是讨论各种2D和3D阵列分配方法的问题/答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章