分散和聚集在 MP J Express 中的工作原理

Posted

技术标签:

【中文标题】分散和聚集在 MP J Express 中的工作原理【英文标题】:How Scatter and Gather works in MP J Express 【发布时间】:2015-06-01 23:48:38 【问题描述】:

我要为我的项目创建一个新的集群 api。所以这几天我开始学习MP J Express。我只是用这种方式使用Scatter和Gather编写程序。但我得到空点异常。不知道什么时候出错?

这是我的代码

    import mpi.MPI;

    public class ScatterGather 
        public static void main(String args[])
        MPI.Init(args);
        int rank = MPI.COMM_WORLD.Rank();
        int size = MPI.COMM_WORLD.Size();
        int unitSize=4,root=0;
        int sendbuf[]=null;
        if(rank==root)
          sendbuf= new int[unitSize*size];
        
        int recvbuf[] = new int[unitSize];
      MPI.COMM_WORLD.Scatter(sendbuf,0,unitSize,MPI.INT,recvbuf,0,unitSize,MPI.INT,root);
        if(rank!=root)
            for(int i=0;i<unitSize;i++)
               recvbuf[i]=rank;
            
        
      MPI.COMM_WORLD.Gather(recvbuf,0,unitSize,MPI.INT,sendbuf,0,unitSize,MPI.INT,root);
        if(rank==root)
           for(int i=0;i<unitSize;i++)
                System.out.println(sendbuf[i]+ " ");
           
        
        MPI.Finalize();
     

这是错误日志

MPJ Express (0.43) is started in the multicore configuration
mpi.MPIException: java.lang.NullPointerException
at mpi.SimplePackerInt.unpack(SimplePackerInt.java:112)
at mpi.Comm.recv(Comm.java:1499)
at mpi.PureIntracomm.MST_Scatter(PureIntracomm.java:1102)
at mpi.PureIntracomm.Scatter(PureIntracomm.java:1066)
at mpi.Intracomm.Scatter(Intracomm.java:420)
at ScatterGather.main(ScatterGather.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)... 

【问题讨论】:

【参考方案1】:

尝试为每个进程初始化sendbuf= new int[unitSize*size];。删除if(rank==root) 条件,看看它是否有效。

Scatter 发现 sendbuf 数组是 null,这就是它抛出 NullPointerException 的原因

【讨论】:

【参考方案2】:

我认为散落在未初始化的对象(int 数组)。您能否尝试将 sendbuf 初始化为一些虚拟值,然后再试一次。

【讨论】:

【参考方案3】:

代替代码

if (rank == root) 
    
        send_buffer = new int [unitsize * size];
    

只保留下一行。

send_buffer = new int [unitsize * size];

您的输出将是: MPJ Express (0.44) 在多核配置中启动

0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3

【讨论】:

以上是关于分散和聚集在 MP J Express 中的工作原理的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO中的通道Channel分散/聚集 Scatter/Gather

分散读取与聚集写入

Java-NIO:Channel聚集(gather)写入与分散(scatter)读取

分散/聚集IO(scatter/gather)及iovec结构体

重构:banner 中 logo 聚合分散动画

如何在 numpy 中进行分散和收集操作?