aboutsummaryrefslogtreecommitdiff
path: root/src/Registration.c
diff options
context:
space:
mode:
authorgoodale <goodale@b61c5cb5-eaca-4651-9a7a-d64986f99364>2005-12-14 22:14:41 +0000
committergoodale <goodale@b61c5cb5-eaca-4651-9a7a-d64986f99364>2005-12-14 22:14:41 +0000
commit7cc7be1acf8f2519657e78a8bdee81920b1dc5f5 (patch)
tree8b9ac35a5b9ec0397b2d70af1b88ad64969a94c4 /src/Registration.c
parent39c19b80c226f853d899d6e06c84733e22d780bd (diff)
Changes from Dylan Stark to allow registration of topology
routines and introducing a physical to logical processor mapping. Now it is possible to register custom topology routines if you don't like the two ones we have at the moment (the traditional one and the new one from Frank Loeffler). You can also provide routines to optimise the placement of neighbouring processes on the processors by giving a custom mapping from the numbers PUGH uses for the processors to the actual MPI processor. Please treat this registration as semi-volatile for the moment and coordinate with Dylan if you fancy using it. git-svn-id: http://svn.cactuscode.org/arrangements/CactusPUGH/PUGH/trunk@475 b61c5cb5-eaca-4651-9a7a-d64986f99364
Diffstat (limited to 'src/Registration.c')
-rw-r--r--src/Registration.c312
1 files changed, 312 insertions, 0 deletions
diff --git a/src/Registration.c b/src/Registration.c
new file mode 100644
index 0000000..549eff7
--- /dev/null
+++ b/src/Registration.c
@@ -0,0 +1,312 @@
+/*@@
+ @file Registration.c
+ @date Sat Oct 8 19:29:25 CDT 2005
+ @author Dylan Stark (TommyD)
+ @desc
+ Allows registration of topology and
+ physical to logical processor mapping routines.
+
+ Mostly taken from work done by Thomas Dramlitsch.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "cctk.h"
+#include "cctk_Parameters.h"
+#include "Register.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusPUGH_PUGH_Registerables_c)
+
+/********************************************************************
+ ********************* Macro Definitions **************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data Types ***************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Aliased Routine Prototypes *****************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Scheduled Routine Prototypes ***************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Fortran Wrapper Prototypes *****************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *******************
+ ********************************************************************/
+
+static int GenerateTopologyUnavailable(int dim,
+ int total_procs,
+ const int *nsize,
+ const int *nghostzones,
+ int *nprocs);
+static void *CreateP2LTranslationUnavailable(int dim,
+ int *nprocs,
+ int np);
+static int DestroyP2LTranslationUnavailable(void *table);
+
+static int PhysicalToLogicalUnavailable (void *table, int proc);
+
+static int LogicalToPhysicalUnavailable(void *table, int num);
+
+/********************************************************************
+ ********************* Local Data *********************************
+ ********************************************************************/
+
+int (*PUGHi_GenerateTopology) (int dim,
+ int total_procs,
+ const int *nsize,
+ const int *nghostzones,
+ int *nprocs) = GenerateTopologyUnavailable;
+
+void *(*PUGHi_CreateP2LTranslation) (int dim,
+ int *nprocs,
+ int np) = CreateP2LTranslationUnavailable;
+
+int (*PUGHi_DestroyP2LTranslation) (void *table) = DestroyP2LTranslationUnavailable;
+int (*PUGHi_PhysicalToLogical) (void *table, int proc) = PhysicalToLogicalUnavailable;
+int (*PUGHi_LogicalToPhysical) (void *table, int num) = LogicalToPhysicalUnavailable;
+
+/********************************************************************
+ ************************ External Routines ********************
+ ********************************************************************/
+
+/* Registration routines */
+
+/*@@
+ @routine PUGH_RegisterGenerateTopology
+ @date Sat Oct 8 19:29:25 CDT 2005
+ @author Dylan Stark (Thomas Dramlitsch)
+ @desc
+ Registration routine for topology generators.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+ @@*/
+int PUGH_RegisterGenerateTopology(int (*GenerateTopology) (int dim,
+ int total_procs,
+ const int *nsize,
+ const int *nghostzones,
+ int *nprocs),
+ const char *topologyname)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ if (CCTK_Equals(processor_topology, topologyname))
+ {
+ if (PUGHi_GenerateTopology != GenerateTopologyUnavailable)
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,CCTK_THORNSTRING,
+ "Attempted to register topology generator %s more than once!",
+ topologyname);
+ }
+ else
+ {
+ PUGHi_GenerateTopology = GenerateTopology;
+ CCTK_VInfo(CCTK_THORNSTRING, "Using topology generator: %s",
+ topologyname);
+
+ }
+ }
+
+ return 0;
+}
+
+/*@@
+ @routine PUGH_RegisterP2L
+ @date Sat Oct 8 19:29:25 CDT 2005
+ @author Dylan Stark (Thomas Dramlitsch)
+ @desc
+ Registration routine for physical to logical processor mappings.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+ @@*/
+int PUGH_RegisterP2L(void *(*CreateP2LTranslation) (int dim,
+ int *nprocs,
+ int np),
+ int (*DestroyP2LTranslation) (void *table),
+ int (*PhysicalToLogical) (void *table,
+ int proc),
+ int (*LogicalToPhysical) (void *table,
+ int num),
+ const char *p2lname)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ if (CCTK_Equals(physical2logical, p2lname))
+ {
+ if (PUGHi_CreateP2LTranslation != CreateP2LTranslationUnavailable)
+ {
+ CCTK_VWarn(0, __LINE__,__FILE__,CCTK_THORNSTRING,
+ "Attempted to register P2L methods %s more than once!",
+ physical2logical);
+ }
+ else
+ {
+ PUGHi_CreateP2LTranslation = CreateP2LTranslation;
+ PUGHi_DestroyP2LTranslation = DestroyP2LTranslation;
+ PUGHi_PhysicalToLogical = PhysicalToLogical;
+ PUGHi_LogicalToPhysical = LogicalToPhysical;
+
+ CCTK_VInfo(CCTK_THORNSTRING, "Using physical to logical mappings: %s",
+ p2lname);
+ }
+ }
+
+ return 0;
+}
+
+/********************************************************************
+ ********************* Local Routines *****************************
+ ********************************************************************/
+
+ /*@@
+ @routine GenerateTopologyUnavailable
+ @date Wed Dec 14 21:14:55 2005
+ @author Tom Goodale
+ @desc
+ Generates an error if the routine has not been registered.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+ @@*/
+static int GenerateTopologyUnavailable(int dim,
+ int total_procs,
+ const int *nsize,
+ const int *nghostzones,
+ int *nprocs)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "No processor topology routine registered under the name '%s'"
+ " set in the processor_topology parameter.",
+ processor_topology);
+ return 0;
+}
+
+ /*@@
+ @routine CreateP2LTranslationUnavailable
+ @date Wed Dec 14 21:14:55 2005
+ @author Tom Goodale
+ @desc
+ Generates an error if the routine has not been registered.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+ @@*/
+static void *CreateP2LTranslationUnavailable(int dim,
+ int *nprocs,
+ int np)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "No physical to logical mapping routine registered under the name '%s'"
+ " set in the physical2logical parameter.",
+ physical2logical);
+ return 0;
+}
+
+ /*@@
+ @routine DestroyP2LTranslationUnavailable
+ @date Wed Dec 14 21:14:55 2005
+ @author Tom Goodale
+ @desc
+ Generates an error if the routine has not been registered.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+ @@*/
+static int DestroyP2LTranslationUnavailable(void *table)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "No physical to logical mapping routine registered under the name '%s'"
+ " set in the physical2logical parameter.",
+ physical2logical);
+ return 0;
+}
+
+ /*@@
+ @routine PhysicalToLogicalUnavailable
+ @date Wed Dec 14 21:14:55 2005
+ @author Tom Goodale
+ @desc
+ Generates an error if the routine has not been registered.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+ @@*/
+static int PhysicalToLogicalUnavailable (void *table, int proc)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "No physical to logical mapping routine registered under the name '%s'"
+ " set in the physical2logical parameter.",
+ physical2logical);
+ return 0;
+}
+
+ /*@@
+ @routine LogicalToPhysicalUnavailable
+ @date Wed Dec 14 21:14:55 2005
+ @author Tom Goodale
+ @desc
+ Generates an error if the routine has not been registered.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+ @@*/
+static int LogicalToPhysicalUnavailable(void *table, int num)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "No physical to logical mapping routine registered under the name '%s'"
+ " set in the physical2logical parameter.",
+ physical2logical);
+ return 0;
+}