1

我有一个要求,我不确定是否可以通过使用线程来满足。我有两个预定义的 100*100 矩阵,我想执行它们的乘法。我想要的是,不是简单的乘法,而是我想把它分成三个单独的程序,第一个程序将执行前 33 行的乘法,第二个程序将执行从 33 到 64 的行的乘法,第三个将执行第 64 到 100 行的乘法. 现在我想并行运行这些程序并收集它们的结果(即行的乘法),然后将这三个不同的结果连接到一个矩阵中。现在,我已经开发了三个这样的程序或类,但我无法找到任何方法来并行运行它们。在线程中,我读到我们无法确定哪个线程将首先执行,哪个线程将稍后执行。

谁能告诉我我可以使用哪种技术来解决我的问题?

我会非常感谢你们。

4

4 回答 4

2

Java 内置了这种东西。文档是http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html

创建每个对象,将其扔到线程池中,然后全部运行。

ExecutorService service = Executors.newFixedThreadPool(3);
service.submit(matrixMult1);
service.submit(matrixMult2); // the objects that do the work
service.submit(matrixMult3);

service.shutdown();
service.awaitTermination(1, TimeUnit.HOURS);

这是基本大纲。

于 2012-10-08T20:26:17.360 回答
1

对于这种情况,我会使用已经存在的库,例如 EJML ( http://code.google.com/p/efficient-java-matrix-library/ ) 或 la4j ( http://la4j.org )。图书馆很可能会更快地产生结果。您也可以改用更适合数学的其他语言,但我认为这超出了这个问题的范围。如果你坚持使用线程,因为这些都是并行运行的,无论谁先完成都无关紧要,你只需要确保它们都完成然后重新组装。

希望有帮助

于 2012-10-08T18:26:22.187 回答
1

是我在大学中用于大多数并行 Java 项目的并行 Java 库。

它是由我的并行编程教授Alan Kaminsky编写的,他很棒(一些学生也为它做出了贡献)。

下载页面上需要注意的重要事项:使用部分、文档部分和系统要求(尤其是关于 java 5 的性能如何优于 java 6 或 7 的部分)。

一个好的起点可能是edu.rit.pj.test.Test13,它执行矩阵运算。

对这个实现非常重要的一个类是edu.rit.pj.Comm,它负责线程之间的大部分数据传递。确保您阅读了此类的文档,特别注意 和 部分broadcast()gather()这应该是您首先将矩阵分发到节点,然后最终收集和组合结果的方式。

我知道,要吸收的东西很多。稍后我会尝试写一个例子。

于 2012-10-08T18:36:45.047 回答
0

我不相信 100 x 100 非常大,并且在并行完成时您不会看到大幅加速,这将是预优化的经典示例,尤其是在您的操作系统很忙的情况下。

其次,你为什么要重新发明轮子?
jblas http://mikiobraun.github.io/jblas/被认为是最快BLAS的 java 库。
另外,如果您不发布代码,我们如何告诉您代码有什么问题?

但无论如何,我会向您推荐我为完成任务而给出的答案,这些任务依赖于使用java 并发api 的其他任务的输出:Executing Dependent tasks in parallel in Java
请检查一下。
这将为您提供另一个以您描述的方式解决此问题的示例,但是我认为该方法会比使用 jblas 慢。

于 2014-09-12T09:02:24.077 回答