【问题标题】:Solving n linear systems efficiently高效求解 n 个线性系统
【发布时间】:2019-08-14 14:44:08
【问题描述】:

我有 n 个(非常大的)独立线性系统(Ax = b_i)。它们都有相同的 A,但 b_i 对于 (i = 1, ..., n) 是不同的。我想在 CUDA 中并行解决这 n 个系统。

我在想,在主机中对 A 进行 LU 分解然后将新的 A 复制到 GPU 的常量内存中可能是最有效的(因为即使我在设备中进行 LU,也只有一个线程应该这样做it 和其他线程将处于空闲状态。此外,常量内存更快)。有没有更好的办法?

另一个问题是,虽然所有线程都在使用相同的算法同时解决它们的系统,但它们都在同时访问相同的内存位置 (A[i]),这不是合并的。我该如何优化呢?

【问题讨论】:

  • “有没有更好的方法?” CUSOLVER 库(包括 CUDA 示例代码中描述的不太明显的设备方法)提供了处理此类问题的方法。与其担心通过编写自己的代码会产生的低级考虑(例如合并),不如研究使用库的方法。

标签: cuda gpu linear-algebra equation-solving linear-equation


【解决方案1】:

(假设 A 是一个stably-invertible n x n 矩阵。)

不要仅仅因为它似乎更好地并行化而解决更难的问题

令 B 为列为 b_1 ... b_n 的矩阵。在我们对 A 的假设下,您实际上需要为一个 n x n 变量矩阵求解方程 A X = B,即您的解是 A^{-1}B。

所以基本上你有一个矩阵求逆和一个矩阵乘法。无论您要使用什么软件和硬件,这一点都成立。对于求逆和乘法,只需使用 CUBLAS、cuSparse、cuSOLVER、ArrayFire 或任何能最快解决这些问题的方法。

我想你可以同时做这两个,但我不确定是否有优化)。

【讨论】:

  • 这在数学上是最好的误导。从来没有人执行“矩阵求逆和乘法”来求解线性系统,这也不是问题所提出的内容
  • @talonmies:求解 n 个不同的线性 nxn 线性系统必然需要 n^3 次操作(仅用于对矩阵的所有元素进行任何操作)。矩阵求逆和矩阵乘法是 n^2.37 或任何有效实施的最佳值。也不知道你所说的“数学上的误导”是什么意思——我是不是在代数上做错了什么?
  • 您假设A 是正方形且可逆的。为什么?
  • A 通常是用于求解普通线性方程组的正方形,并且我在问题中没有看到任何其他建议。非方形A 意味着系统受限或过度受限,这些是(IMO)不同的问题,通常涉及不同的解决方法,同样,问题中没有任何内容表明被问到的问题在一个这些类别中的一个。
  • @RodrigodeAzevedo:罗伯特说了什么;另外,如果 A 不可逆,则没有 A x = b 的一般解决方案。当然,它可能仍然可以解决。我将添加我的假设。
猜你喜欢
  • 2017-03-23
  • 2017-12-13
  • 1970-01-01
  • 2012-03-31
  • 2018-01-17
  • 2020-04-03
  • 2019-01-15
  • 1970-01-01
  • 2016-11-24
相关资源
最近更新 更多