【问题标题】:Concurrent Access Sparse Matrix in JavaJava中的并发访问稀疏矩阵
【发布时间】:2011-05-31 20:03:00
【问题描述】:

我正在寻找一个 Java 中的矩阵/线性代数库,它提供了一个可以从不同线程同时写入的稀疏矩阵。我遇到的大多数库要么根本不提供稀疏矩阵,要么 1.) 使用开放寻址的哈希映射支持它们,或者 2.) 然后以 CSR 或 CSC 格式存储,这根本不适合多线程建造。现在我正在使用并发哈希映射并行收集条目,并从单个线程填充稀疏矩阵,但这似乎是一种资源浪费(存储并发哈希映射的空间,以及实质上填充的时间)矩阵两次)。

【问题讨论】:

标签: java concurrency linear-algebra sparse-matrix


【解决方案1】:

您不能只是神奇地使稀疏矩阵代数例程可伸缩地并行。解决这些问题涉及一些最复杂的数值分析算法,并且仍然是深入研究的主题。

你没有说你想用这些矩阵做什么,但我想你想要解决线性方程组的问题。如果您想要并行,那么您将需要一个 3rd 方库、非常大的矩阵,并且可能需要一些钱。

组装稀疏矩阵最常见的方法是以三元组格式组装它们并转换为压缩的行或列格式。组装可能很昂贵,但很容易并行进行。只需让每个线程都有自己的三元组列表,然后在转换为压缩格式之前将它们拼接在一起。

【讨论】:

  • 嗨,大卫,感谢您的回复。我实际上不想用矩阵求解线性系统。但是,我确实需要计算矩阵向量积。但是,我从您的回复中得知,同时构建稀疏矩阵更像是“自己动手”类型的事情?
  • 矩阵向量积可以并行运行,但您需要大矩阵才能使其值得。当然,该操作不需要压缩存储,但它可能仍然更有效。您目前如何构建矩阵?你用三胞胎吗?
  • 现在我正在使用 Apache Commons Math 稀疏矩阵实现。它是我上面提到的一个不是线程安全的,并且由哈希映射支持。我目前通过将所有条目放入 ConcurrentHashMap 来构建矩阵,然后在单个线程中按顺序从这个哈希映射构建矩阵。我想我需要一个矩阵类,我可以将一个已经构建的三元组列表交给它,或者它本质上是线程安全的。
  • 它们的尺寸范围从小(~10,000 x 10,000)到中等(~100,000 x 100,000)——未来可能会更大。它们的密度往往在 1% 左右。
  • 如果你只是将矩阵乘以一些东西,你不需要它是线程安全的。您可以将问题拆分为并行任务,并且在将任务结果放在一起时要小心。您还必须注意所有任务都以完全相同的矩阵开始。
【解决方案2】:

我记得parallel colt 中的矩阵是线程安全的。该库是 colt 的多线程版本。

【讨论】:

  • 看起来,虽然一些操作矩阵操作在“并行colt”中是并行化的,但实际的稀疏矩阵实现与colt的实现大体相同。这意味着它使用相同的后端存储,这不是线程安全的写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2017-12-05
  • 2021-08-03
  • 1970-01-01
  • 2016-02-03
  • 2021-12-30
相关资源
最近更新 更多