【问题标题】:How can solve SVD from row-major matrix using cusolver gesvd function如何使用 cusolver gesvd 函数从行主矩阵求解 SVD
【发布时间】:2016-11-07 02:32:54
【问题描述】:

我是 cuda 的初学者。我想尝试使用 cusolver API 为行主矩阵求解 svd。但我对矩阵 A 的前导维度感到困惑。

我有一个 100x10 的行主矩阵。(例如,我在 10 维空间中有 100 个数据。) 作为 CUDA 文档,cusolverDnDgesvd 函数需要 lda 参数(矩阵 A 的前导维度)。我的矩阵是行优先的,所以我给了 cusolver gesvd 函数 10。但功能不起作用。此函数表明我的 lda 参数错误。 好的,我给了 cusolver gesvd 函数 100。函数正在运行,但函数 (U, S, Vt) 的结果似乎是错误的。我的意思是,我无法从 USVt 中得到矩阵 A。

据我所知,cuSolver API 假设所有矩阵都是列优先的。 如果我将矩阵更改为列优先,则 m 低于 n(10x100)。但是 gesvd 函数只适用于 m >= n。

是的,我遇到了麻烦。我该如何解决这个问题?

【问题讨论】:

    标签: cuda svd


    【解决方案1】:

    Row-major、col-major 和leading dimension 是与存储相关的概念。矩阵可以存储在任一方案中,同时表示相同的数学矩阵。

    要获得正确的结果,您可以在调用 cusolver 之前使用cublasDgeam() 将行优先的 100x10 矩阵更改为列优先的 100x10 矩阵,这相当于在保持存储顺序的同时进行矩阵转置。

    关于存储排序的消息来源很多,

    https://en.wikipedia.org/wiki/Row-major_order

    https://fgiesen.wordpress.com/2012/02/12/row-major-vs-column-major-row-vectors-vs-column-vectors/

    https://eigen.tuxfamily.org/dox-devel/group__TopicStorageOrders.html

    Confusion between C++ and OpenGL matrix order (row-major vs column-major)

    以及领先的维度

    http://www.ibm.com/support/knowledgecenter/SSFHY8_5.3.0/com.ibm.cluster.essl.v5r3.essl100.doc/am5gr_leaddi.htm

    你应该用谷歌搜索它们。

    【讨论】:

    • 感谢您的评论。
    • 其实我只是用转置解决了这个问题。我知道 cuBLAS API 假设所有输入/输出矩阵都是列主要的。所以我使用转置将行主矩阵(100x10)更改为列主矩阵(10x100)。我只是将列主矩阵提供给 gesvd 函数,但是我从行主矩阵中提供了其他参数,例如 m、n、lda、ldu、ldvt。我的意思是,只需将 100 输入 m,10 输入 n,A 被转置为行主矩阵,100 输入 lda,100 输入 ldu,10 输入 ldvt。功能运行良好。我可以从 U * S * Vt 得到一个原点矩阵 A。当然,来自 gesvd 的 U、Vt 矩阵也是列优先的。
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2019-02-28
    • 2020-11-06
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多