CUDA中多维数组的结构

问题描述 投票:0回答:1

我在使用大型结构的内核中遇到了一些问题,包括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挂起程序。当然,xy小于数组大小。但是,其他在map_a中使用相同结构编写的内核也可以正常工作。我怀疑多维数组中发生了错误的内存访问。因此,如果有人可以帮助我对CUDA中的结构中的多维数组分配有一些疑问,那就太好了:

  1. 如CUDA编程指南中所建议,函数cudaMallocPitch()应用于分配数组,同时保证当数组大小与扭曲大小不匹配时需要填充。是否可以使用cudaMalloc(&my_struct, sizeof(my_struct));正确分配此结构?即cudaMallocPitch()是否在内部用于确保数组填充?

  2. 我怀疑第一个问题的答案是'否',我如何在使用cudaMallocPitch()的同时正确地在设备中分配多维数组的结构?以及如何在该结构的主机和设备之间正确创建cudaMemcpy()

  3. 在stackoverflow中有关2D数组问题的一些答案建议使用数组展平。我已经尝试过了,使用它们也没有问题。这是在CUDA中正确使用多维数组结构的唯一解决方案吗?

另一个解决方案是使用单独的数组而不是结构,但是我有大量的数组必须传递给内核。我希望有人能解决这个问题。

非常感谢您的帮助!

arrays multidimensional-array struct cuda
1个回答
0
投票
  1. 如CUDA编程指南中所建议,应使用函数cudaMallocPitch()分配数组,同时保证当数组大小与扭曲大小不匹配时需要填充。

这不是填充的目的。它主要用于诸如纹理单元缓存行大小之类的硬件限制。对于常规分配来说是不必要的,并且您的用例不需要它。

是否将cudaMalloc(&my_struct, sizeof(my_struct));正确分配给此结构?

cudaMallocPitch()是否在内部用于确保阵列填充?

没有这两件事彼此无关。这些API对您仅分配其大小的结构一无所知。所有内部存储器的布局和对齐方式均由编译器决定。

  1. [我怀疑第一个问题的答案是'否',当我使用cudaMallocPitch()时如何在设备中正确分配多维数组的结构?以及如何正确在该结构的主机和设备之间创建一个cudaMemcpy()

你不能。在任何情况下都不会。结构的布局由编译器静态定义。推销的API可能没有任何帮助。

  1. stackoverflow中有关2D数组问题的一些答案建议使用数组展平。我已经尝试过了,使用没有问题他们。这是正确使用结构的唯一解决方案CUDA中的多维数组?

同样,这与您的实际问题完全无关。数组展平与用例有关,例如使用指针数组和嵌套向量等定义的多维数组。它与您显示的代码中的任何内容都没有关系。

© www.soinside.com 2019 - 2024. All rights reserved.