Java 有没有办法按升序和降序对Mpi中的排名进行排序

Java 有没有办法按升序和降序对Mpi中的排名进行排序,java,eclipse,mpj-express,Java,Eclipse,Mpj Express,我正试图通过it等级的升序和降序来显示Hello World消息 我读过关于双音排序的书,但不知道如何实现它 int[] datalist = new int[8]; MPI.Init(args); int rank = MPI.COMM_WORLD.Rank(); int size = MPI.COMM_WORLD.Size(); System.out.println("Hello World from <"+rank+"> of total "+size+" processe

我正试图通过it等级的升序和降序来显示Hello World消息

我读过关于双音排序的书,但不知道如何实现它

int[] datalist = new int[8];
MPI.Init(args);

int rank = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();

System.out.println("Hello World from <"+rank+"> of total "+size+" processes");

MPI.Finalize();
int[]datalist=newint[8];
MPI.Init(args);
int rank=MPI.COMM_WORLD.rank();
int size=MPI.COMM_WORLD.size();
System.out.println(“Hello World from of total”+大小+”进程);
MPI.Finalize();

我从这个编码中得到了输出,但不知道如何通过排序来输出,我真的需要帮助,因为我对mpi的东西还是很新的

问题不是很清楚。可以用两种方式来解释:

  • 您希望按升序或降序查看打印的排名。任何MPI库,包括MPJ Express,都遵循单程序多数据(SPMD)模型。这本质上意味着将执行程序的多个副本。副本的数量取决于在使用mpjrun开关(使用-np开关)执行程序时指定的并行进程数。MPJ Express无法以任何特定顺序打印此行,因为它无法控制此程序并行副本的执行顺序。所以输出总是不确定的

  • 您希望看到datalist数组中的数据按升序或降序排序。同样,为此,需要执行Gather()或Reduce()操作。当前,您的程序正在制作datalist数组的N个副本(假设您启动了N个并行进程)


  • 希望这有帮助。

    默认情况下,Hello World程序的输出是不确定的。 但可以强制该程序按顺序输出Hello World,即强制MPI进程的顺序执行

    说明:[假设您熟悉SPMD编程模型] 让我们看看这个程序的执行顺序

    步骤1:秩为0的进程将首先到达print语句,并将获得输出通道来打印它。 如果,所有其他进程将进入
    else,并且必须在
    Recv
    函数调用处等待。注意:
    Recv
    是阻塞呼叫,需要匹配的
    Send
    。请参阅完整的文档以获得全面的解释

    步骤2:等级为0的进程将向等级为1(等级+1)的进程发送消息。现在,随着匹配的
    Send
    被发布,秩1进程从阻塞
    Recv
    中出来,并将获得下一轮打印输出。之后,它将向下一个进程(排名+1)发送一条消息,让它轮到打印

    下一步:在每个步骤中,
    else if
    中的一个进程将获得一个匹配的
    Send
    ,并将从阻塞
    Recv
    中出来,打印Hello World,并将消息发送到下一个列组以允许打印。最后,最后一个
    else
    语句是最后一个worker打印输出而不发送消息的情况。然后执行完毕

    int[] datalist = new int[8];
    MPI.Init(args);
    
    int rank = MPI.COMM_WORLD.Rank();
    int size = MPI.COMM_WORLD.Size();
    
    int buff[] = new int [1];
    buff[0] = rank;
    int tag = 1001;
    if (rank == 0){ 
        System.out.println("Hello World from <"+rank+"> of total "+size+" processes");
        MPI.COMM_WORLD.Send(buff, 0, 1, MPI.INT, rank+1, tag);
    }
    else if (rank < size-1){
        MPI.COMM_WORLD.Recv(buff, 0, 1, MPI.INT, rank-1, tag);
        System.out.println("Hello World from <"+rank+"> of total "+size+" processes");
        MPI.COMM_WORLD.Send(buff, 0, 1, MPI.INT, rank+1, tag);
    }
    else{
        MPI.COMM_WORLD.Recv(buff, 0, 1, MPI.INT, rank-1, tag);
        System.out.println("Hello World from <"+rank+"> of total "+size+" processes");
    
    }
    
    MPI.Finalize();
    
    int[]datalist=newint[8];
    MPI.Init(args);
    int rank=MPI.COMM_WORLD.rank();
    int size=MPI.COMM_WORLD.size();
    int buff[]=新int[1];
    buff[0]=等级;
    int tag=1001;
    如果(秩==0){
    System.out.println(“Hello World from of total”+大小+”进程);
    MPI.COMM_WORLD.Send(buff,0,1,MPI.INT,rank+1,tag);
    }
    否则,如果(排名<1号){
    MPI.COMM_WORLD.Recv(buff,0,1,MPI.INT,rank-1,tag);
    System.out.println(“Hello World from of total”+大小+”进程);
    MPI.COMM_WORLD.Send(buff,0,1,MPI.INT,rank+1,tag);
    }
    否则{
    MPI.COMM_WORLD.Recv(buff,0,1,MPI.INT,rank-1,tag);
    System.out.println(“Hello World from of total”+大小+”进程);
    }
    MPI.Finalize();
    
    对于4个过程,输出始终为:

    Hello World from <0> of total 4 processes
    Hello World from <1> of total 4 processes
    Hello World from <2> of total 4 processes
    Hello World from <3> of total 4 processes
    
    Hello World共有4个进程
    Hello World共有4个进程
    Hello World共有4个进程
    Hello World共有4个进程
    
    如何按升序和降序排序?实际上,我需要按升序和降序排序。所以它可能是一种升序编码,然后是另一种降序编码。如果可能的话,请尽量不要求助于解释。如果这个问题说得不够清楚,请在评论中要求作者澄清。我想我是在试图做出你的第二个解释:如何实现gather()和reduce()?