63#define PF_PACKSIZE 1600
72static int PF_packsize = 0;
73static MPI_Status PF_status;
74LONG PF_maxDollarChunkSize = 0;
76static int PF_ShortPackInit(
void);
77static int PF_longPackInit(
void);
89#define MPI_ERRCODE_CHECK(err) \
91 int _tmp_err = (err); \
92 if ( _tmp_err != MPI_SUCCESS ) return _tmp_err != 0 ? _tmp_err : -1; \
108 static double starttime;
109 if ( i == PF_RESET ) {
110 starttime = MPI_Wtime();
113 return((LONG)( 100. * (MPI_Wtime() - starttime) ) );
131 ret = MPI_Init(argcp,argvp);
132 if ( ret != MPI_SUCCESS )
return(ret);
133 ret = MPI_Comm_rank(PF_COMM,&PF.me);
134 if ( ret != MPI_SUCCESS )
return(ret);
135 ret = MPI_Comm_size(PF_COMM,&PF.numtasks);
136 if ( ret != MPI_SUCCESS )
return(ret);
139 PF_packsize = PF_PACKSIZE/
sizeof(int)*
sizeof(
int);
140 if ( PF_ShortPackInit() )
return -1;
141 if ( PF_longPackInit() )
return -1;
144 int bytes, totalbytes=0;
156 if ( ( ret = MPI_Pack_size(1,PF_INT,PF_COMM,&bytes) )!=MPI_SUCCESS )
163 if ( ( ret = MPI_Pack_size(1,PF_LONG,PF_COMM,&bytes) )!=MPI_SUCCESS )
170 totalbytes = PF_packsize-totalbytes;
177 PF_maxDollarChunkSize=totalbytes/
sizeof(WORD);
182 if ( ( ret = MPI_Pack_size(
183 ++PF_maxDollarChunkSize,PF_WORD,PF_COMM,&bytes) )!=MPI_SUCCESS )
185 }
while ( bytes<totalbytes );
191 if ( ( ret = MPI_Pack_size(
192 --PF_maxDollarChunkSize,PF_WORD,PF_COMM,&bytes) )!=MPI_SUCCESS )
194 }
while ( bytes>totalbytes );
217 return(MPI_Finalize());
238 if ( *src == PF_ANY_SOURCE ) {
239 ret = MPI_Probe(*src,MPI_ANY_TAG,PF_COMM,&PF_status);
243 ret = MPI_Iprobe(*src,MPI_ANY_TAG,PF_COMM,&flag,&PF_status);
245 *src = PF_status.MPI_SOURCE;
246 if ( ret != MPI_SUCCESS ) {
if ( ret > 0 ) ret *= -1;
return(ret); }
247 if ( !flag )
return(0);
248 return(PF_status.MPI_TAG);
270 int size = s->fill[a] - s->buff[a];
275 s->fill[a] = s->buff[a];
276 if ( s->numbufs == 1 ) {
277 r = MPI_Ssend(s->buff[a],size,PF_WORD,MASTER,tag,PF_COMM);
278 if ( r != MPI_SUCCESS ) {
279 fprintf(stderr,
"[%d|%d] PF_ISendSbuf: MPI_Ssend returns: %d \n",
280 PF.me,(
int)AC.CModule,r);
289 if ( PF.sbuf->request[to] != MPI_REQUEST_NULL)
290 r = MPI_Wait(&PF.sbuf->request[to],&PF.sbuf->retstat[to]);
291 if ( r != MPI_SUCCESS )
return(r);
297 r = MPI_Isend(s->buff[a],size,PF_WORD,to,tag,PF_COMM,&s->request[a]);
299 if ( r != MPI_SUCCESS )
return(r);
305 case PF_ENDSORT_MSGTAG:
306 if ( ++finished == PF.numtasks - 1 )
307 r = MPI_Waitall(s->numbufs,s->request,s->status);
308 if ( r != MPI_SUCCESS )
return(r);
310 case PF_BUFFER_MSGTAG:
311 if ( ++s->active >= s->numbufs ) s->active = 0;
312 while ( s->request[s->active] != MPI_REQUEST_NULL ) {
313 r = MPI_Waitsome(s->numbufs,s->request,&size,s->index,s->retstat);
314 if ( r != MPI_SUCCESS )
return(r);
317 case PF_ENDBUFFER_MSGTAG:
318 if ( ++s->active >= s->numbufs ) s->active = 0;
319 r = MPI_Waitall(s->numbufs,s->request,s->status);
320 if ( r != MPI_SUCCESS )
return(r);
347 r = MPI_Probe(*src,PF_ANY_MSGTAG,PF_COMM,&PF_status);
348 if ( r != MPI_SUCCESS ) {
if ( r > 0 ) r *= -1;
return(r); }
349 if ( PF_status.MPI_TAG != PF_RUNTIME_ERROR_MSGTAG )
break;
353 r = MPI_Recv(b,(
int)*s,PF_WORD,PF_status.MPI_SOURCE,PF_status.MPI_TAG,PF_COMM,&PF_status);
354 if ( r != MPI_SUCCESS ) {
if ( r > 0 ) r *= -1;
return(r); }
356 r = MPI_Get_count(&PF_status,PF_WORD,&i);
357 if ( r != MPI_SUCCESS ) {
if ( r > 0 ) r *= -1;
return(r); }
360 *src = PF_status.MPI_SOURCE;
361 return(PF_status.MPI_TAG);
381 r->type[bn] = PF_WORD;
383 if ( r->numbufs == 1 ) {
384 r->tag[bn] = MPI_ANY_TAG;
388 ret = MPI_Irecv(r->full[bn],(
int)(r->stop[bn] - r->full[bn]),PF_WORD,from,
389 MPI_ANY_TAG,PF_COMM,&r->request[bn]);
390 if (ret != MPI_SUCCESS) {
if(ret > 0) ret *= -1;
return(ret); }
416 if ( r->numbufs == 1 ) {
417 *size = r->stop[bn] - r->full[bn];
418 ret = MPI_Recv(r->full[bn],(
int)*size,r->type[bn],r->from[bn],r->tag[bn],
419 PF_COMM,&(r->status[bn]));
420 if ( ret != MPI_SUCCESS ) {
if ( ret > 0 ) ret *= -1;
return(ret); }
421 ret = MPI_Get_count(&(r->status[bn]),r->type[bn],&rsize);
422 if ( ret != MPI_SUCCESS ) {
if ( ret > 0 ) ret *= -1;
return(ret); }
423 if ( rsize > *size )
return(-99);
427 while ( r->request[bn] != MPI_REQUEST_NULL ) {
428 ret = MPI_Waitsome(r->numbufs,r->request,&rsize,r->index,r->retstat);
429 if ( ret != MPI_SUCCESS ) {
if ( ret > 0 ) ret *= -1;
return(ret); }
430 while ( --rsize >= 0 ) r->status[r->index[rsize]] = r->retstat[rsize];
432 ret = MPI_Get_count(&(r->status[bn]),r->type[bn],&rsize);
433 if ( ret != MPI_SUCCESS ) {
if ( ret > 0 ) ret *= -1;
return(ret); }
436 return(r->status[bn].MPI_TAG);
454 if ( MPI_Bcast(buffer,count,MPI_BYTE,MASTER,PF_COMM) != MPI_SUCCESS )
475int PF_Reduce(
const void *sendbuf,
void *recvbuf,
int count, MPI_Datatype type, MPI_Op op,
int root)
477 if ( MPI_Reduce(sendbuf,recvbuf,count,type,op,root,PF_COMM) != MPI_SUCCESS )
499 int ret=MPI_Ssend(buf,(
int)l,MPI_BYTE,dest,tag,PF_COMM);
500 if ( ret != MPI_SUCCESS )
return(-1);
521 int ret=MPI_Recv(buf,(
int)thesize,MPI_BYTE,*src,MPI_ANY_TAG,PF_COMM,&stat);
522 if ( ret != MPI_SUCCESS )
return(-1);
523 if ( MPI_Get_count(&stat,MPI_BYTE,&ret) != MPI_SUCCESS )
return(-1);
525 *src = stat.MPI_SOURCE;
545 int srcval = src != NULL ? *src : PF_ANY_SOURCE;
546 int tagval = tag != NULL ? *tag : PF_ANY_MSGTAG;
547 int ret = MPI_Probe(srcval, tagval, PF_COMM, &stat);
548 if ( ret != MPI_SUCCESS )
return -1;
549 if ( src != NULL ) *src = stat.MPI_SOURCE;
550 if ( tag != NULL ) *tag = stat.MPI_TAG;
551 if ( bytesize != NULL ) {
552 ret = MPI_Get_count(&stat, MPI_BYTE, bytesize);
553 if ( ret != MPI_SUCCESS )
return -1;
574int PF_RawIsend(
int dest,
const void *buf,
int count, MPI_Datatype type,
int tag, MPI_Request *request)
576 int ret = MPI_Isend(buf, count, type, dest, tag, PF_COMM, request);
577 if ( ret != MPI_SUCCESS )
return(-1);
596 int ret = MPI_Waitall(count, request, status);
597 if ( ret != MPI_SUCCESS )
return(-1);
617 enum { DEFAULT_BUF_SIZE = 1024 };
621 char default_buf[DEFAULT_BUF_SIZE];
622 int srcval = src != NULL ? *src : PF_ANY_SOURCE;
623 int tagval = tag != NULL ? *tag : PF_ANY_MSGTAG;
624 int ret = MPI_Probe(srcval, tagval, PF_COMM, &stat);
625 if ( ret != MPI_SUCCESS )
return -1;
626 if ( src != NULL ) *src = stat.MPI_SOURCE;
627 if ( tag != NULL ) *tag = stat.MPI_TAG;
628 ret = MPI_Get_count(&stat, MPI_BYTE, &count);
629 if ( ret != MPI_SUCCESS )
return -1;
630 buf = count <= DEFAULT_BUF_SIZE ? default_buf : Malloc1(count,
"PF_Discard");
631 ret = MPI_Recv(buf, count, MPI_BYTE, stat.MPI_SOURCE, stat.MPI_TAG, PF_COMM, MPI_STATUS_IGNORE);
632 if ( buf != default_buf ) M_free(buf,
"PF_Discard");
633 if ( ret != MPI_SUCCESS )
return -1;
646static UBYTE *PF_packbuf = NULL;
647static UBYTE *PF_packstop = NULL;
648static int PF_packpos = 0;
661static int PF_ShortPackInit(
void)
663 PF_packbuf = (UBYTE *)Malloc1(
sizeof(UBYTE) * PF_packsize,
"PF_ShortPackInit");
664 if ( PF_packbuf == NULL )
return -1;
665 PF_packstop = PF_packbuf + PF_packsize;
679static inline int PF_InitPackBuf(
void)
717 printf(
"[%d] %s: ",PF.me,s);
718 for(i=0;i<size;i++) printf(
"%d ",PF_packbuf[i]);
721 MesPrint(
"[%d] %s: %a",PF.me,s,size,(WORD *)(PF_packbuf));
738 return PF_InitPackBuf();
754int PF_Pack(
const void *buffer,
size_t count, MPI_Datatype type)
758 if ( count > INT_MAX )
return -99;
760 err = MPI_Pack_size((
int)count, type, PF_COMM, &bytes);
762 if ( PF_packpos + bytes > PF_packstop - PF_packbuf )
return -99;
764 err = MPI_Pack((
void *)buffer, (
int)count, type, PF_packbuf, PF_packsize, &PF_packpos, PF_COMM);
783int PF_Unpack(
void *buffer,
size_t count, MPI_Datatype type)
787 if ( count > INT_MAX )
return -99;
789 err = MPI_Unpack(PF_packbuf, PF_packsize, &PF_packpos, buffer, (
int)count, type, PF_COMM);
820 int ret,buflength,bytes,length;
825 if ( ( ret = MPI_Pack_size(1,PF_INT,PF_COMM,&bytes) ) != MPI_SUCCESS )
827 buflength = PF_packsize - bytes;
831 for ( length = 0; length < buflength; length++ ) {
832 if ( str[length] ==
'\0' ) {
840 if ( ( str[0] ==
'\0' )
842 && ( str[2] ==
'\0' )
851 if ( ( ret = MPI_Pack_size(--length,PF_BYTE,PF_COMM,&bytes) )
852 != MPI_SUCCESS )
return(ret);
853 }
while ( bytes > buflength );
860 if ( ( ret = MPI_Pack(&length,1,PF_INT,PF_packbuf,PF_packsize,
861 &PF_packpos,PF_COMM) ) != MPI_SUCCESS )
return(ret);
865 if ( ( ret = MPI_Pack((UBYTE *)str,length,PF_BYTE,PF_packbuf,PF_packsize,
866 &PF_packpos,PF_COMM) ) != MPI_SUCCESS )
return(ret);
892 if( (ret = MPI_Unpack(PF_packbuf,PF_packsize,&PF_packpos,
893 &length,1,PF_INT,PF_COMM))!= MPI_SUCCESS )
898 if ( ( ret = MPI_Unpack(PF_packbuf,PF_packsize,&PF_packpos,
899 str,length,PF_BYTE,PF_COMM) ) != MPI_SUCCESS )
return(ret);
936 err = MPI_Ssend(PF_packbuf, PF_packpos, MPI_PACKED, to, tag, PF_COMM);
964 err = MPI_Recv(PF_packbuf, PF_packsize, MPI_PACKED, src, tag, PF_COMM, &status);
966 if ( psrc ) *psrc = status.MPI_SOURCE;
967 if ( ptag ) *ptag = status.MPI_TAG;
1003#ifdef PF_SHORTBROADCAST
1004 int pos = PF_packpos;
1006 if ( PF.me != MASTER ) {
1007 err = PF_InitPackBuf();
1008 if ( err )
return err;
1010#ifdef PF_SHORTBROADCAST
1011 err = MPI_Bcast(&pos, 1, MPI_INT, MASTER, PF_COMM);
1013 err = MPI_Bcast(PF_packbuf, pos, MPI_PACKED, MASTER, PF_COMM);
1015 err = MPI_Bcast(PF_packbuf, PF_packsize, MPI_PACKED, MASTER, PF_COMM);
1135static UBYTE *PF_longPackBuf = NULL;
1136static void *PF_longPackSmallBuf = NULL;
1137static int PF_longPackPos = 0;
1138static int PF_longPackTop = 0;
1142static int PF_longPackN = 0;
1150static inline int PF_longMultiNewCell(
void)
1157 if ( PF_longMultiTop->next == NULL )
return(-1);
1161 PF_longMultiTop->next->buffer=(UBYTE*)
1162 Malloc1(
sizeof(UBYTE)*PF_packsize,
"PF_longMultiChunk");
1163 if ( PF_longMultiTop->next->buffer == NULL )
return(-1);
1167 PF_longMultiTop->next->bufpos = -1;
1171 PF_longMultiTop->next->next = NULL;
1182static inline int PF_longMultiPack2NextCell(
void)
1187 if ( PF_longMultiTop->next == NULL ) {
1191 if ( PF_longMultiNewCell() )
return(-1);
1196 PF_longMultiTop = PF_longMultiTop->next;
1200 if ( PF_longMultiTop->bufpos > -1 )
1201 PF_longMultiTop->buffer = PF_longPackBuf+PF_longMultiTop->bufpos;
1206 PF_longMultiTop->nPacks = 0;
1207 PF_longMultiTop->lastLen = 0;
1208 PF_longMultiTop->packpos = 0;
1217static inline int PF_longMultiNewChunkAdded(
int n)
1223 int pos = PF_longPackTop;
1231 if ( PF_longMultiLastChunk->next == NULL )
return(-1);
1235 PF_longMultiLastChunk = PF_longMultiLastChunk->next;
1239 PF_longMultiLastChunk->bufpos = pos;
1241 PF_longMultiLastChunk->buffer = NULL;
1242 PF_longMultiLastChunk->packpos = 0;
1243 PF_longMultiLastChunk->nPacks = 0;
1244 PF_longMultiLastChunk->lastLen = 0;
1249 PF_longMultiLastChunk->next = MemCell;
1258static inline void PF_longCopyChunk(
int *to,
int *from,
int n)
1271static int PF_longAddChunk(
int n,
int mustRealloc)
1274 if ( ( newbuf = (UBYTE*)Malloc1(
sizeof(UBYTE)*(PF_longPackTop+n*PF_packsize),
1275 "PF_longPackBuf") ) == NULL )
return(-1);
1279 if ( PF_longMultiNewChunkAdded(n) )
return(-1);
1283 if ( mustRealloc ) {
1284 PF_longCopyChunk((
int*)newbuf,(
int*)PF_longPackBuf,PF_longPackTop/
sizeof(
int));
1289 PF_longPackTop += (n*PF_packsize);
1293 M_free(PF_longPackBuf,
"PF_longPackBuf");
1294 PF_longPackBuf = newbuf;
1309static inline int PF_longMultiHowSplit(
int count, MPI_Datatype type,
int bytes)
1311 int ret, items, totalbytes;
1313 if ( count < 2 )
return(0);
1317 totalbytes = PF_packsize - PF_longMultiTop->packpos;
1321 items = (int)((
double)totalbytes*count/bytes);
1326 if ( ( ret = MPI_Pack_size(++items,type,PF_COMM,&bytes) )
1327 !=MPI_SUCCESS )
return(ret);
1328 }
while ( bytes < totalbytes );
1334 if ( ( ret = MPI_Pack_size(--items,type,PF_COMM,&bytes) )
1335 !=MPI_SUCCESS )
return(ret);
1338 }
while ( bytes > totalbytes );
1346static int PF_longPackInit(
void)
1349 PF_longPackBuf = (UBYTE*)Malloc1(
sizeof(UBYTE)*PF_packsize,
"PF_longPackBuf");
1350 if ( PF_longPackBuf == NULL )
return(-1);
1354 ret = MPI_Pack_size(1,MPI_INT,PF_COMM,&PF_longPackTop);
1355 if ( ret != MPI_SUCCESS )
return(ret);
1357 PF_longPackSmallBuf =
1358 (
void*)Malloc1(
sizeof(UBYTE)*PF_longPackTop,
"PF_longPackSmallBuf");
1360 PF_longPackTop = PF_packsize;
1363 if ( PF_longMultiRoot == NULL )
return(-1);
1364 PF_longMultiRoot->bufpos = 0;
1365 PF_longMultiRoot->buffer = NULL;
1366 PF_longMultiRoot->next = NULL;
1367 PF_longMultiLastChunk = PF_longMultiRoot;
1370 PF_longMultiRoot->packpos = 0;
1371 PF_longMultiTop = PF_longMultiRoot;
1381static inline int PF_longMultiPreparePrefix(
void)
1385 int i = PF_longPackN;
1390 if ( PF_longMultiPack2NextCell() )
return(-1);
1394 thePrefix = PF_longMultiTop;
1398 ret = MPI_Pack(&(PF_longPackN),
1403 &(thePrefix->packpos),
1405 if ( ret != MPI_SUCCESS )
return(ret);
1409 for ( PF_longMultiTop = PF_longMultiRoot; i > 0; i-- ) {
1413 ret = MPI_Pack(&(PF_longMultiTop->nPacks),
1418 &(thePrefix->packpos),
1423 ret |= MPI_Pack(&(PF_longMultiTop->lastLen),
1428 &(thePrefix->packpos),
1433 if ( ret != MPI_SUCCESS )
return(ret);
1437 PF_longMultiTop = PF_longMultiTop->next;
1440 PF_longMultiTop = thePrefix;
1452static inline int PF_longMultiProcessPrefix(
void)
1460 for ( PF_longMultiTop = PF_longMultiRoot, i = 0; i < PF_longPackN; i++ ) {
1464 if ( PF_longMultiPack2NextCell() )
return(-1);
1468 ret = MPI_Unpack(PF_longMultiRoot->buffer,
1470 &( PF_longMultiRoot->packpos),
1471 &(PF_longMultiTop->nPacks),
1475 if ( ret != MPI_SUCCESS )
return(ret);
1479 ret = MPI_Unpack(PF_longMultiRoot->buffer,
1481 &( PF_longMultiRoot->packpos),
1482 &(PF_longMultiTop->lastLen),
1486 if ( ret != MPI_SUCCESS )
return(ret);
1503static inline int PF_longSingleReset(
int is_sender)
1508 ret = MPI_Pack(&PF_longPackTop,1,MPI_INT,
1509 PF_longPackBuf,PF_longPackTop,&PF_longPackPos,PF_COMM);
1510 if ( ret != MPI_SUCCESS )
return(ret);
1531static inline int PF_longMultiReset(
int is_sender)
1533 int ret = 0, theone = 1;
1534 PF_longMultiRoot->packpos = 0;
1536 ret = MPI_Pack(&theone,1,MPI_INT,
1537 PF_longPackBuf,PF_longPackTop,&(PF_longMultiRoot->packpos),PF_COMM);
1543 PF_longMultiRoot->nPacks = 0;
1544 PF_longMultiRoot->lastLen = 0;
1545 PF_longMultiTop = PF_longMultiRoot;
1546 PF_longMultiRoot->buffer = PF_longPackBuf;
1563 return PF_longSingleReset(1);
1583 if ( count > INT_MAX )
return -99;
1584 ret = MPI_Pack_size((
int)count,type,PF_COMM,&bytes);
1585 if ( ret != MPI_SUCCESS )
return(ret);
1587 while ( PF_longPackPos+bytes > PF_longPackTop ) {
1588 if ( PF_longAddChunk(1, 1) )
return(-1);
1594 ret = MPI_Pack((
void *)buffer,(
int)count,type,
1595 PF_longPackBuf,PF_longPackTop,&PF_longPackPos,PF_COMM);
1596 if ( ret != MPI_SUCCESS )
return(ret);
1617 if ( count > INT_MAX )
return -99;
1618 ret = MPI_Unpack(PF_longPackBuf,PF_longPackTop,&PF_longPackPos,
1619 buffer,(
int)count,type,PF_COMM);
1620 if ( ret != MPI_SUCCESS )
return(ret);
1657 if ( PF_longPackN > 1 ) {
1659 int tmp = -PF_longPackTop;
1663 ret = MPI_Pack(&tmp, 1,PF_INT,
1664 PF_longPackSmallBuf,PF_longPackTop,&pos,PF_COMM);
1665 if ( ret != MPI_SUCCESS )
return(ret);
1666 ret = MPI_Ssend(PF_longPackSmallBuf,pos,MPI_PACKED,to,tag,PF_COMM);
1667 if ( ret != MPI_SUCCESS )
return(ret);
1669 ret = MPI_Ssend(PF_longPackBuf,PF_longPackPos,MPI_PACKED,to,tag,PF_COMM);
1670 if ( ret != MPI_SUCCESS )
return(ret);
1695 int ret, missed, oncemore;
1697 PF_longSingleReset(0);
1699 ret = MPI_Recv(PF_longPackBuf,PF_longPackTop,MPI_PACKED,src,tag,
1701 if ( ret != MPI_SUCCESS )
return(ret);
1706 src = status.MPI_SOURCE;
1707 tag = status.MPI_TAG;
1708 if ( psrc ) *psrc = status.MPI_SOURCE;
1709 if ( ptag ) *ptag = status.MPI_TAG;
1714 ret = MPI_Unpack(PF_longPackBuf,PF_longPackTop,&PF_longPackPos,
1715 &missed,1,MPI_INT,PF_COMM);
1716 if ( ret != MPI_SUCCESS )
return(ret);
1730 if ( missed > PF_longPackTop ) {
1735 if ( PF_longAddChunk( (missed-PF_longPackTop)/PF_packsize, !oncemore ) )
1738 }
while ( oncemore );
1754 return PF_longMultiReset(1);
1776 if ( count > INT_MAX )
return -99;
1778 ret = MPI_Pack_size((
int)count,type,PF_COMM,&items);
1779 if ( ret != MPI_SUCCESS )
return(ret);
1781 if ( PF_longMultiTop->packpos + items <= PF_packsize ) {
1782 ret = MPI_Pack((
void *)buffer,(
int)count,type,PF_longMultiTop->buffer,
1783 PF_packsize,&(PF_longMultiTop->packpos),PF_COMM);
1784 if ( ret != MPI_SUCCESS )
return(ret);
1785 PF_longMultiTop->nPacks++;
1795 if ( ( items = PF_longMultiHowSplit((
int)count,type,items) ) < 0 )
return(items);
1798 ret = MPI_Pack((
void *)buffer,items,type,PF_longMultiTop->buffer,
1799 PF_packsize,&(PF_longMultiTop->packpos),PF_COMM);
1800 if ( ret != MPI_SUCCESS )
return(ret);
1801 PF_longMultiTop->nPacks++;
1802 PF_longMultiTop->lastLen = items;
1808 if ( PF_longMultiPack2NextCell() )
return(-1);
1835 if ( count > INT_MAX )
return -99;
1837 if ( PF_longPackN < 2 ) {
1839 PF_longMultiTop->buffer,
1841 &(PF_longMultiTop->packpos),
1843 count,type,PF_COMM);
1844 if ( ret != MPI_SUCCESS )
return(ret);
1850 if ( ( PF_longMultiTop->nPacks > 1 )
1852 ( ( PF_longMultiTop->nPacks == 1 ) && ( PF_longMultiTop->lastLen == 0 ) )
1855 PF_longMultiTop->buffer,
1857 &(PF_longMultiTop->packpos),
1859 count,type,PF_COMM);
1860 if ( ret != MPI_SUCCESS )
return(ret);
1861 (PF_longMultiTop->nPacks)--;
1864 if ( ( PF_longMultiTop->nPacks == 1 ) && ( PF_longMultiTop->lastLen != 0 ) ) {
1869 PF_longMultiTop->buffer,
1871 &(PF_longMultiTop->packpos),
1873 PF_longMultiTop->lastLen,type,PF_COMM);
1874 if ( ret != MPI_SUCCESS )
return(ret);
1878 count -= PF_longMultiTop->lastLen;
1879 if ( count <= 0 )
return(-1);
1883 buffer = (
char *)buffer + PF_longMultiTop->lastLen * eSize;
1884 (PF_longMultiTop->nPacks)--;
1889 if ( ( PF_longMultiTop = PF_longMultiTop->next ) == NULL )
return(-1);
1920 if ( PF.me == MASTER ) {
1925 if ( PF_longPackN > 1 ) {
1926 if ( PF_longMultiPreparePrefix() )
return(-1);
1927 ret = MPI_Bcast((
void*)PF_longMultiTop->buffer,
1928 PF_packsize,MPI_PACKED,MASTER,PF_COMM);
1929 if ( ret != MPI_SUCCESS )
return(ret);
1937 PF_longMultiTop = PF_longMultiRoot;
1941 for ( i = 0; i < PF_longPackN; i++ ) {
1942 ret = MPI_Bcast((
void*)PF_longMultiTop->buffer,
1943 PF_packsize,MPI_PACKED,MASTER,PF_COMM);
1944 if ( ret != MPI_SUCCESS )
return(ret);
1945 PF_longMultiTop = PF_longMultiTop->next;
1952 PF_longMultiReset(0);
1957 ret = MPI_Bcast((
void*)PF_longMultiRoot->buffer,
1958 PF_packsize,MPI_PACKED,MASTER,PF_COMM);
1959 if ( ret != MPI_SUCCESS )
return(ret);
1961 ret = MPI_Unpack((
void*)PF_longMultiRoot->buffer,
1963 &(PF_longMultiRoot->packpos),
1964 &PF_longPackN,1,MPI_INT,PF_COMM);
1965 if ( ret != MPI_SUCCESS )
return(ret);
1971 if ( PF_longPackN < 2 )
1977 if ( PF_longMultiProcessPrefix() )
return(-1);
1983 for ( PF_longMultiTop = PF_longMultiRoot->next, i = 0; i < PF_longPackN; i++ ) {
1984 ret = MPI_Bcast((
void*)PF_longMultiTop->buffer,
1985 PF_packsize,MPI_PACKED,MASTER,PF_COMM);
1986 if ( ret != MPI_SUCCESS )
return(ret);
1992 ret = MPI_Unpack((
void*)PF_longMultiTop->buffer,
1994 &(PF_longMultiTop->packpos),
1995 &tmp,1,MPI_INT,PF_COMM);
1996 if ( ret != MPI_SUCCESS )
return(ret);
1998 PF_longMultiTop = PF_longMultiTop->next;
2004 PF_longMultiTop = PF_longMultiRoot->next;
int PF_RecvWbuf(WORD *b, LONG *s, int *src)
int PF_LongSingleReceive(int src, int tag, int *psrc, int *ptag)
int PF_PackString(const UBYTE *str)
int PF_LibInit(int *argcp, char ***argvp)
int PF_LongSingleSend(int to, int tag)
int PF_PrepareLongSinglePack(void)
int PF_Unpack(void *buffer, size_t count, MPI_Datatype type)
int PF_IRecvRbuf(PF_BUFFER *r, int bn, int from)
int PF_Receive(int src, int tag, int *psrc, int *ptag)
int PF_Send(int to, int tag)
int PF_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root)
int PF_RawIsend(int dest, const void *buf, int count, MPI_Datatype type, int tag, MPI_Request *request)
int PF_LongSingleUnpack(void *buffer, size_t count, MPI_Datatype type)
LONG PF_RawRecv(int *src, void *buf, LONG thesize, int *tag)
int PF_Pack(const void *buffer, size_t count, MPI_Datatype type)
int PF_PrepareLongMultiPack(void)
int PF_RawWaitAll(int count, MPI_Request *request, MPI_Status *status)
int PF_LongMultiPackImpl(const void *buffer, size_t count, size_t eSize, MPI_Datatype type)
int PF_RawProbe(int *src, int *tag, int *bytesize)
int PF_LongMultiBroadcast(void)
int PF_UnpackString(UBYTE *str)
int PF_PrintPackBuf(char *s, int size)
int PF_Discard(int *src, int *tag)
int PF_RawSend(int dest, void *buf, LONG l, int tag)
int PF_LongMultiUnpackImpl(void *buffer, size_t count, size_t eSize, MPI_Datatype type)
#define MPI_ERRCODE_CHECK(err)
int PF_LongSinglePack(const void *buffer, size_t count, MPI_Datatype type)
int PF_Bcast(void *buffer, int count)
int PF_ISendSbuf(int to, int tag)
int PF_WaitRbuf(PF_BUFFER *r, int bn, LONG *size)
int PF_LibTerminate(int error)
void PF_ReceiveRuntimeError(void)