MPJ/集群配置无法在另一个线程上接收来自自身的消息

MPJ / Cluster configuration can't receive messages from self on another thread

我正在使用 MPJ 构建一个简单的分布式应用程序(基本上是另一个 producer/consumer 问题),并且在使用多线程时从同一台机器接收数据时遇到很大的问题。

示例代码:

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        int[] buf = new int[2];
        MPI.COMM_WORLD.Recv(buf, 0, 2, MPI.INT, MPI.ANY_SOURCE, 1);
        System.out.println("Got: " + buf[0]);
    }
});
t.start();
Thread.sleep(100);
MPI.COMM_WORLD.Isend(new int[] {1,0}, 0, 2, MPI.INT, MPI.COMM_WORLD.Rank(), 1);
Thread.sleep(100);
t.join();

想法很简单:一个线程侦听所有机器并接受来自 a) 不同机器(这工作正常)b) 同一台机器上的不同线程的请求 - 这仅适用于多核模式。

有没有办法让这个在集群配置中工作?

如果这不可能,是否至少有一种方法可以在某些事件(终止检测)后正确退出侦听器线程而不用忙于轮询? (Request.Cancel 显然没有在 v0.43 -_- 中实现)

谢谢

你可以试试 MPJ Express "Hyrid device"

混合设备适用于计划在此类多核计算机集群上执行并行 Java 应用程序的用户。混合设备透明地使用多核配置和集群配置 用于节点内通信和集群配置(仅限 NIO 设备) 节点间通信,分别

用法:mpjrun.sh -np 4 -dev hybdev HelloWorld