CUDA 中的固定大小 SVD 和求解器(在设备中)

问题描述 投票:0回答:3

我在 GPU (CUDA) 上实现了一个程序,它仅使用主机(C++)来启动新内核。在设备上计算期间,我需要固定大小的 3x3(密集)矩阵的SVD求解系统

我有自己的 SVD 和求解器实现,但它不是数值稳定的(因此不可用)。由于我对 C++ 和 CUDA 比较陌生,所以我更喜欢使用库。 (数字的东西非常棘手)

现在我找不到那个图书馆了:

  • cuSOLVER 无法从设备调用
  • cuLA 无法从设备中调用(并且看起来已被放弃)
  • Eigen 看起来很有前途(应该可以从设备调用?),但尚不清楚 CUDA 支持的状态如何(它说是实验性的)。我发现有人说它有效,其他人则遇到编译错误?

我还希望能够使用该库进行一般矩阵运算(转置、求逆、求和、乘法等),因为我自己的实现可能效率较低且数值稳定。

关于如何实现这一目标有什么想法吗?

更新: 似乎 Eigen 支持 *、+、转置甚至特征值等基本函数,但尚不支持 SVD、逆函数等。这是在撰写本文时。

c++ matrix cuda gpgpu eigen
3个回答
1
投票

根据网站,功能子集适用于 Eigen 3.3 中的固定大小矩阵(在您的情况下为 3x3)。当前的稳定版本是 3.2.6,而 3.3 处于 alpha 版本。我不知道 CUDA 是否支持 SVD。我建议尝试一个小型 MCVE 来看看它是否有效(以及您需要的其他功能),如果可以,请在您的项目中实现它。


1
投票

我也有类似的问题;想要在内核函数中生成随机向量,这需要执行 NxN 的 cholesky/特征值分解(N<=5) covariance matrices. Since, as you noted, the MAGMA and CULA libraries are not available from the device, and there seems to be 还没有 cuSOLVER 设备 API,我自己按照 C 中的数值配方中概述的算法来实现这些。为了解决线性系统,我建议检查 cuBLAS(2 级函数),因为它提供了一些基本功能。如果你想反转矩阵,我建议 cublasmatinvBatched()。我自己没有使用过它,将在周末尝试一下,但从描述来看,它听起来很有希望。希望其他人能够加入这个线程并提供更好的解决方案...


-1
投票

我最近也遇到了类似的问题。我是 Eigen lib 的初学者。

我需要计算 4x4 矩阵的特征值,需要从 CUDA 中的设备函数调用。但似乎无法正常工作。请问你的问题解决了吗

已经8年了,应该有一些更新来解决这个问题。

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