因此,在我将数据(clusters[10][5]2d数组(Bcast到其他每个进程之后,然后当每个进程计算其新的本地值时,我想将它们发送回进程0。
但有时会丢失一些数据(取决于集群的数量(,或者数据与我在发送过程中的数据不相等。我不知道为什么,但recvcount的最大值需要除以大小或某个因子,它们不能是数组大小(10或10*5-元素数量(。例如,如果我把它的完整大小放在cluster.lengt(10(中,它会说indexoutofbounce 19,如果我运行更多的进程(mpjrun.bat-np 11 name(,则在outofbouse中会出现更高的索引,并且进程数越高/越低,它总是上升或下降2(例如,我使用5个进程,得到9个,然后下一次运行使用6个,得到11个(。
有人能解释为什么Gather的计数与进程数有关,或者为什么它不能接受数组大小吗
而且,在数据计算正确后,程序不会结束,只有当我使用1个进程时,它才会结束,否则它会退出循环,然后打印一些东西到终端,之后我有MPI.finalize,但什么都没有发生,我有Ctrl+c来终止bat作业,这样我就可以再次使用终端了。
clusterget变量设置为集群数量*进程大小,这样它就可以存储来自其他进程的所有新集群,这样我就可以在第一个进程中全部使用它们,所以问题不在clusterget变量中,或者可能是这样?由于实际上没有任何关于通过浮动的2d数组发送的文档(是的,我需要使用MPI.OBJECT,因为如果我使用浮动,java不喜欢浮动,它说浮动不能被强制转换为浮动(。
MPI.COMM_WORLD.Bcast(clusters, 0, clusters.length, MPI.OBJECT, 0);
//calculate and then send back to 0
MPI.COMM_WORLD.Gather(clusters, 0, clusters.length / size, MPI.OBJECT, clusterget, 0, clusters.length / size, MPI.OBJECT, 0);
if (me == 0) {
for (int j = 0; j < clusters.length; j++) { //adds clusters from each other process to the first ones
for (int i = 0; i < size - 1; i++) {
System.out.println(clusterget[j+i*cluster][4]+" tock "+clusters[j][4]);
clusters[j][2] += clusterget[j + i * cluster][2]; //dodaj
clusters[j][3] += clusterget[j + i * cluster][3];
clusters[j][4] += clusterget[j + i * cluster][4];
}
}
}
在Summmary中:每个过程的数据与收集后收集的数据不同,我无法将2d浮点数组的全部大小放入其中
我已经将collect更改为Send和Recv,它可以工作,我需要添加一个Barrier,以便在发送之前同步数据。但这只适用于两个过程。
MPI.COMM_WORLD.Barrier();
if (me != 0){
MPI.COMM_WORLD.Send(clusters,0,clusters.length,MPI.OBJECT,0,MPI.ANY_TAG);
}
if (me == 0) {
for (int i = 1; i < size; i++) {
MPI.COMM_WORLD.Recv(clusterget,0,clusters.length,MPI.OBJECT,i,MPI.ANY_TAG);
for (int j = 0; j < clusters.length; j++) {
clusters[j][2] += clusterget[j][2];
clusters[j][3] += clusterget[j][3];
clusters[j][4] += clusterget[j][4];
}
}