【问题标题】:dynamic multi dimensional array alloc on gpugpu上的动态多维数组分配
【发布时间】:2012-07-20 22:22:43
【问题描述】:

我可以在 GPU 上为静态多维数组分配内存 (cudaMalloc),声明如下int b[size1][size2][size3][size4][size5]...;。如何为 GPU 上的动态数组分配内存(cudaMalloc),例如int ***a;(我们也可以假设更高的维度),其中a 的所有大小都不同?假设 a 已在 CPU 端分配其维度的大小。简单的例子将不胜感激,谢谢!

【问题讨论】:

  • cudaMalloc 不分配静态数组(它总是并专门分配动态内存)。不要将静态对象与静态已知的数组大小混淆。

标签: c cuda


【解决方案1】:

使用cudaMalloc 动态分配内存。对于高维数组,只需计算总的展平大小并大步访问数组:

void * p;
cudaError_t e = cudaMalloc(&p, dim1 * dim2 * dim3 /* ... */);
if (e != cudaSuccess) { /* error! */ }

// Access
int * arr = p;
arr[i1 * dim2 * dim3 + i2 * dim3 + i3] = 2; // etc., in strides

(对于 2 维或 3 维数组,您可能还想使用cudaMalloc3DArray。)

还有一个对应的主机版本cudaMallocHost,它分配设备可直接访问的页面锁定主机内存。

【讨论】:

  • 我可以分配一维数组,但是多维数组呢,例如“int ***v”甚至更高的“int ****v”。谢谢!
  • @starter:自己计算大小并大步访问数组。我添加了一个示例。
猜你喜欢
  • 2017-03-18
  • 2020-04-24
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2013-04-02
  • 2012-10-07
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多