有效地将多维数组传输到CUDA GPU

时间:2012-10-23 18:01:11

标签: cuda gpu gpgpu

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

int********* A;
({3}}对CUDA GPU有效吗?谢谢!

1 个答案:

答案 0 :(得分:3)

由于您已对问题进行了编辑,因此我会修改自己的回复。这样的数组(* ******* A)很难创建。它需要带有malloc的嵌套循环,其中嵌套级别等于数组维度。话虽如此,回复与我在下面发布的内容类似。要么你有一组并行的嵌套循环,它们一直在做cudaMalloc和cudaMemcpy,否则你将整个事物线性化并一步转移。对于二维数组,我可以考虑建议任何一种方法。对于N维数组,第一种方法就是疯狂,如this sequence of SO questions所示。因此,我认为在尝试将其传输到设备之前,您当然应该将大型变量行数组线性化。线性化的方法在您之前提到的问题中提出,并且在我的答案范围之外。线性化后,传输操作很简单,可以使用单个cudaMalloc / cudaMemcpy操作完成。


据推测,您指的是各行具有不同大小的数组(因此独立地为malloc)。我认为你有两个选择:

  1. 使用相应的cudaMalloc(for。)独立传输行 每一行malloc)和一个cudaMemcpy(对于每个cudaMalloc)。
  2. 在主机内存中合并(打包)行,以便创建一个连续的行 块是整个数据集的大小(行的总和 大小)。然后,使用单个cudaMemcpy,转移这个"打包" 一步到阵列的数组。从转移效率 立场,这将是最有效的。
  3. 在任何一种情况下,您都必须仔细考虑访问机制,以便在GPU上方便地使用阵列。在这方面,第一种方法可能更容易,因为您将自动为每一行指针。对于第二种方法,您可能需要在设备上创建一组指针以匹配主机上的行指针。除此之外,设备上的访问机制应该与主机类似,因为它们将使用一组行指针来访问您的阵列。

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

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