#include "netpipe.h"
extern double *pTime;
extern int *pNrepeat;
void Init(ArgStruct *p, int* pargc, char*** pargv)
{
gpshmem_init(pargc, pargv);
}
void Setup(ArgStruct *p)
{
int npes;
if((npes=gpnumpes())!=2) {
printf("Error Message: npes = %d - You must run on 2 nodes\n", gpnumpes());
exit(1);
}
p->prot.flag=(int *) gpshmalloc(sizeof(int));
pTime = (double *) gpshmalloc(sizeof(double));
pNrepeat = (int *) gpshmalloc(sizeof(int));
p->tr = p->rcv = 0;
if((p->prot.ipe=gpmype()) == 0) {
p->tr=1;
p->prot.nbor=1;
*p->prot.flag=1;
} else {
p->rcv=1;
p->prot.nbor=0;
*p->prot.flag=0;
}
}
void Sync(ArgStruct *p)
{
gpshmem_barrier_all();
}
void PrepareToReceive(ArgStruct *p) { }
void SendData(ArgStruct *p)
{
if(p->bufflen%4==0)
gpshmem_put32((short*)p->buff,(short*)p->buff,p->bufflen/4,p->prot.nbor);
else
gpshmem_putmem(p->buff,p->buff,p->bufflen,p->prot.nbor);
}
void RecvData(ArgStruct *p)
{
int i=0;
while( p->buff[p->bufflen-1] != 'b'+p->prot.ipe ) {
if( ++i%10000000==0 ) printf("");
}
p->buff[p->bufflen-1] = 'b' + p->prot.nbor;
}
void SendTime(ArgStruct *p, double *t)
{
*pTime=*t;
gpshmem_putmem(pTime,pTime,sizeof(double),p->prot.nbor);
gpshmem_putmem(p->prot.flag,p->prot.flag,sizeof(int),p->prot.nbor);
}
void RecvTime(ArgStruct *p, double *t)
{
int i=0;
while(*p->prot.flag!=p->prot.ipe)
{
if(++i%10000000==0) printf("");
}
*t=*pTime;
*p->prot.flag=p->prot.nbor;
}
void SendRepeat(ArgStruct *p, int rpt)
{
*pNrepeat= rpt;
gpshmem_putmem(pNrepeat,pNrepeat,sizeof(int),p->prot.nbor);
gpshmem_putmem(p->prot.flag,p->prot.flag,sizeof(int),p->prot.nbor);
}
void RecvRepeat(ArgStruct *p, int *rpt)
{
int i=0;
while( *p->prot.flag != p->prot.ipe ) {
if( ++i%2 == 3 ) printf("%d", *p->prot.flag); /* invalidate cache */
}
*rpt=*pNrepeat;
*p->prot.flag=p->prot.nbor;
}
void CleanUp(ArgStruct *p)
{
gpshmem_finalize();
}
void Reset(ArgStruct *p)
{
}
void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset)
{
if((p->buff=(char *)gpshmalloc(bufflen+MAX(soffset,roffset)))==(char *)NULL)
{
fprintf(stderr,"couldn't allocate memory\n");
exit(-1);
}
p->buff[bufflen-1]='b'+p->tr;
if((p->buff1=(char *)gpshmalloc(bufflen+soffset))==(char *)NULL)
{
fprintf(stderr,"Couldn't allocate memory\n");
exit(-1);
}
return 0;
}
void FreeBuff(char *buff1, char* buff2)
{
gpshfree(buff1);
gpshfree(buff2);
}
syntax highlighted by Code2HTML, v. 0.9.1