我正在C学院做一个小型MPI(openmpi)课程,在大学里做研讨会。我们的目标是观察MPI的两个主要协议,渴望和会合之间关于消息大小的时间差异。
我们以前没有使用MPI,我们认为可能有一种方法可以在两种协议之间“选择”。在Google上搜索有关如何操作的信息,我发现(我不记得的地方)有一个急切的限制。我读到它是由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;
}
谢谢你的建议。
答案 0 :(得分:0)
eager / rendezvous和MPI_Send / Isend之间没有直接连接。但是,如果您处于急切限制之下,则MPI_Send
不再受阻。如果希望无论如何都要阻止它,您可以使用MPI_Ssend
。
关于渴望的限制:
MVAPICH2:
MV2_IBA_EAGER_THRESHOLD= < nbytes >
Intel MPI:
I_MPI_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>