【问题标题】:In-Place CUDA Kernel for Rectangular Matrix Transpose用于矩形矩阵转置的就地 CUDA 内核
【发布时间】:2014-12-13 14:56:27
【问题描述】:

我已经仔细阅读了一段时间,但无法找到正确的答案:

CUDA 中是否有就地对角矩阵转置的实现?

我知道 cublas gem,但这需要创建另一个矩阵。我尝试了一个幼稚的实现:CUDA In-place Transpose Error

但是,这只适用于方阵。有人可以向我解释为什么这个逻辑对对角矩阵不起作用吗?换位的“幼稚”方法虽然有效,但还没有到位。

【问题讨论】:

  • 你的对角矩阵是正方形的,还是矩形的m x n矩阵,m != n?我认为是后者,因为方形对角矩阵是对称的,因此它们自己的转置。您能否指出一篇定义标准算法或来自基于 CPU 的参考库中的函数的论文,该参考库执行矩形对角矩阵的转置?
  • 如果您真的想在 O(1) 空间内就地执行此操作,请查看此实现:careercup.com/question?id=12339553(名为 111 的人的第四个答案)。但这对于 CUDA 来说可能不是一个好的实现。你也检查过这个:research.nvidia.com/publication/…
  • njuffa :它们是矩形的,其中 m != n。我已经尝试过天真的转置实现,可以在这里查看:github.com/parallel-forall/code-samples/blob/master/series/…
  • 谢谢 asm 。我将尝试实现该论文中的逻辑。
  • @bge0:我将论文的链接添加到答案中,以便其他人可以轻松找到它。有帮助的可以采纳

标签: c++ matrix cuda transpose


【解决方案1】:

请看以下论文:A Decomposition for In-place Matrix Transposition

就地矩阵转置的顺序算法如下(> O(n*m) 运行时间):

// in:  n rows; m cols
// out: n cols; m rows
void matrix_transpose(int *a, int n, int m) {
    int i, j;
    for(int k = 0; k < n*m; k++) {
        int idx = k;
        do { // calculate index in the original array
            idx = (idx % n) * m + (idx / n);
        } while(idx < k); // make sure we don't swap elements twice
        std::swap(a[k], a[idx]);
    }
}

【讨论】:

  • 您好 ASM,感谢您提供论文链接。这是正确的解决方案,但是 cpu 代码与问题无关。
【解决方案2】:

环顾了一会后,我发现以下 github 页面确实包含与 nvidia 研究论文相关的代码,用于就地转置:

https://github.com/BryanCatanzaro/inplace

这似乎是解决这个问题的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2012-10-30
    • 2017-04-06
    • 2017-05-30
    相关资源
    最近更新 更多