Przeglądaj źródła

New functions starpu_data_partition_submit_sequential_consistency()
and starpu_data_unpartition_submit_sequential_consistency() which
allow to define the sequential consistency to be used for the data
being (un-)partitioned

Nathalie Furmento 7 lat temu
rodzic
commit
e3ce3f9d8c

+ 3 - 0
ChangeLog

@@ -93,6 +93,9 @@ Small features:
     fxt options (to be used with STARPU_GENERATE_TRACE)
   * New function starpu_task_set() similar as starpu_task_build() but
     with a task object given as the first parameter
+  * New functions
+    starpu_data_partition_submit_sequential_consistency() and
+    starpu_data_unpartition_submit_sequential_consistency()
 
 Changes:
   * Vastly improve simgrid simulation time.

+ 13 - 1
doc/doxygen/chapters/api/data_partition.doxy

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010-2015,2017                           CNRS
+ * Copyright (C) 2010-2015,2017,2018                      CNRS
  * Copyright (C) 2011-2013                                Inria
  * Copyright (C) 2009-2011,2014-2015,2017-2018            Université de Bordeaux
  *
@@ -190,6 +190,12 @@ in readonly mode through starpu_data_partition_readonly_submit(), and will upgra
 that partitioning into read-write mode for the \p children, by invalidating \p
 initial_handle, and adding the necessary dependencies.
 
+\fn void starpu_data_partition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int sequential_consistency)
+\ingroup API_Data_Partition
+Similar to starpu_data_partition_submit() but also allows to
+specify the coherency to be used for the main data \p initial_handle
+through the parameter \p sequential_consistency.
+
 \fn void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node)
 \ingroup API_Data_Partition
 This assumes that \p initial_handle is partitioned into \p children, and submits
@@ -215,6 +221,12 @@ state as obtained with starpu_data_partition_readonly_submit().
 \p gathering_node can be set to -1 to let the runtime decide which memory node
 should be used to gather the pieces.
 
+\fn void starpu_data_unpartition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node, int sequential_consistency)
+\ingroup API_Data_Partition
+Similar to starpu_data_unpartition_submit() but also allows to
+specify the coherency to be used for the main data \p initial_handle
+through the parameter \p sequential_consistency.
+
 \fn void starpu_data_partition_clean(starpu_data_handle_t root_data, unsigned nparts, starpu_data_handle_t *children)
 \ingroup API_Data_Partition
 This should be used to clear the partition planning established between \p

+ 4 - 1
include/starpu_data_filters.h

@@ -3,7 +3,7 @@
  * Copyright (C) 2011                                     Antoine Lucas
  * Copyright (C) 2009-2012,2014-2015,2017                 Université de Bordeaux
  * Copyright (C) 2010                                     Mehdi Juhoor
- * Copyright (C) 2010-2013,2015,2017                      CNRS
+ * Copyright (C) 2010-2013,2015,2017,2018                 CNRS
  * Copyright (C) 2011                                     Inria
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -53,6 +53,9 @@ void starpu_data_unpartition_submit_r(starpu_data_handle_t initial_handle, int g
 void starpu_data_unpartition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node);
 void starpu_data_partition_clean(starpu_data_handle_t root_data, unsigned nparts, starpu_data_handle_t *children);
 
+void starpu_data_partition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int sequential_consistency);
+void starpu_data_unpartition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gathering_node, int sequential_consistency);
+
 int starpu_data_get_nb_children(starpu_data_handle_t handle);
 starpu_data_handle_t starpu_data_get_child(starpu_data_handle_t handle, unsigned i);
 

+ 55 - 4
src/datawizard/filters.c

@@ -658,7 +658,8 @@ void starpu_data_partition_clean(starpu_data_handle_t root_handle, unsigned npar
 	_starpu_spin_unlock(&root_handle->header_lock);
 }
 
-void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children)
+static
+void _starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, char *handles_sequential_consistency)
 {
 	unsigned i;
 	STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency");
@@ -688,10 +689,35 @@ void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned
 		descr[i].mode = STARPU_W;
 	}
 	/* TODO: assert nparts too */
-	starpu_task_insert(initial_handle->switch_cl, STARPU_RW, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts, 0);
+	int ret;
+	if (handles_sequential_consistency)
+		ret = starpu_task_insert(initial_handle->switch_cl, STARPU_RW, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts,
+					 STARPU_NAME, "partition",
+					 STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, handles_sequential_consistency,
+					 0);
+	else
+		ret = starpu_task_insert(initial_handle->switch_cl, STARPU_RW, initial_handle, STARPU_DATA_MODE_ARRAY, descr, nparts,
+					 STARPU_NAME, "partition",
+					 0);
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
 	starpu_data_invalidate_submit(initial_handle);
 }
 
+void starpu_data_partition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int sequential_consistency)
+{
+	unsigned i;
+	char handles_sequential_consistency[nparts+1];
+	handles_sequential_consistency[0] = sequential_consistency;
+	for(i=1 ; i<nparts+1 ; i++) handles_sequential_consistency[i] = children[i-1]->sequential_consistency;
+
+	_starpu_data_partition_submit(initial_handle, nparts, children, handles_sequential_consistency);
+}
+
+void starpu_data_partition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children)
+{
+	_starpu_data_partition_submit(initial_handle, nparts, children, NULL);
+}
+
 void starpu_data_partition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children)
 {
 	unsigned i;
@@ -753,7 +779,7 @@ void starpu_data_partition_readwrite_upgrade_submit(starpu_data_handle_t initial
 	starpu_data_invalidate_submit(initial_handle);
 }
 
-void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node)
+void _starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node, char *handles_sequential_consistency)
 {
 	unsigned i;
 	STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency");
@@ -804,11 +830,36 @@ void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigne
 		n++;
 	}
 	/* TODO: assert nparts too */
-	starpu_task_insert(initial_handle->switch_cl, STARPU_W, initial_handle, STARPU_DATA_MODE_ARRAY, descr, n, 0);
+	int ret;
+	if (handles_sequential_consistency)
+		ret = starpu_task_insert(initial_handle->switch_cl, STARPU_W, initial_handle, STARPU_DATA_MODE_ARRAY, descr, n,
+					 STARPU_NAME, "unpartition",
+					 STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, handles_sequential_consistency,
+					 0);
+	else
+		ret = starpu_task_insert(initial_handle->switch_cl, STARPU_W, initial_handle, STARPU_DATA_MODE_ARRAY, descr, n,
+					 STARPU_NAME, "unpartition",
+					 0);
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
+
 	for (i = 0; i < nparts; i++)
 		starpu_data_invalidate_submit(children[i]);
 }
 
+void starpu_data_unpartition_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node)
+{
+	_starpu_data_unpartition_submit(initial_handle, nparts, children, gather_node, NULL);
+}
+
+void starpu_data_unpartition_submit_sequential_consistency(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node, int sequential_consistency)
+{
+	unsigned i;
+	char handles_sequential_consistency[nparts+1];
+	handles_sequential_consistency[0] = sequential_consistency;
+	for(i=1 ; i<nparts+1 ; i++) handles_sequential_consistency[i] = children[i-1]->sequential_consistency;
+	_starpu_data_unpartition_submit(initial_handle, nparts, children, gather_node, handles_sequential_consistency);
+}
+
 void starpu_data_unpartition_readonly_submit(starpu_data_handle_t initial_handle, unsigned nparts, starpu_data_handle_t *children, int gather_node)
 {
 	STARPU_ASSERT_MSG(initial_handle->sequential_consistency, "partition planning is currently only supported for data with sequential consistency");