long get_checksum(void *buf, int count, MPI_Datatype dt) { int done; PNMPIMOD_Datatype_Parameters_t ref; char *b; int l, s, r; MPI_Datatype t; long checksum; checksum = 0; if ((abs(verbosity_level) & 0xff) >= 5) { printf("In Checksum -( %i)---------------------------\n", count); } dt_get(buf, count, dt, &ref); do { PNMPIMOD_Datatype_getItem(&ref, &b, &t, &l, &s, &done) #ifdef USE_FUNCTIONS ; #endif r = sizeof(checksum); while (r <= l * s) { if ((abs(verbosity_level) & 0xff) >= 5) { printf("In Checksum %x %i %i %i / val %li\n", b, r, l, s, *((long *)b)); } checksum ^= *((long *)b); b += sizeof(checksum); r += sizeof(checksum); } } while (!done); dt_del(&ref); return checksum; }
void RECV_P2P_END(void *buf, int count, MPI_Datatype dt, int node, int tag, MPI_Comm comm, int err, void **ptr, void **midptr, int type) { long checksum,incoming; MPI_Status status; int done; PNMPIMOD_Datatype_Parameters_t ref; char *b; int l,s,i; MPI_Datatype t; if (comm!=MPI_COMM_NULL) { checksum=get_checksum(buf,count,dt); PMPI_Recv(&incoming,1,MPI_LONG,node,tag,comm,&status); if ((checksum==incoming) || ((type && PNMPIMOD_COMM_COLL_REDUCE)!=0)) { if ((abs(verbosity_level) & 0xff)>=2) { printf("Checksum OK\n"); } } else { printf("Checksum Error - %li instead of %li (dt=%i)\n",checksum,incoming,dt); if ((abs(verbosity_level) & 0xff)>=3) { printf("CSE - Got the following\n"); dt_get(buf, count, dt, &ref); do { PNMPIMOD_Datatype_getItem(&ref,&b,&t,&l,&s,&done) #ifdef USE_FUNCTIONS ; #endif printf("\t%i ",l); switch (t) { case MPI_INT : printf("INT "); break; case MPI_SHORT : printf("SHORT "); break; case MPI_LONG : printf("LONG "); break; case MPI_CHAR : printf("CHAR "); break; case MPI_DOUBLE : printf("DOUBLE"); break; case MPI_FLOAT : printf("FLOAT "); break; default: printf("Other"); } printf(" of size %i at buf %16p / %li == ",s,b,((long) b)-((long) buf)); for (i=0; i<l; i++) { switch (t) { case MPI_INT : printf(" %i",((int*)b)[i]); break; case MPI_SHORT : printf(" %i",((short*)b)[i]); break; case MPI_LONG : printf(" %li",((long*)b)[i]); break; case MPI_CHAR : printf(" %c",((char*)b)[i]); break; case MPI_DOUBLE : printf(" %f",((double*)b)[i]); break; case MPI_FLOAT : printf(" %f",((float*)b)[i]); break; } } printf("\n"); fflush(stdout); } while (!done); dt_del(&ref); } } if ((abs(verbosity_level) & 0xff)>=4) { PMPI_Recv(buf,count,dt,node,tag,comm,&status); if (checksum!=incoming) { printf("CSE: Message should have been\n"); dt_get(buf, count, dt, &ref); do { PNMPIMOD_Datatype_getItem(&ref,&b,&t,&l,&s,&done) #ifdef USE_FUNCTIONS ; #endif printf("\t%i ",l); switch (t) { case MPI_INT : printf("INT "); break; case MPI_SHORT : printf("SHORT "); break; case MPI_LONG : printf("LONG "); break; case MPI_CHAR : printf("CHAR "); break; case MPI_DOUBLE : printf("DOUBLE"); break; case MPI_FLOAT : printf("FLOAT "); break; default: printf("Other"); } printf(" of size %i at buf %16p / %li == ",s,b,((long) b)-((long) buf)); for (i=0; i<l; i++) { switch (t) { case MPI_INT : printf(" %i",((int*)b)[i]); break; case MPI_SHORT : printf(" %i",((short*)b)[i]); break; case MPI_LONG : printf(" %li",((long*)b)[i]); break; case MPI_CHAR : printf(" %c",((char*)b)[i]); break; case MPI_DOUBLE : printf(" %f",((double*)b)[i]); break; case MPI_FLOAT : printf(" %f",((float*)b)[i]); break; } } printf("\n"); fflush(stdout); } while (!done); dt_del(&ref); } } if (checksum!=incoming) { if (verbosity_level==1) { while (0); } if (verbosity_level==-1) { *((int*) 0)=0; } } } }
void SEND_P2P_ASYNC_MID1(void *buf, int count, MPI_Datatype dt, int node, int tag, MPI_Comm comm, void **ptr, int type) { long checksum; int done; PNMPIMOD_Datatype_Parameters_t ref; char *b; int l,s,i; MPI_Datatype t; if (comm!=MPI_COMM_NULL) { checksum=get_checksum(buf,count,dt); if ((abs(verbosity_level) & 0xff)>=3) { printf("Sending checksum %li (dt=%i)\n",checksum,dt); dt_get(buf, count, dt, &ref); do { PNMPIMOD_Datatype_getItem(&ref,&b,&t,&l,&s,&done) #ifdef USE_FUNCTIONS ; #endif printf("\t%i ",l); switch (t) { case MPI_INT : printf("INT "); break; case MPI_SHORT : printf("SHORT "); break; case MPI_LONG : printf("LONG "); break; case MPI_CHAR : printf("CHAR "); break; case MPI_DOUBLE : printf("DOUBLE"); break; case MPI_FLOAT : printf("FLOAT "); break; default: printf("Other"); } printf(" of size %i at buf %16p / %li == ",s,b,((long) b)-((long) buf)); for (i=0; i<l; i++) { switch (t) { case MPI_INT : printf(" %i",((int*)b)[i]); break; case MPI_SHORT : printf(" %i",((short*)b)[i]); break; case MPI_LONG : printf(" %li",((long*)b)[i]); break; case MPI_CHAR : printf(" %c",((char*)b)[i]); break; case MPI_DOUBLE : printf(" %f",((double*)b)[i]); break; case MPI_FLOAT : printf(" %f",((float*)b)[i]); break; } } printf("\n"); fflush(stdout); } while (!done); dt_del(&ref); } PMPI_Send(&checksum,1,MPI_LONG,node,tag,comm); if ((abs(verbosity_level) & 0xff)>=4) { PMPI_Send(buf,count,dt,node,tag,comm); } } }