diff options
Diffstat (limited to 'src/Comm.c')
-rw-r--r-- | src/Comm.c | 373 |
1 files changed, 215 insertions, 158 deletions
@@ -7,7 +7,8 @@ @enddesc @@*/ -/*#define DEBUG_COMM*/ +/*#define DEBUG_PUGH*/ + #include <stdlib.h> #include <stdio.h> #include <stdarg.h> @@ -22,8 +23,17 @@ extern int PUGH_GHExtension; /* local function prototypes */ -int pugh_SyncGroupArray (cGH *GH, int group, int vtype, int n_vars, int timelevel); -int pugh_SyncGroupGF (cGH *GH, int group, int vtype, int n_vars, int timelevel); + +int pugh_SyncGroupArray (cGH *GH, + int group, + int vtype, + int n_vars, + int timelevel); +int pugh_SyncGroupGF (cGH *GH, + int group, + int vtype, + int n_vars, + int timelevel); int pugh_SyncGFs(pGH *pughGH, int first_var, int n_vars, int timelevel); void DisableGFDataStorage(pGH *GH, pGF *GF); void EnableGFDataStorage(pGH *GH, pGF *GF); @@ -55,6 +65,7 @@ void pGF_FinishRecv(pGH *GH, pGF *GF, int dir); void pGF_PostRecv(pGH *GH, pGF *GF, int dir); void pGF_PostSend(pGH *GH, pGF *GF, int dir); void SetGFComm(pGH *GH, pGF *res, int docomm); +int pugh_GAComm(pGA *GA, int docomm); /*@@ @routine pugh_SyncGroup @@ -90,16 +101,6 @@ int pugh_SyncGroup (cGH *GH, const char *groupname) group = CCTK_GroupIndex(groupname); - if (group < 0) { - char *msg; - - msg = (char *) malloc (strlen (groupname) + 80); - sprintf (msg, "Unknown group \"%s\" in pugh_SyncGroup", groupname); - CCTK_WARN (1, msg); - free (msg); - return (0); - } - /* get the group info from its index */ CCTK_GroupData (group,&pgroup); @@ -116,11 +117,11 @@ int pugh_SyncGroup (cGH *GH, const char *groupname) break; case GROUP_ARRAY : - rc = pugh_SyncGroupArray (GH, - group, - pgroup.vartype, - pgroup.numvars, - timelevel); + /* rc = pugh_SyncGA (GH, + group, + pgroup.vartype, + pgroup.numvars, + timelevel);*/ rc = 1; break; @@ -181,18 +182,11 @@ int *pugh_ArrayGroupSize (cGH *GH, int dir, int group, const char *groupname) int *sizep; pGH *pughGH; pGF *pughGF; + pGA *pughGA; if (groupname) { group = CCTK_GroupIndex(groupname); - - if (group < 0) { - char *msg; - msg = (char *) malloc (strlen (groupname) + 80); - sprintf (msg, "Unknown group \"%s\" in pugh_ArrayGroupSize", groupname); - CCTK_WARN (1, msg); - free (msg); - } } /* get PUGH extension handle */ @@ -200,33 +194,65 @@ int *pugh_ArrayGroupSize (cGH *GH, int dir, int group, const char *groupname) /* get first variable in group */ first = CCTK_FirstVarIndexI(group); - - /* get pointer to pGF for a timelevel of this variable */ - pughGF = (pGF *)(pughGH->variables[first][0]); - if (pughGF->storage == PUGH_STORAGE) + if (CCTK_GroupTypeI(group)==GROUP_GF) { - switch (dir) + /* get pointer to pGF for a timelevel of this variable */ + pughGF = (pGF *)(pughGH->variables[first][0]); + + if (pughGF->storage == PUGH_STORAGE) + { + switch (dir) + { + case 0: + sizep = &pughGH->lnsize[0]; + break; + case 1: + sizep = &pughGH->lnsize[1]; + break; + case 2: + sizep = &pughGH->lnsize[2]; + break; + default : + sizep = NULL; + printf("Wrong value for dir in pugh_ArrayGroupSize\n"); + break; + } + } + else + { + sizep = &_cctk_one; + } + } + else if (CCTK_GroupTypeI(group)==GROUP_ARRAY) { - case 0: - sizep = &pughGH->lnsize[0]; - break; - case 1: - sizep = &pughGH->lnsize[1]; - break; - case 2: - sizep = &pughGH->lnsize[2]; - break; - default : - sizep = NULL; - printf("Wrong value for dir in pugh_ArrayGroupSize\n"); - break; + /* get pointer to pGF for a timelevel of this variable */ + pughGA = (pGA *)(pughGH->variables[first][0]); + + if (pughGA->storage == PUGH_STORAGE) + { + switch (dir) + { + case 0: + sizep = &pughGA->extras->lnsize[0]; + break; + case 1: + sizep = &pughGA->extras->lnsize[1]; + break; + case 2: + sizep = &pughGA->extras->lnsize[2]; + break; + default : + sizep = NULL; + printf("Wrong value for dir in pugh_ArrayGroupSize\n"); + break; + } + } + else + { + sizep = &_cctk_one; + } } - } - else - { - sizep = &_cctk_one; - } return (sizep); @@ -265,35 +291,17 @@ int *pugh_ArrayGroupSize (cGH *GH, int dir, int group, const char *groupname) int pugh_QueryGroupStorage(cGH *GH, int group, const char *groupname) { - int first; + + int first,storage; int retval; - int group_from_name; + int grouptype; pGH *pughGH; - pGF *pughGF; if (groupname) { - group_from_name = CCTK_GroupIndex(groupname); - - if (group>=0 && group_from_name != group) - { - CCTK_WARN(1,"Name and Index differ in pugh_QueryGroupStorage, using name"); - } - - group = group_from_name; - - if (group < 0) { - char *msg; - msg = (char *) malloc (strlen (groupname) + 80); - sprintf (msg, "Unknown group \"%s\" in pugh_QueryGroupStorage", groupname); - CCTK_WARN (1, msg); - free (msg); - } + group = CCTK_GroupIndex(groupname); } - /* get PUGH extension handle */ - pughGH = (pGH *) GH->extensions [PUGH_GHExtension]; - /* get first variable in group */ first = CCTK_FirstVarIndexI(group); if (first < 0) { @@ -304,43 +312,36 @@ int pugh_QueryGroupStorage(cGH *GH, int group, const char *groupname) free (msg); } - /* scalars have always storage assigned */ - if (CCTK_GroupTypeFromVarI (first) == GROUP_SCALAR) - return (1); + /* get PUGH extension handle */ + pughGH = (pGH *) GH->extensions [PUGH_GHExtension]; - /* get pointer to pGF for a timelevel of this variable */ - pughGF = (pGF *)(pughGH->variables[first][0]); + grouptype = CCTK_GroupTypeI(group); - if (pughGF->storage == PUGH_STORAGE) + if (grouptype == CCTK_SCALAR) { + storage = PUGH_STORAGE; + } + else if (grouptype==CCTK_GF) + { + storage = ((pGF *)(pughGH->variables[first][0]))->storage; + } + else if (grouptype==CCTK_ARRAY) + { + storage = ((pGA *)(pughGH->variables[first][0]))->storage; + } -#ifdef DEBUG_COMM - printf("--------------------------------------------------------------\n"); - printf("In QueryGroupStorage\n"); - printf("--------------------\n"); - printf(" Storage assigned for %s\n",groupname); - printf("--------------------------------------------------------------\n"); -#endif - + if (storage == PUGH_STORAGE) + { retval = 1; } - else if (pughGF->storage == PUGH_NOSTORAGE) + else if (storage == PUGH_NOSTORAGE) { - -#ifdef DEBUG_COMM - printf("--------------------------------------------------------------\n"); - printf("In QueryGroupStorage\n"); - printf("--------------------\n"); - printf(" Storage NOT assigned for %s\n",groupname); - printf("--------------------------------------------------------------\n"); -#endif - retval = 0; } else { CCTK_WARN(0,"Inconsistency in pugh_QueryGroupStorage"); - retval = -1; + retval = PUGH_ERROR; } return (retval); @@ -386,26 +387,16 @@ int pugh_EnableGroupStorage(cGH *GH, const char *groupname) group = CCTK_GroupIndex(groupname); - if (group < 0) { - char *msg; - - msg = (char *) malloc (strlen (groupname) + 80); - sprintf (msg, "Unknown group \"%s\" in pugh_EnableGroupStorage", groupname); - CCTK_WARN (1, msg); - free (msg); - return (0); - } - /* get the group info from its index */ CCTK_GroupData (group, &pgroup); /* branch to "enable storage" function according to group type */ switch (pgroup.grouptype) { - case GROUP_SCALAR : + case CCTK_SCALAR : rc = 1; break; - case GROUP_ARRAY : + case CCTK_ARRAY : rc = pugh_EnableArrayGroupStorage (GH, group, pgroup.vartype, @@ -414,7 +405,7 @@ int pugh_EnableGroupStorage(cGH *GH, const char *groupname) pgroup.numtimelevels); break; - case GROUP_GF : + case CCTK_GF : rc = pugh_EnableGFGroupStorage (GH, group, pgroup.vartype, @@ -470,21 +461,12 @@ int pugh_DisableGroupStorage(cGH *GH, const char *groupname) group = CCTK_GroupIndex(groupname); - if (group < 0) { - char *msg; - - msg = (char *) malloc (strlen (groupname) + 80); - sprintf (msg, "Unknown group \"%s\" in pugh_DisableGroupStorage", groupname); - CCTK_WARN (1, msg); - free (msg); - return (0); - } - /* get the group info from its index */ CCTK_GroupData (group,&pgroup); - /* branch to "disable storage" function according to group type */ - switch (pgroup.grouptype) { + switch (pgroup.grouptype) + { + case GROUP_SCALAR : rc = 1; break; @@ -549,19 +531,8 @@ int pugh_EnableGroupComm (cGH *GH, const char *groupname) int first_var; /* global index of first variable in group */ int rc; /* return code */ - group = CCTK_GroupIndex(groupname); - if (group < 0) { - char *msg; - - msg = (char *) malloc (strlen (groupname) + 80); - sprintf (msg, "Unknown group \"%s\" in pugh_EnableGroupComm", groupname); - CCTK_WARN (1, msg); - free (msg); - return (0); - } - /* get the group info from its index */ CCTK_GroupData (group,&pgroup); @@ -572,20 +543,33 @@ int pugh_EnableGroupComm (cGH *GH, const char *groupname) pughGH = (pGH *) GH->extensions [PUGH_GHExtension]; /* branch to "enable comm" function according to group type */ - switch (pgroup.grouptype) { + switch (pgroup.grouptype) + { case GROUP_SCALAR : rc = 1; break; case GROUP_ARRAY : - CCTK_WARN (1, "GROUP_ARRAY type not yet supported in pugh_EnableGroupComm"); + for (var = first_var; var < first_var+pgroup.numvars; var++) + { + for (level = 0; level < pgroup.numtimelevels; level++) + { + pugh_GAComm ((pGA *)(pughGH->variables[var][level]), + PUGH_ALLCOMM); + } + } rc = 1; break; case GROUP_GF : for (var = first_var; var < first_var+pgroup.numvars; var++) + { for (level = 0; level < pgroup.numtimelevels; level++) - SetGFComm (pughGH, (pGF *)(pughGH->variables[var][level]), PUGH_ALLCOMM); + { + SetGFComm (pughGH, (pGF *)(pughGH->variables[var][level]), + PUGH_ALLCOMM); + } + } rc = 1; break; @@ -625,7 +609,7 @@ int pugh_EnableGroupComm (cGH *GH, const char *groupname) int pugh_DisableGroupComm(cGH *GH, const char *groupname) { int group; /* group index */ - cGroup pgroup; /* pointer to group information */ + cGroup pgroup; /* pointer to group information */ pGH *pughGH; /* PUGH extension reference */ int var, level; /* loop variables */ int first_var; /* global index of first variable in group */ @@ -633,16 +617,6 @@ int pugh_DisableGroupComm(cGH *GH, const char *groupname) group = CCTK_GroupIndex(groupname); - if (group < 0) { - char *msg; - - msg = (char *) malloc (strlen (groupname) + 80); - sprintf (msg, "Unknown group \"%s\" in pugh_DisableGroupComm", groupname); - CCTK_WARN (1, msg); - free (msg); - return (0); - } - /* get the group info from its index */ CCTK_GroupData (group,&pgroup); @@ -653,13 +627,22 @@ int pugh_DisableGroupComm(cGH *GH, const char *groupname) pughGH = (pGH *) GH->extensions [PUGH_GHExtension]; /* branch to "disable comm" function according to group type */ - switch (pgroup.grouptype) { + switch (pgroup.grouptype) + { + case GROUP_SCALAR : rc = 1; break; case GROUP_ARRAY : - CCTK_WARN (1, "GROUP_ARRAY type not yet supported in pugh_DisableGroupComm"); + for (var = first_var; var < first_var+pgroup.numvars; var++) + { + for (level = 0; level < pgroup.numtimelevels; level++) + { + pugh_GAComm ((pGA *)(pughGH->variables[var][level]), + PUGH_NOCOMM); + } + } rc = 1; break; @@ -746,7 +729,7 @@ int pugh_SyncGroupArray (cGH *GH, int group, int vtype, int n_vars, int timeleve } /*@@ - @routine pugh_SyncGroupGF + @routine pugh_SyncGroup @author Paul Walker @date March 1997 @desc @@ -827,7 +810,8 @@ int pugh_SyncGroupGF (cGH *GH, int group, int vtype, int n_vars, int timelevel) int first_var = CCTK_FirstVarIndexI (group); /* Say which grid functions will actually be synchronised */ - if (pughGH->sync_verbose && pughGH->myproc == 0) { + if (pughGH->sync_verbose && pughGH->myproc == 0) + { char *gname = CCTK_GroupName (group); printf("Syncing %d grid functions in group %s\n", n_vars, gname); @@ -1001,7 +985,86 @@ int pugh_EnableArrayGroupStorage(cGH *GH, int n_variables, int n_timelevels) { - return 0; + int nstorage; /* Number of Arrays for which storage was set */ + int nnostorage; /* Number of Arrays for which no storage was set */ + int retval; + int first_var; + int var; + pGH *mypGH; + pGA *GA; + int level; + int zero_memory=0; + int padding_active=0; + int padding_cacheline_bits=0; + int padding_size=0; + int padding_address_spacing=0; + + nstorage = 0; + nnostorage = 0; + + mypGH = (pGH *)GH->extensions[PUGH_GHExtension]; + + first_var = CCTK_FirstVarIndexI(group); + + for(var = first_var; var < first_var+n_variables; var++) + { + for(level = 0; level < n_timelevels; level++) + { + GA = (pGA *)(mypGH->variables[var][level]); + + if(!GA->storage) + { +#ifdef DEBUG_PUGH + { + const char *name; + name = CCTK_FullName(var); + printf("Storage on in pugh_EnableArrayGroupStorage for %s\n",name); + } +#endif + pugh_EnablePGAStorage + ( + GA, + mypGH->myproc, + zero_memory, + padding_active, + padding_cacheline_bits, + padding_size, + padding_address_spacing + ); + + GH->data[var][level] = GA->data; + + nnostorage++; + } + else + { + GH->data[var][level] = GA->data; + nstorage++; + } + } + } + + if (nstorage > 0 && nnostorage > 0) + { + CCTK_WARN(0,"Group storage violation in pugh_EnableArrayGroupStorage"); + retval = -1; + } + else if (nstorage > 0) + { + retval = 1; + } + else if (nnostorage > 0) + { + retval = 0; + } + else + { + CCTK_WARN(0,"Problem in pugh_EnableArrayGroupStorage"); + retval = -1; + } + + return retval; + } @@ -1044,15 +1107,12 @@ int pugh_EnableGFGroupStorage(cGH *GH, } #endif EnableGFDataStorage(mypGH,GF); - GH->data[var][level] = GF->data; - nnostorage++; } else { - GH->data[var][level] = GF->data; - + GH->data[var][level] = GF->data; nstorage++; } } @@ -1121,7 +1181,6 @@ int pugh_DisableGFGroupStorage(cGH *GH, { GF = (pGF *)(mypGH->variables[var][level]); - if(GF->storage) { #ifdef DEBUG_PUGH @@ -1132,7 +1191,6 @@ int pugh_DisableGFGroupStorage(cGH *GH, printf(" for %s\n",gfname); } #endif - DisableGFDataStorage(mypGH,GF); number_disabled++; GH->data[var][level] = GF->data; @@ -1178,7 +1236,6 @@ int pugh_MyProc(cGH *GH) #ifdef MPI pGH *pughGH; - pughGH = (pGH *) GH->extensions [PUGH_GHExtension]; CACTUS_MPI_ERROR(MPI_Comm_rank(pughGH->PUGH_COMM_WORLD, &myproc)); #else |