我有类似这个链接的矩阵:
https://www.dropbox.com/s/tte3rlfsrprgtt8/ExampleMatrix.txt?dl=0
此示例是一个 9x9 稀疏矩阵,其中元素的值在大小上存在显着差异。例如,最小元素的大小为 7.130249e-17,最大元素的大小为 1.944061e-07。
该矩阵是我需要求解的一组线性方程 Ax=b 中的 A 矩阵。在我的应用程序中 A 是 cuDoubleComplex 类型。
目前,我使用 magma_zgesv_batched (一次计算多个(当前 25 个),每个批次的 A 和 B 不同)执行此操作,它通过部分旋转和行交换进行 LU 分解。这有效并提供了与我试图加速的原始代码的输出相匹配的正确输出。我有信心这行得通。
然而,在“现实生活”中,我需要解决的矩阵会更大,~2000*2000 并且 magma_zgesv_batched 存在问题,因为它被设计用于小矩阵。它非常慢,并且会警告使用本机版本。我所做的搜索表明人们已经使用 magma_zgesv_batched 达到了 1024*1024 的矩阵大小,但我自己还没有对此进行测试。
由于矩阵 A 是稀疏的(并且随着大小的增加将变得更加稀疏),我研究了使用 cuSovlerSp 例程,特别是 cusolverSpZcsrlsvluHost(具有部分旋转的传统 LU),因为它与 magma_zgesv_batched 最相似。
但是,这并没有像 magma_zgesv_batched 一样给出正确的结果。但同样,我有信心我已经用 csr 格式等正确地编码了问题。我已经测试了一个虚拟矩阵,其“正常”(1 阶)数字与上面的 9*9 矩阵位于相同的位置,并运行等效的 Matlab A \b 具有相同的(密集)虚拟 A 和 b 这确实为虚拟数据提供与 cusolverSpZcsrlsvluHost 相同的输出。所以我确信这是我在大动态范围问题中所拥有的特定数据的问题。
所以我的问题是问是否有其他人在使用具有大动态范围的矩阵元素之前遇到过这样的问题,如果是这样,如何处理它们?有没有可以应用于矩阵的技巧/缩放?
magma_zgesv_batched 和 cusolverSp 例程有什么区别?他们是否以不同的方式进行矩阵求逆等?
我是否应该坚持使用 magma_zgesv_batched 来减少尺寸问题,因为我知道这可行?
非常感谢任何建议!
谢谢