summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhinder <hinder@17b73243-c579-4c4c-a9d2-2d5706c11dac>2012-01-31 19:18:30 +0000
committerhinder <hinder@17b73243-c579-4c4c-a9d2-2d5706c11dac>2012-01-31 19:18:30 +0000
commit100c3733a8d90eadc785becbd48494c7dfa67c73 (patch)
treea2212ae951d3132ea646b98329d799929ea8e8f2 /src
parenta2309eb58c5107a4afdac9aaa2d044a7680242ce (diff)
Merge branch 'NewSchedule' into trunk
This provides support for specifying READS and WRITES clauses for each function scheduled in schedule.ccl. These list the variables which the scheduled function reads from or writes to. This supports future dependency-based scheduling. See https://docs.einsteintoolkit.org/et-docs/Adding_requirements_to_the_Cactus_scheduler for more information. git-svn-id: http://svn.cactuscode.org/flesh/trunk@4788 17b73243-c579-4c4c-a9d2-2d5706c11dac
Diffstat (limited to 'src')
-rw-r--r--src/include/cctk_Schedule.h11
-rw-r--r--src/include/cctki_ScheduleBindings.h4
-rw-r--r--src/main/ScheduleInterface.c165
3 files changed, 175 insertions, 5 deletions
diff --git a/src/include/cctk_Schedule.h b/src/include/cctk_Schedule.h
index b9ce40e6..5a2da202 100644
--- a/src/include/cctk_Schedule.h
+++ b/src/include/cctk_Schedule.h
@@ -46,10 +46,19 @@ typedef struct
int loop_singlemap;
int loop_local;
+ int tags;
+
/* The last items should be considered volatile and may not stay here */
int n_TriggerGroups;
int *TriggerGroups;
+
+#define CACTUS_HAS_READS_CLAUSES
+ int n_WritesClauses;
+ const char **WritesClauses;
+ int n_ReadsClauses;
+ const char **ReadsClauses;
+
char *where;
char *routine;
char *thorn;
@@ -88,6 +97,8 @@ int CCTK_ScheduleFunction(void *function,
int n_trigger_groups,
int n_before,
int n_after,
+ int n_writes,
+ int n_reads,
int n_while,
int n_if,
...);
diff --git a/src/include/cctki_ScheduleBindings.h b/src/include/cctki_ScheduleBindings.h
index a87fb301..3495d11b 100644
--- a/src/include/cctki_ScheduleBindings.h
+++ b/src/include/cctki_ScheduleBindings.h
@@ -29,6 +29,8 @@ int CCTKi_ScheduleFunction(void *function,
int n_comm_groups,
int n_trigger_groups,
int n_sync_groups,
+ int n_writes,
+ int n_reads,
int n_options,
int n_before,
int n_after,
@@ -47,6 +49,8 @@ int CCTKi_ScheduleGroup(const char *realname,
int n_comm_groups,
int n_trigger_groups,
int n_sync_groups,
+ int n_writes,
+ int n_reads,
int n_options,
int n_before,
int n_after,
diff --git a/src/main/ScheduleInterface.c b/src/main/ScheduleInterface.c
index b471eea7..08309203 100644
--- a/src/main/ScheduleInterface.c
+++ b/src/main/ScheduleInterface.c
@@ -123,6 +123,8 @@ static t_attribute *CreateAttribute(const char *where,
int n_comm_groups,
int n_trigger_groups,
int n_sync_groups,
+ int n_writes,
+ int n_reads,
int n_options,
const int *timelevels,
va_list *ap);
@@ -131,6 +133,9 @@ static int ParseOptionList(int n_items,
t_attribute *attribute,
va_list *ap);
+static int ParseTagsTable(t_attribute *attribute,
+ va_list *ap);
+
static int InitialiseOptionList(t_attribute *attribute);
static int ParseOption(t_attribute *attribute,
@@ -145,6 +150,7 @@ static t_sched_modifier *CreateModifiers(int n_before,
int ValidateModifiers(t_sched_modifier *modifier);
static int CreateGroupIndexList(int n_items, int *array, va_list *ap);
+static int CreateStringList(int n_items, const char **array, va_list *ap);
static t_sched_modifier *CreateTypedModifier(t_sched_modifier *modifier,
const char *type,
int n_items,
@@ -371,6 +377,16 @@ int CCTK_CallFunction(void *function,
@vtype int
@vio in
@endvar
+ @var n_writes
+ @vdesc Number of writes clauses
+ @vtype int
+ @vio in
+ @endvar
+ @var n_reads
+ @vdesc Number of reads clauses
+ @vtype int
+ @vio in
+ @endvar
@var n_options
@vdesc Number of options for this schedule block
@vtype int
@@ -423,6 +439,8 @@ int CCTKi_ScheduleFunction(void *function,
int n_comm_groups,
int n_trigger_groups,
int n_sync_groups,
+ int n_writes,
+ int n_reads,
int n_options,
int n_before,
int n_after,
@@ -441,7 +459,8 @@ int CCTKi_ScheduleFunction(void *function,
attribute = CreateAttribute(where,name,description, language, thorn, implementation,
n_mem_groups, n_comm_groups, n_trigger_groups,
- n_sync_groups, n_options, timelevels, &ap);
+ n_sync_groups, n_writes, n_reads,
+ n_options, timelevels, &ap);
modifier = CreateModifiers(n_before, n_after, n_while, n_if, &ap);
va_end(ap);
@@ -534,6 +553,16 @@ int CCTKi_ScheduleFunction(void *function,
@vtype int
@vio in
@endvar
+ @var n_writes
+ @vdesc Number of writes clauses
+ @vtype int
+ @vio in
+ @endvar
+ @var n_reads
+ @vdesc Number of reads clauses
+ @vtype int
+ @vio in
+ @endvar
@var n_options
@vdesc Number of options for this schedule block
@vtype int
@@ -584,6 +613,8 @@ int CCTKi_ScheduleGroup(const char *realname,
int n_comm_groups,
int n_trigger_groups,
int n_sync_groups,
+ int n_writes,
+ int n_reads,
int n_options,
int n_before,
int n_after,
@@ -602,7 +633,8 @@ int CCTKi_ScheduleGroup(const char *realname,
attribute = CreateAttribute(where,name,description, NULL, thorn, implementation,
n_mem_groups, n_comm_groups, n_trigger_groups,
- n_sync_groups, n_options, timelevels, &ap);
+ n_sync_groups, n_writes, n_reads,
+ n_options, timelevels, &ap);
modifier = CreateModifiers(n_before, n_after, n_while, n_if, &ap);
va_end(ap);
@@ -610,6 +642,7 @@ int CCTKi_ScheduleGroup(const char *realname,
ValidateModifiers(modifier);
if(attribute && (modifier || (n_before == 0 && n_after == 0 &&
+ n_writes == 0 && n_reads == 0 &&
n_while == 0 && n_if == 0)))
{
retcode = CCTKi_DoScheduleGroup(where, name, realname, modifier, (void *)attribute);
@@ -1338,6 +1371,16 @@ static int ScheduleTraverse(const char *where,
@vtype int
@vio in
@endvar
+ @var n_writes
+ @vdesc Number of writes clauses
+ @vtype int
+ @vio in
+ @endvar
+ @var n_reads
+ @vdesc Number of reads clauses
+ @vtype int
+ @vio in
+ @endvar
@var n_options
@vdesc Number of options for this schedule block
@vtype int
@@ -1369,6 +1412,8 @@ static t_attribute *CreateAttribute(const char *where,
int n_comm_groups,
int n_trigger_groups,
int n_sync_groups,
+ int n_writes,
+ int n_reads,
int n_options,
const int *timelevels,
va_list *ap)
@@ -1399,6 +1444,14 @@ static t_attribute *CreateAttribute(const char *where,
{
this->FunctionData.SyncGroups = malloc(n_sync_groups*sizeof(int));
}
+ if (n_writes > 0)
+ {
+ this->FunctionData.WritesClauses = malloc(n_writes*sizeof(char*));
+ }
+ if (n_reads > 0)
+ {
+ this->FunctionData.ReadsClauses = malloc(n_reads*sizeof(char*));
+ }
if (n_comm_groups > 0)
{
this->comm_groups = malloc(n_comm_groups*sizeof(int));
@@ -1415,7 +1468,9 @@ static t_attribute *CreateAttribute(const char *where,
(this->StorageOnEntry || n_mem_groups==0) &&
(this->comm_groups || n_comm_groups==0) &&
(this->FunctionData.TriggerGroups || n_trigger_groups==0) &&
- (this->FunctionData.SyncGroups || n_sync_groups==0))
+ (this->FunctionData.SyncGroups || n_sync_groups==0) &&
+ (this->FunctionData.WritesClauses || n_writes==0) &&
+ (this->FunctionData.ReadsClauses || n_reads==0))
{
strcpy(this->FunctionData.where,where);
strcpy(this->FunctionData.routine,name);
@@ -1439,6 +1494,8 @@ static t_attribute *CreateAttribute(const char *where,
CreateGroupIndexList(n_comm_groups, this->comm_groups, ap);
CreateGroupIndexList(n_trigger_groups, this->FunctionData.TriggerGroups, ap);
CreateGroupIndexList(n_sync_groups, this->FunctionData.SyncGroups, ap);
+ CreateStringList (n_writes, this->FunctionData.WritesClauses, ap);
+ CreateStringList (n_reads, this->FunctionData.ReadsClauses, ap);
for(i=0; i< n_mem_groups; i++)
{
@@ -1450,10 +1507,15 @@ static t_attribute *CreateAttribute(const char *where,
InitialiseOptionList(this);
ParseOptionList(n_options, this, ap);
+ /* Check the tags */
+ ParseTagsTable(this, ap);
+
this->n_mem_groups = n_mem_groups;
this->n_comm_groups = n_comm_groups;
this->FunctionData.n_TriggerGroups = n_trigger_groups;
this->FunctionData.n_SyncGroups = n_sync_groups;
+ this->FunctionData.n_WritesClauses = n_writes;
+ this->FunctionData.n_ReadsClauses = n_reads;
this->timers = NULL;
}
@@ -1465,6 +1527,8 @@ static t_attribute *CreateAttribute(const char *where,
free(this->comm_groups);
free(this->FunctionData.TriggerGroups);
free(this->FunctionData.SyncGroups);
+ free(this->FunctionData.WritesClauses);
+ free(this->FunctionData.ReadsClauses);
free(this);
this = NULL;
}
@@ -1645,6 +1709,53 @@ static int CreateGroupIndexList(int n_items, int *array, va_list *ap)
}
+/*@@
+ @routine CreateStringList
+ @date 2007-05-24
+ @author Erik Schnetter
+ @desc
+ Gets the next n_items group names from the variable argument list
+ and converts them to strings.
+ @enddesc
+ @calls
+
+ @var n_items
+ @vdesc number of items on the list
+ @vtype int
+ @vio in
+ @endvar
+ @var array
+ @vdesc array of strings
+ @vtype char **
+ @vio out
+ @endvar
+ @var ap
+ @vdesc argument list
+ @vtype va_list of const char *
+ @vio inout
+ @endvar
+
+ @returntype int
+ @returndesc
+ 0 - success
+ @endreturndesc
+@@*/
+static int CreateStringList(int n_items, const char **array, va_list *ap)
+{
+ int i;
+ const char *item;
+
+ for(i=0; i < n_items; i++)
+ {
+ item = va_arg(*ap, const char *);
+
+ array[i] = strdup(item);
+ }
+
+ return 0;
+}
+
+
/*@@
@routine ParseOptionList
@date Thu Jan 27 20:26:42 2000
@@ -1830,6 +1941,50 @@ static int ParseOption(t_attribute *attribute,
return 0;
}
+
+ /*@@
+ @routine ParseTagsTable
+ @date 2006-08-03
+ @author Erik Schnetter
+ @desc
+ Extract the tags table in a schedule group definition.
+ @enddesc
+ @calls
+
+ @var attribute
+ @vdesc attribute list
+ @vtype t_attribute *
+ @vio inout
+ @endvar
+ @var ap
+ @vdesc argument list
+ @vtype va_list of const char *
+ @vio inout
+ @endvar
+
+ @returntype int
+ @returndesc
+ 0 - success
+ @endreturndesc
+@@*/
+static int ParseTagsTable(t_attribute *attribute,
+ va_list *ap)
+{
+ const char *item;
+ int table;
+
+ item = va_arg(*ap, const char *);
+ table = Util_TableCreateFromString (item);
+ if (table < 0)
+ {
+ return table;
+ }
+ attribute->FunctionData.tags = table;
+
+ return 0;
+}
+
+
/*@@
@routine CreateTypedModifier
@date Fri Sep 17 21:50:59 1999
@@ -1968,7 +2123,7 @@ static cFunctionType TranslateFunctionType(const char *where)
@returntype int
@returndesc
- return of DoScheduleTravers or
+ return code of DoScheduleTraverse or
0 - where is NULL
@endreturndesc
@@*/
@@ -2026,7 +2181,7 @@ static int SchedulePrint(const char *where)
@returntype int
@returndesc
- return of DoScheduleTravers or
+ return code of DoScheduleTraverse or
0 - where is NULL
@endreturndesc
@@*/