高效地将多维数组传输到CUDA GPU[封闭式]。

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

如何将一个定义类似于数组 "A "的(一种)多维数组(即

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

)的多维数组。用C语言将多维数组转换为单维数组。 到CUDA GPU有效吗?谢谢!

cuda gpu gpgpu
1个回答
4
投票

既然你已经编辑了你的问题,我就编辑一下我的回答。这样的数组(******A)创建起来相当困难。 它需要用malloc进行嵌套循环,其中嵌套级别等于数组的维数。 说了这么多,反应和我下面已经发的类似。 要么你有一组并行的嵌套循环,在沿途做cudaMalloc和cudaMemcpy,要么你把整个过程线性化,一步到位的传输。 对于二维数组,我可能会考虑建议采用这两种方法。 对于N维数组,第一种方法简直是疯了,如图所示。这一连串的苏式题. 因此,我认为在尝试将大尺寸变排阵列转移到器件上之前,一定要对其进行线性化。 线性化的方法在你之前提到的问题中已经问过了,不在我这里的回答范围之内。 一旦线性化后,转移操作就很直接,只需要一个cudaMalloccudaMemcpy操作就可以完成。


大概你指的是单个行有不同大小的数组(因此是独立的malloc'ed)。 我想你有2个选择。

  1. 独立传输行,使用相应的cudaMalloc(foreach row malloc)和cudaMemcpy(for each cudaMalloc)。
  2. 将主机内存中的行进行合并(打包),从而创建一个连续的块,其大小为整个数据集的大小(行大小之和)。 然后,使用一个cudaMemcpy,将这个 "打包 "的数组一次性传输到设备上。 从传输效率的角度来看,这将是最有效的。

无论哪种情况,你都必须仔细考虑访问机制,以使数组在GPU上方便地使用。 在这方面,第一种方法可能比较容易,因为你将自动拥有每行的指针。 对于第二种方法,你可能需要在设备上创建一组指针来匹配你在主机上的行指针。 除此之外,你在设备上的访问机制应该和主机上的类似,因为任何一个设备都会使用一组行指针来访问你的数组。

如果你指的是普通的多维数组(a[dim1][dim2][dim3]......),那就直接了当了,因为它已经全部在内存中连续了,而且用一个指针就可以访问。 如果你把原来的变行数组改造成一个普通的多维数组,其列数等于最长的行数(因此在其他行中留下了一些未使用的元素),你可以利用这种技术来代替。 这将会有一些低效率,因为你要转移未使用的元素,但访问数组将是直接的。

如果你有真正的稀疏矩阵,你可能还想考虑稀疏矩阵表示方法。 尖点 将是一种在GPU上处理和操纵这些的方法。

这个 回答 也可能会有兴趣。

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