1

如何传输定义为类似于数组“A”的(一种)多维数组(即

int********* A;

) 有效地将 C 中的多维数组转换为单维到 CUDA GPU?谢谢!

4

1 回答 1

4

既然你已经编辑了你的问题,我将编辑我的回复。这样的数组 (* *******A) 很难创建。它需要带有 malloc 的嵌套循环,其中嵌套级别等于数组维数。话虽如此,响应类似于我已经在下面发布的内容。要么您有一组并行的嵌套循环,这些循环正在执行 cudaMalloc 和 cudaMemcpy,要么您将整个事情线性化并一步转移。对于二维数组,我可能会考虑建议任何一种方法。对于 N 维数组,第一种方法简直是疯了,如这一系列 SO 问题所示. 因此,我认为在尝试将其传输到设备之前,您当然应该线性化一个大维可变行数组。您提到的上一个问题中询问了线性化方法,这超出了我在这里回答的范围。线性化后,传输操作很简单,可以通过单个 cudaMalloc/cudaMemcpy 操作完成。


大概您指的是各个行具有不同大小的数组(因此是独立分配的)。我认为你有两个选择:

  1. 使用相应的 cudaMalloc(对于每一行 malloc)和一个 cudaMemcpy(对于每个 cudaMalloc)独立传输行。
  2. 合并(打包)主机内存中的行,以创建一个连续块,该块是整个数据集的大小(行大小的总和)。然后,使用单个 cudaMemcpy,一步将这个“打包”数组传输到设备。从传输效率的角度来看,这将是最有效的。

无论哪种情况,您都必须仔细考虑访问机制,以使阵列在 GPU 上方便地可用。第一种方法在这方面可能更容易,因为您将自动为每一行提供指针。对于第二种方法,您可能需要在设备上创建一组指针以匹配主机上的行指针。除此之外,您在设备上的访问机制应该类似于主机,因为两者都将使用一组行指针来访问您的数组。

相反,如果您指的是普通的多维数组(a[dim1][dim2][dim3]...),这很简单,因为它在内存中已经是连续的并且可以通过单个指针访问。如果您将原始的可变行数组重新制作为一个普通的多维数组,其列数等于最长的行(因此在其他行中保留一些未使用的元素),您可以利用这种技术来代替。这将有一些低效率,因为您正在传输未使用的元素,但访问数组会很简单。

如果您有真正的稀疏矩阵,您可能还需要考虑稀疏矩阵表示方法。 cusp将是在 GPU 上处理和操作这些的一种方法。

这个答案可能也很有趣。

于 2012-10-23T18:35:05.380 回答