2

我正在用 C 语言为大学的一个研讨会做一个小的 MPI (openmpi) 程序。我们的目标是观察 MPI 的两个主要协议(eager 和rendezvous)在消息大小方面的时间差异。

我们之前没有使用过 MPI,并且我们认为可能有一种方法可以在两种协议之间进行“选择”。在谷歌上搜索有关如何操作的信息,我发现(我不记得的地方)存在急切的限制。我读到它是由 MPI 实现设置的,而且您可以以某种方式更改它。

关于如何在协议之间进行选择的任何建议?协议和 MPI_Send/MPI_Isend 之间有什么关系吗?

我认为更改接收器缓冲区大小将打破渴望并开始使用集合点。但这只是一种预感。

这是我现在的代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "mpi.h"


#define KBdata 32000 //openmpi default buffer size
#define ndata KBdata/4 //number of ints that fits in buffer

int main(int argc, char *argv[]) {

    int myid, numprocs;
    int tag,source,destination,count;
    int buffer[ndata];
    MPI_Status status;
    MPI_Request request;

    int iter = 20;

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);

    if (myid == 0 && numprocs == 2) { //to 
        int recvID = 1;
        double acum = 0;
        int i;
        double startT;
        for (i=0;i<iter;++i)
        {
            double startTime = MPI_Wtime();

            MPI_Send(&buffer,ndata,MPI_INT,recvID,0,MPI_COMM_WORLD);

            double endTime = MPI_Wtime();
            double elapsed = endTime - startTime;
            acum += elapsed;
            printf("%d, %f, elapsed: %f\n",i,acum,elapsed);fflush(stdout);
            usleep(500000);
        }
        printf("total: %f\nmean: %f\n", acum, acum/iter);   
    }
    else if (numprocs == 2) {
        int i;
        for(i=0; i<iter; ++i)
        {
            printf("Waiting for receive\n");fflush(stdout);
            MPI_Recv(&buffer,ndata,MPI_INT,0,0,MPI_COMM_WORLD,&status);
            printf("Received %d\n",i);fflush(stdout); 
        }
    }
    else {
        printf("Need only 2 threads\n");
    }

    MPI_Finalize();


    return 0;
}

谢谢你的建议。

4

1 回答 1

0

Eager/rendezvous 和 MPI_Send/Isend 之间没有直接联系。但是,如果您处于急切限制之下,则您的MPI_Send不再阻塞。如果您希望它无论如何都阻止,您可以使用MPI_Ssend.

关于急切限制:

MVAPICH2:
  MV2_IBA_EAGER_THRESHOLD= < nbytes >
Intel MPI (depending on version):
  I_MPI_EAGER_THRESHOLD= < nbytes >
  I_MPI_SHM_EAGER_THRESHOLD= < nbytes >
Open MPI:
  --mca_btl_openib_eager_limit < nbytes >
  --mca_btl_openib_rndv_eager_limit < nbytes >
Cray MPICH:
  MPICH_GNI_MAX_EAGER_MSG_SIZE=<value>
于 2018-06-14T16:07:34.323 回答