MPJ Java多核配置还是共享内存?

时间:2014-12-08 22:23:13

标签: java mpi mpj-express

我正在使用MPJ Express开展项目。 我在这里读到: http://www.researchgate.net/profile/Bryan_Carpenter/publication/221302919_Multicore-enabling_the_MPJ_express_messaging_library/links/02bfe510be4ddbd5d0000000

对于这样的代码:

import mpi.MPI;

public class NumberOfProcesses {

    static int sharedVar = 0;

public static void main(String[] args) throws Exception{

    MPI.Init(args);
    int rank = MPI.COMM_WORLD.Rank();
    sharedVar++;
    System.out.println("Proc <"+rank+">: sharedVar = <"+sharedVar+">");
    MPI.Finalize();
    }
    }



 If we execute the code in the cluster configuration, we observe
    the following output:
    Proc <0>: sharedVar = <1>
    Proc <1>: sharedVar = <1>
    This is the correct and desired output. Here the HelloBug class
    is executed by two MPJ processes in a SPMD fashion. Both of these
    processes execute in a separate JVM and thus do not share the static
    variable sharedVar—for this reason both processes increment the
    variable first and print 1. This execution model is also depicted in
    the Figure 10a.
    On the other hand, when the code is executed in the multicore
    configuration, the following output is observed:
    Proc <0>: sharedVar = <1>
    Proc <1>: sharedVar = <2>

我找不到以多核配置运行程序的任何方法。 虽然它似乎在多核配置中运行,但它总是在输出上给我这样的结果:

MPJ Express (0.43) is started in the multicore configuration
Proc <2>: sharedVar = <1>
Proc <1>: sharedVar = <1>
Proc <3>: sharedVar = <1>
Proc <0>: sharedVar = <1>

如何使这段代码在输出上给出如下: MPJ Express(0.43)以多核配置启动

Proc <2>: sharedVar = <1>
Proc <1>: sharedVar = <2>
Proc <3>: sharedVar = <3>
Proc <0>: sharedVar = <4>

1 个答案:

答案 0 :(得分:1)

您在两种情况下提供的输出,即群集模式和多核模式都是正确的。 MPJ Express遵循mpiJava标准,即使通信进程在同一物理机器上,也使用消息传递强制进行通信。因此,在MPJ Express多核配置中,进程将使用共享内存机制进行消息传递,并且进程之间不能共享任何内容。想象一下, java进程的x号(np = x)在同一节点上启动,这些进程不能共享其他变量(静态或非静态)。如果你想在这些java进程中共享一些变量或数据,那么只有选项通过消息传递进行通信

多核配置和共享内存是彼此的同义词,实际上,在多核配置中,进程之间的通信是通过共享内存而不是使用网络接口卡(NIC)来实现的,以便获得更好的带宽。