既然你已经编辑了你的问题,我就编辑一下我的回答。这样的数组(******A)创建起来相当困难。 它需要用malloc进行嵌套循环,其中嵌套级别等于数组的维数。 说了这么多,反应和我下面已经发的类似。 要么你有一组并行的嵌套循环,在沿途做cudaMalloc和cudaMemcpy,要么你把整个过程线性化,一步到位的传输。 对于二维数组,我可能会考虑建议采用这两种方法。 对于N维数组,第一种方法简直是疯了,如图所示。这一连串的苏式题. 因此,我认为在尝试将大尺寸变排阵列转移到器件上之前,一定要对其进行线性化。 线性化的方法在你之前提到的问题中已经问过了,不在我这里的回答范围之内。 一旦线性化后,转移操作就很直接,只需要一个cudaMalloccudaMemcpy操作就可以完成。
大概你指的是单个行有不同大小的数组(因此是独立的malloc'ed)。 我想你有2个选择。
无论哪种情况,你都必须仔细考虑访问机制,以使数组在GPU上方便地使用。 在这方面,第一种方法可能比较容易,因为你将自动拥有每行的指针。 对于第二种方法,你可能需要在设备上创建一组指针来匹配你在主机上的行指针。 除此之外,你在设备上的访问机制应该和主机上的类似,因为任何一个设备都会使用一组行指针来访问你的数组。
如果你指的是普通的多维数组(a[dim1][dim2][dim3]......),那就直接了当了,因为它已经全部在内存中连续了,而且用一个指针就可以访问。 如果你把原来的变行数组改造成一个普通的多维数组,其列数等于最长的行数(因此在其他行中留下了一些未使用的元素),你可以利用这种技术来代替。 这将会有一些低效率,因为你要转移未使用的元素,但访问数组将是直接的。
如果你有真正的稀疏矩阵,你可能还想考虑稀疏矩阵表示方法。 尖点 将是一种在GPU上处理和操纵这些的方法。
这个 回答 也可能会有兴趣。