Browse Source

Add starpu_data_invalidate_submit

Samuel Thibault 13 years ago
parent
commit
902b5befd6

+ 2 - 1
ChangeLog

@@ -24,7 +24,8 @@ New features:
   * Performance models measurements can now be provided explicitly by
     applications.
   * Capability to emit communication statistics when running MPI code
-  * Add starpu_data_acquire_on_node
+  * Add starpu_unregister_submit, starpu_data_acquire_on_node and
+    starpu_data_invalidate_submit
   * New functionnality to wrapper starpu_insert_task to pass a array of
 	data_handles via the parameter STARPU_DATA_ARRAY
 

+ 6 - 2
doc/chapters/basic-api.texi

@@ -434,6 +434,10 @@ access to the handle must be performed in write-only mode. Accessing an
 invalidated data in read-mode results in undefined behaviour.
 @end deftypefun
 
+@deftypefun void starpu_data_invalidate_submit (starpu_data_handle_t @var{handle})
+Submits invalidation of the data handle after completion of previously submitted tasks.
+@end deftypefun
+
 @c TODO create a specific sections about user interaction with the DSM ?
 
 @deftypefun void starpu_data_set_wt_mask (starpu_data_handle_t @var{handle}, uint32_t @var{wt_mask})
@@ -500,13 +504,13 @@ tasks or from their callbacks (in that case, @code{starpu_data_acquire} returns
 
 @deftypefun int starpu_data_acquire_cb (starpu_data_handle_t @var{handle}, {enum starpu_access_mode} @var{mode}, void (*@var{callback})(void *), void *@var{arg})
 @code{starpu_data_acquire_cb} is the asynchronous equivalent of
-@code{starpu_data_release}. When the data specified in the first argument is
+@code{starpu_data_acquire}. When the data specified in the first argument is
 available in the appropriate access mode, the callback function is executed.
 The application may access the requested data during the execution of this
 callback. The callback function must call @code{starpu_data_release} once the
 application does not need to access the piece of data anymore.
 Note that implicit data dependencies are also enforced by
-@code{starpu_data_acquire_cb} in case they are enabled.
+@code{starpu_data_acquire_cb} in case they are not disabled.
  Contrary to @code{starpu_data_acquire}, this function is non-blocking and may
 be called from task callbacks. Upon successful completion, this function
 returns 0.

+ 2 - 0
include/starpu_data.h

@@ -60,6 +60,8 @@ void starpu_data_unregister_submit(starpu_data_handle_t handle);
 /* Destroy all data replicates. After data invalidation, the first access to
  * the handle must be performed in write-only mode. */
 void starpu_data_invalidate(starpu_data_handle_t handle);
+/* Same, but waits for previous task completion */
+void starpu_data_invalidate_submit(starpu_data_handle_t handle);
 
 void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important);
 

+ 18 - 5
src/datawizard/interfaces/data_interface.c

@@ -593,12 +593,9 @@ void starpu_data_unregister_submit(starpu_data_handle_t handle) {
 	_starpu_data_unregister(handle, 0);
 }
 
-void starpu_data_invalidate(starpu_data_handle_t handle)
+static void _starpu_data_invalidate(void *data)
 {
-	STARPU_ASSERT(handle);
-
-	starpu_data_acquire(handle, STARPU_W);
-
+	starpu_data_handle_t handle = data;
 	_starpu_spin_lock(&handle->header_lock);
 
 	unsigned node;
@@ -620,6 +617,22 @@ void starpu_data_invalidate(starpu_data_handle_t handle)
 	starpu_data_release(handle);
 }
 
+void starpu_data_invalidate(starpu_data_handle_t handle)
+{
+	STARPU_ASSERT(handle);
+
+	starpu_data_acquire(handle, STARPU_W);
+
+	_starpu_data_invalidate(handle);
+}
+
+void starpu_data_invalidate_submit(starpu_data_handle_t handle)
+{
+	STARPU_ASSERT(handle);
+
+	starpu_data_acquire_cb(handle, STARPU_W, _starpu_data_invalidate, handle);
+}
+
 enum starpu_data_interface_id starpu_handle_get_interface_id(starpu_data_handle_t handle)
 {
 	return handle->ops->interfaceid;

+ 24 - 0
tests/datawizard/data_invalidation.c

@@ -180,6 +180,30 @@ int main(int argc, char **argv)
 		starpu_data_invalidate(v_handle);
 	}
 
+	for (loop = 0; loop < NLOOPS; loop++)
+	{
+		struct starpu_task *memset_task;
+		struct starpu_task *check_content_task;
+
+		memset_task = starpu_task_create();
+		memset_task->cl = &memset_cl;
+		memset_task->handles[0] = v_handle;
+
+		ret = starpu_task_submit(memset_task);
+		if (ret == -ENODEV) goto enodev;
+		STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
+
+		check_content_task = starpu_task_create();
+		check_content_task->cl = &check_content_cl;
+		check_content_task->handles[0] = v_handle;
+
+		ret = starpu_task_submit(check_content_task);
+		if (ret == -ENODEV) goto enodev;
+		STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
+
+		starpu_data_invalidate_submit(v_handle);
+	}
+
 	/* this should get rid of automatically allocated buffers */
 	starpu_data_unregister(v_handle);