📄 pair.c
字号:
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&msg_id);
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Wait(&(msg_id),&status);
}
t1=MPI_Wtime();
elapsed_time = t1-t0;
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&msg_id);
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Wait(&(msg_id),&status);
}
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
/*
Synchronous send exchange (head-to-head)
*/
double exchange_ssend( int reps, int len, PairData ctx)
{
double elapsed_time;
int i, to = ctx->destination, from = ctx->source;
int recv_from;
MPI_Request msg_id;
char *sbuffer,*rbuffer;
double t0, t1;
MPI_Status status;
sbuffer = (char *)malloc(len);
rbuffer = (char *)malloc(len);
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&msg_id);
MPI_Ssend(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Wait(&(msg_id),&status);
}
t1=MPI_Wtime();
elapsed_time = t1-t0;
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&msg_id);
MPI_Ssend(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Wait(&(msg_id),&status);
}
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
/*
head-to-head exchange using forcetypes. This uses null messages to
let the sender know when the receive is ready
*/
double exchange_forcetype( int reps, int len, PairData ctx)
{
double elapsed_time;
int i, d1, *dmy = &d1,
to = ctx->destination, from = ctx->source;
int recv_from;
MPI_Request msg_id;
MPI_Status status;
char *sbuffer,*rbuffer;
double t0, t1;
sbuffer = (char *)malloc(len);
rbuffer = (char *)malloc(len);
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,3,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&(msg_id));
MPI_Send(NULL,0,MPI_BYTE,to,2,MPI_COMM_WORLD);
MPI_Recv(dmy,0,MPI_BYTE,recv_from,2,MPI_COMM_WORLD,&status);
MPI_Rsend(sbuffer,len,MPI_BYTE,to,0,MPI_COMM_WORLD);
MPI_Wait(&(msg_id),&status);
}
t1=MPI_Wtime();
elapsed_time = t1-t0;
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Send(sbuffer,len,MPI_BYTE,from,3,MPI_COMM_WORLD);
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&(msg_id));
MPI_Send(NULL,0,MPI_BYTE,to,2,MPI_COMM_WORLD);
MPI_Recv(dmy,0,MPI_BYTE,recv_from,2,MPI_COMM_WORLD,&status);
MPI_Rsend(sbuffer,len,MPI_BYTE,to,0,MPI_COMM_WORLD);
MPI_Wait(&(msg_id),&status);
}
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
/*
Blocking round trip (always unidirectional)
*/
double round_trip_sync( int reps, int len, PairData ctx)
{
double elapsed_time;
int i, to = ctx->destination, from = ctx->source;
int recv_from;
char *rbuffer,*sbuffer;
MPI_Status status;
double t0, t1;
sbuffer = (char *)malloc(len);
rbuffer = (char *)malloc(len);
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&status);
}
t1=MPI_Wtime();
elapsed_time = t1 -t0;
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps;i++){
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&status);
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
}
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
/*
Synchrouous round trip (always unidirectional)
*/
double round_trip_ssend( int reps, int len, PairData ctx)
{
double elapsed_time;
int i, to = ctx->destination, from = ctx->source;
int recv_from;
char *rbuffer,*sbuffer;
MPI_Status status;
double t0, t1;
sbuffer = (char *)malloc(len);
rbuffer = (char *)malloc(len);
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Ssend(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&status);
}
t1=MPI_Wtime();
elapsed_time = t1 -t0;
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps;i++){
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&status);
MPI_Ssend(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
}
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
/*
Ready-receiver round trip
*/
double round_trip_force( int reps, int len, PairData ctx)
{
double elapsed_time;
int i, to = ctx->destination, from = ctx->source;
int recv_from;
char *rbuffer,*sbuffer;
double t0, t1;
MPI_Request rid;
MPI_Status status;
sbuffer = (char *)malloc(len);
rbuffer = (char *)malloc(len);
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&(rid));
MPI_Rsend(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Wait(&(rid),&status);
}
t1=MPI_Wtime();
elapsed_time = t1 -t0;
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&(rid));
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps-1;i++){
MPI_Wait(&(rid),&status);
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&(rid));
MPI_Rsend(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
}
MPI_Wait(&(rid),&status);
MPI_Rsend(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
/*
Nonblocking round trip
*/
double round_trip_async( int reps, int len, PairData ctx)
{
double elapsed_time;
int i, to = ctx->destination, from = ctx->source;
int recv_from;
char *rbuffer,*sbuffer;
MPI_Status status;
double t0, t1;
MPI_Request rid;
sbuffer = (char *)malloc(len);
rbuffer = (char *)malloc(len);
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&(rid));
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Wait(&(rid),&status);
}
t1=MPI_Wtime();
elapsed_time = t1 -t0;
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&(rid));
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps-1;i++){
MPI_Wait(&(rid),&status);
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),
MPI_COMM_WORLD,&(rid));
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
}
MPI_Wait(&(rid),&status);
MPI_Send(sbuffer,len,MPI_BYTE,to,1,MPI_COMM_WORLD);
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
/*
Persistant communication (only in MPI)
*/
double round_trip_persis( int reps, int len, PairData ctx)
{
double elapsed_time;
int i, to = ctx->destination, from = ctx->source;
int recv_from;
char *rbuffer,*sbuffer;
double t0, t1;
MPI_Request sid, rid, rq[2];
MPI_Status status, statuses[2];
sbuffer = (char *)malloc(len);
rbuffer = (char *)malloc(len);
memset( sbuffer, 0, len );
memset( rbuffer, 0, len );
SetupTest( from );
ConfirmTest( reps, len, ctx );
elapsed_time = 0;
if(ctx->is_master){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;
MPI_Send_init( sbuffer, len, MPI_BYTE, to, 1, MPI_COMM_WORLD, &sid );
MPI_Recv_init( rbuffer, len, MPI_BYTE, recv_from, 1, MPI_COMM_WORLD, &rid );
rq[0] = rid;
rq[1] = sid;
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Startall( 2, rq );
MPI_Waitall( 2, rq, statuses );
}
t1=MPI_Wtime();
elapsed_time = t1 -t0;
MPI_Request_free( &rid );
MPI_Request_free( &sid );
}
if(ctx->is_slave){
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = from;
MPI_Send_init( sbuffer, len, MPI_BYTE, from, 1, MPI_COMM_WORLD, &sid );
MPI_Recv_init( rbuffer, len, MPI_BYTE, recv_from, 1, MPI_COMM_WORLD, &rid );
rq[0] = rid;
rq[1] = sid;
MPI_Start( &rid );
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps-1;i++){
MPI_Wait( &rid, &status );
MPI_Startall( 2, rq );
MPI_Wait( &sid, &status );
}
MPI_Wait( &rid, &status );
MPI_Start( &sid );
MPI_Wait( &sid, &status );
MPI_Request_free( &rid );
MPI_Request_free( &sid );
}
FinishTest();
free(sbuffer);
free(rbuffer);
return(elapsed_time);
}
static int VectorStride = 10;
int set_vector_stride( int n )
{
VectorStride = n;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -