【发布时间】:2025-04-09 19:25:01
【问题描述】:
我的故事
我是并行编程的初学者(除了编写一些基本的多线程东西外,我什么也没做),我需要并行化一些多线程 java 代码以使其运行得更快。多线程算法只是生成线程并将它们传递给为我分配线程的操作系统。每个线程的结果可以由一些收集器收集,该收集器还处理信号量等同步问题,并计算所有不同线程结果的总和。多线程代码看起来像这样:
public static void main(String[] args) {
int numberOfProcesses = Integer.parseInt(args[0]);
...
Collector collector = new Collector(numberOfProcesses);
while(iterator.hasNext()) {
Object x = iterator.next();
new OverwrittenThread(x, collector, otherParameters).start();
}
if(collector.isReady())
System.out.prinltn(collector.getResult());
}
我将其转换为 MPI 的第一个想法是(我猜想)只是拆分循环并将该循环的每次迭代都交给另一个处理器的基本方法(使用 mpiJava):
public static void main(String[args]) {
...
Object[] foo = new Object[number];
int i = 0;
while(iterator.hasNext())
foo[i++] = iterator.next();
...
int myRank = MPI.COMM_WORLD.Rank();
for(int i = myRank; i < numberOfElementsFromIterator; i += myRank) {
//Perform code from OverwrittenThread on foo[i]
}
MPI.COMM_WORLD.Reduce(..., MPI.SUM, ...);
}
问题
到目前为止,这是我作为 mpi 新手的唯一方法,可以让事情顺利进行。这只是一个想法,因为我不知道如何解决实现问题,例如将 BigIntegers 转换为 MPI 数据类型等。(但我想我会做到这一点)
真正的问题是,这种解决问题的方法使工作分配非常不平衡,因为它没有考虑到某个迭代需要多少工作。这可能真的会造成一些麻烦,因为有些迭代可以在不到一秒的时间内完成,而另一些则可能需要几分钟。
我的问题
有没有办法在 MPI 实现中获得类似于多线程版本的类似方法?起初我以为它只是大量的非阻塞点对点通信,但我看不出有办法让它以这种方式工作。我也考虑过使用分散功能,但是我很难理解如何正确使用它。
谁能帮我解决这个问题,好吗?
(我确实了解基本的 C 等)
提前致谢
【问题讨论】: