我的故事
我在并行编程方面还是个新手(我只做过一些基本的多线程处理),现在需要将一些已有的多线程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数据类型的转换等(但我想我可以做到这一步)。
然而,真正的问题是,这种解决问题的方法让工作分配非常不平衡,因为它没有考虑某个迭代需要多少工作量。这可能会导致一些麻烦,因为有些迭代可以在不到1秒钟内完成,而其他一些则可能需要几分钟。
我的问题
是否有一种类似于MPI实现中多线程版本的方法?起初,我认为它只是大量的非阻塞点对点通信,但我不知道如何使其工作。我还考虑使用scatter功能,但我对如何正确使用它有太多困扰。
请问有谁可以帮助我澄清一下这个问题吗?
(我确实了解基本的C等)
提前感谢!