【问题标题】:efficiently transferring multidimensional array to CUDA GPU [closed]有效地将多维数组传输到 CUDA GPU [关闭]
【发布时间】:2023-03-23 20:35:01
【问题描述】:

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

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

) convert multidimensional array to single dimensional in C 到 CUDA GPU 是否有效?谢谢!

【问题讨论】:

  • 对不起,这是一个无意义的问题。没有人永远会以这种方式构造多维数组,而您显然没有这样做。在 Stack Overflow,您可以使用的专业知识是宝贵而有限的资源,请在浪费它之前仔细考虑,然后再问这种无聊、无意义的问题。
  • @talonmies 如果我不会遇到这种情况,我不会问任何问题。
  • @talonmies 只是对未来的建议,永远不要使用“nobody”这个词来证明某事......最好。
  • 所以你是认真地建议你有一个多维数组,分配有 8 个嵌套级别的 malloc 调用,并使用 8 指针间接 按值访问?也许我应该使用“没有人对他们在做什么甚至最微弱的想法”这个表达,而不是“没有人”。为此我深表歉意。但是如果你创建并分配了这样一个数组,那么如何展平它肯定是不言而喻的吗?

标签: cuda gpu gpgpu


【解决方案1】:

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


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

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

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

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

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

这个answer 也可能感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多