Scatter 和 Gather 在 MP J Express 中的工作原理
How Scatter and Gather works in MP J Express
我要为我的项目创建一个新集群 api。所以我开始学习 MP J Express 这些 days.I 只是用这种方式使用 Scatter 和 Gather 编写了程序。但是我得到 Null point exception.No idea 哪里错了?
这是我的代码
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)...
我认为未初始化的分散对象(int 数组)。您能否尝试将 sendbuf 初始化为一些虚拟值,然后再试一次。
尝试为每个进程初始化 sendbuf= new int[unitSize*size];
。删除 if(rank==root)
条件并查看它是否有效。
Scatter 发现 sendbuf 数组为 null
这就是它抛出 NullPointerException
的原因
代替代码
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
我要为我的项目创建一个新集群 api。所以我开始学习 MP J Express 这些 days.I 只是用这种方式使用 Scatter 和 Gather 编写了程序。但是我得到 Null point exception.No idea 哪里错了?
这是我的代码
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)...
我认为未初始化的分散对象(int 数组)。您能否尝试将 sendbuf 初始化为一些虚拟值,然后再试一次。
尝试为每个进程初始化 sendbuf= new int[unitSize*size];
。删除 if(rank==root)
条件并查看它是否有效。
Scatter 发现 sendbuf 数组为 null
这就是它抛出 NullPointerException
代替代码
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