我在使用大型结构的内核中遇到了一些问题,包括1D,2D和3D数组,例如以下示例:
typedef struct {
float data[N];
int map_a[N][M];
int map_b[N][M];
int map_c[B][N][M];
...
} my_struct;
[当我使用这样的结构时,会执行以下操作:my_struct->map_dbx][y] = value
挂起程序。当然,x
和y
小于数组大小。但是,其他在map_a
中使用相同结构编写的内核也可以正常工作。我怀疑多维数组中发生了错误的内存访问。因此,如果有人可以帮助我对CUDA中的结构中的多维数组分配有一些疑问,那就太好了:
如CUDA编程指南中所建议,函数cudaMallocPitch()
应用于分配数组,同时保证当数组大小与扭曲大小不匹配时需要填充。是否可以使用cudaMalloc(&my_struct, sizeof(my_struct));
正确分配此结构?即cudaMallocPitch()
是否在内部用于确保数组填充?
我怀疑第一个问题的答案是'否',我如何在使用cudaMallocPitch()
的同时正确地在设备中分配多维数组的结构?以及如何在该结构的主机和设备之间正确创建cudaMemcpy()
?
在stackoverflow中有关2D数组问题的一些答案建议使用数组展平。我已经尝试过了,使用它们也没有问题。这是在CUDA中正确使用多维数组结构的唯一解决方案吗?
另一个解决方案是使用单独的数组而不是结构,但是我有大量的数组必须传递给内核。我希望有人能解决这个问题。
非常感谢您的帮助!
- 如CUDA编程指南中所建议,应使用函数cudaMallocPitch()分配数组,同时保证当数组大小与扭曲大小不匹配时需要填充。
这不是填充的目的。它主要用于诸如纹理单元缓存行大小之类的硬件限制。对于常规分配来说是不必要的,并且您的用例不需要它。
是否将
cudaMalloc(&my_struct, sizeof(my_struct));
正确分配给此结构?
是
即
cudaMallocPitch()
是否在内部用于确保阵列填充?
没有这两件事彼此无关。这些API对您仅分配其大小的结构一无所知。所有内部存储器的布局和对齐方式均由编译器决定。
- [我怀疑第一个问题的答案是'否',当我使用
cudaMallocPitch()
时如何在设备中正确分配多维数组的结构?以及如何正确在该结构的主机和设备之间创建一个cudaMemcpy()
?
你不能。在任何情况下都不会。结构的布局由编译器静态定义。推销的API可能没有任何帮助。
- stackoverflow中有关2D数组问题的一些答案建议使用数组展平。我已经尝试过了,使用没有问题他们。这是正确使用结构的唯一解决方案CUDA中的多维数组?
同样,这与您的实际问题完全无关。数组展平与用例有关,例如使用指针数组和嵌套向量等定义的多维数组。它与您显示的代码中的任何内容都没有关系。