【问题标题】:Java matrix multiplication: threaded slow than non-threaded in the case of little columns [closed]Java矩阵乘法:在小列的情况下,线程比非线程慢[关闭]
【发布时间】:2018-12-30 01:37:48
【问题描述】:

我正在测试一个带有线程(根据系统内核数量)和非线程选项的 Java 点积程序。 (非常简单的)算法将第一个(比如 A)矩阵划分为与核心一样多的矩阵,并与完整的 B 矩阵执行点积。完成此操作后,将收集“块”以获得结果矩阵。当行和列的数量级相对较高(例如 20000 行和 20000 列)时,线程选项按预期工作,速度比标准四核系统的非线程选项快 3.3-3.5 倍。

但是对于第一个矩阵中的少量列(例如,A[20000][20] 乘以 B[20][20000]),线程和非线程选项的速度大致相等。对于较少的列,线程条件下的执行时间明显优于非线程选项下的执行时间。这个“平等边界”因行数而异。

我了解小矩阵的重载线程系统的问题,但我无法完全理解仅在少量列(第一个矩阵因子中的列,第二个矩阵因子中的行)下的这种情况。如果问题与小矩阵的性质相同,是否存在行列之间的比例,允许根据情况选择线程或非线程算法?

【问题讨论】:

  • 当您询问您的代码问题时,您应该发布minimal reproducible example
  • 感谢您的评论,欧文。我会记下未来的问题。

标签: java multithreading matrix matrix-multiplication


【解决方案1】:

生成一个新线程总是会花费(大致恒定的)计算时间,并且在您的程序可以从中受益之前,每个线程的工作必须花费比这个开销更长的时间。 我不知道您的代码(请在将来发布最少的示例,就像建议的评论一样),但您可以查看每个线程在相等的计算时间评估的计算数量(乘法+加法)。基于此,您应该能够近似矩阵的大小(可能与边长 = 元素数的乘积成正比),其中多线程值得麻烦。

【讨论】:

  • 非常感谢您的评论和您的时间。我的问题是概念性的而不是实际的(为此向所有人道歉),但是您的回答为我提供了继续调查每个线程的操作数(多和加)的线索。当然,元素数量和线程效率之间存在直接关系,但是当我们在第一个因素中发现少量列时,我们会处理大量乘法和少量加法,更不用说非常不同的输出导致产品矩阵大小。再次感谢。
  • @A.Isasa 建议你复用一个线程池比如Stream.parallel()使用的线程池
  • @PeterLawrey 谢谢,彼得。我正在尝试使用线程的更“经典”解决方案,但我将有机会将 Stream API 作为更新的(嗯,Java 8,随着时间的推移......)解决方案。非常感谢!
  • @A.Isasa 我发现 IntStream.range(0, a.length).parallel().etc 非常有用。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多