MPI_Sendcount=0,但接收到64byte
if(rank==0){
while(ap<a+num) {printf("%f ",*ap++);if((ap-a)%totalsize==0) putchar('\n');}
//printf("rank:%d\n",rank);
MPI_Send(MPI_BOTTOM,0,MPI_BYTE,1,0,MPI_COMM_WORLD);
}
if(rank==1){
MPI_Recv(MPI_BOTTOM,0,MPI_BYTE,0,0,MPI_COMM_WORLD,&status);
while(ap<a+num) {printf("%f ",*ap++);if((ap-a)%totalsize==0) putchar('\n');}
//printf("rank:%d\n",rank);
MPI_Send(MPI_BOTTOM,0,MPI_BYTE,2,1,MPI_COMM_WORLD);
}
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#define totalsize 16
#define mysize 4
#define steps 10
main(int argc, char **argv){
float *a,*ap;
int rank;
int i,num=totalsize*mysize+totalsize;
void calc(int x,float *a);
void *buffer;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if((a=(float *)calloc(totalsize+num,sizeof(float)))==NULL) {puts("malloc error!\n");exit(1);}
if((buffer=malloc(1024))==NULL) {puts("malloc error!\n");exit(1);}
calc( 8 , a );
MPI_Barrier(MPI_COMM_WORLD);
//if(rank==0) puts("calc ok");
ap=a+totalsize;
if(rank==0){
while(ap<a+num) {printf("%f ",*ap++);if((ap-a)%totalsize==0) putchar('\n');}
//printf("rank:%d\n",rank);
MPI_Send(MPI_BOTTOM,0,MPI_BYTE,1,0,MPI_COMM_WORLD);
}
if(rank==1){
MPI_Recv(MPI_BOTTOM,0,MPI_BYTE,0,0,MPI_COMM_WORLD,&status);
while(ap<a+num) {printf("%f ",*ap++);if((ap-a)%totalsize==0) putchar('\n');}
//printf("rank:%d\n",rank);
MPI_Send(MPI_BOTTOM,0,MPI_BYTE,2,1,MPI_COMM_WORLD);
}
if(rank==2){
MPI_Recv(MPI_BOTTOM,0,MPI_BYTE,1,1,MPI_COMM_WORLD,&status);
while(ap<a+num) {printf("%f ",*ap++);if((ap-a)%totalsize==0) putchar('\n');}
//printf("rank:%d\n",rank);
MPI_Send(MPI_BOTTOM,0,MPI_BYTE,3,2,MPI_COMM_WORLD);
}
if(rank==3){
MPI_Recv(MPI_BOTTOM,0,MPI_BYTE,2,2,MPI_COMM_WORLD,&status);
while(ap<a+num) {printf("%f ",*ap++);if((ap-a)%totalsize==0) putchar('\n');}
//printf("rank:%d\n",rank);
}
MPI_Finalize();
}
void calc(int x,float *a){
int rank,size;
int i,j,k,begin=1,end=mysize+1,num=totalsize*(mysize+2);
float *b,*ap,*bp;
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if((b=calloc(num,sizeof(float)))==NULL) {puts("malloc error!\n");exit(1);}
//initialize
if(rank==0){
ap=a+totalsize;
bp=b+totalsize;
while(ap<a+totalsize*2) {*ap++=x;*bp++=x;}
}
else if(rank==3){
ap=a+totalsize*mysize;
bp=b+totalsize*mysize;
while(ap<a+totalsize*mysize+totalsize) {*ap++=x;*bp++=x;}
}
ap=a;
bp=a+totalsize-1;
while(ap<a+num){
*ap=x,*bp=x;
ap+=totalsize;
bp+=totalsize;
}
ap=b;
bp=b+totalsize-1;
while(ap<b+num){
*ap=x,*bp=x;
ap+=totalsize;
bp+=totalsize;
}
for(i=0;i<steps;i++){
//syncronise
if(rank==0) MPI_Send(a+num-2*totalsize,totalsize,MPI_FLOAT,1,0,MPI_COMM_WORLD);
if(rank==3) MPI_Send(a+totalsize,totalsize,MPI_FLOAT,2,1,MPI_COMM_WORLD);
else{
MPI_Sendrecv(a+totalsize,totalsize,MPI_FLOAT,rank-1,2,a,totalsize,MPI_FLOAT,rank-1,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
MPI_Sendrecv(a+num-2*totalsize,totalsize,MPI_FLOAT,rank+1,3,a+num-totalsize,totalsize,MPI_FLOAT,rank+1,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
}
MPI_Barrier(MPI_COMM_WORLD);
//calc
if(rank==0) begin=2;
else if(rank==3) end=mysize;
bp=b+1+totalsize*begin;
while(bp<b+totalsize*end){
//while(bp<b+totalsize*(begin+1)){
ap=bp-b+a;
*bp++=(*(ap-totalsize)+*(ap+totalsize)+*(ap-1)+*(ap+1))/4;
if((bp-b+1)%totalsize==0) bp+=2;
}
ap=a,bp=b;
while(ap<a+num) *ap++=*bp++;
}
}
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}