浏览代码

More fixes for acquiring node -1 case. Still not working apparently, so not using it for data_invalidate for now.

Samuel Thibault 11 年之前
父节点
当前提交
c8c8eeeb31

+ 2 - 1
src/datawizard/filters.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010-2013  Université de Bordeaux 1
+ * Copyright (C) 2010-2014  Université de Bordeaux 1
  * Copyright (C) 2010  Mehdi Juhoor <mjuhoor@gmail.com>
  * Copyright (C) 2010, 2011, 2012, 2013  Centre National de la Recherche Scientifique
  * Copyright (C) 2012 INRIA
@@ -340,6 +340,7 @@ void starpu_data_unpartition(starpu_data_handle_t root_handle, unsigned gatherin
 
 		_starpu_spin_lock(&child_handle->header_lock);
 
+		_starpu_data_unregister_ram_pointer(child_handle);
 		_starpu_data_free_interfaces(child_handle);
 
 		for (worker = 0; worker < nworkers; worker++)

+ 24 - 17
src/datawizard/interfaces/data_interface.c

@@ -482,21 +482,9 @@ struct starpu_data_interface_ops* starpu_data_get_interface_ops(starpu_data_hand
  * Stop monitoring a piece of data
  */
 
-void _starpu_data_free_interfaces(starpu_data_handle_t handle)
+void _starpu_data_unregister_ram_pointer(starpu_data_handle_t handle)
 {
-	const void *ram_ptr;
-	unsigned node;
-	unsigned worker;
-	unsigned nworkers = starpu_worker_get_count();
-
-	ram_ptr = starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM);
-
-	for (node = 0; node < STARPU_MAXNODES; node++)
-		free(handle->per_node[node].data_interface);
-
-	for (worker = 0; worker < nworkers; worker++)
-		free(handle->per_worker[worker].data_interface);
-
+	const void *ram_ptr = starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM);
 	if (ram_ptr != NULL)
 	{
 		/* Remove the PTR -> HANDLE mapping.  If a mapping from PTR
@@ -515,6 +503,19 @@ void _starpu_data_free_interfaces(starpu_data_handle_t handle)
 	}
 }
 
+void _starpu_data_free_interfaces(starpu_data_handle_t handle)
+{
+	unsigned node;
+	unsigned worker;
+	unsigned nworkers = starpu_worker_get_count();
+
+	for (node = 0; node < STARPU_MAXNODES; node++)
+		free(handle->per_node[node].data_interface);
+
+	for (worker = 0; worker < nworkers; worker++)
+		free(handle->per_worker[worker].data_interface);
+}
+
 struct _starpu_unregister_callback_arg
 {
 	unsigned memory_node;
@@ -723,6 +724,7 @@ static void _starpu_data_unregister(starpu_data_handle_t handle, unsigned cohere
 		_starpu_spin_lock(&handle->header_lock);
 	}
 
+	_starpu_data_unregister_ram_pointer(handle);
 	_starpu_data_free_interfaces(handle);
 
 	/* Destroy the data now */
@@ -792,8 +794,13 @@ static void _starpu_data_invalidate(void *data)
 		struct _starpu_data_replicate *local = &handle->per_node[node];
 
 		if (local->mc && local->allocated && local->automatically_allocated)
+		{
+			if (node == STARPU_MAIN_RAM)
+				_starpu_data_unregister_ram_pointer(handle);
+
 			/* free the data copy in a lazy fashion */
 			_starpu_request_mem_chunk_removal(handle, local, node, size);
+		}
 
 		local->state = STARPU_INVALID;
 	}
@@ -813,14 +820,14 @@ static void _starpu_data_invalidate(void *data)
 
 	_starpu_spin_unlock(&handle->header_lock);
 
-	starpu_data_release_on_node(handle, -1);
+	starpu_data_release_on_node(handle, 0);
 }
 
 void starpu_data_invalidate(starpu_data_handle_t handle)
 {
 	STARPU_ASSERT(handle);
 
-	starpu_data_acquire_on_node(handle, -1, STARPU_W);
+	starpu_data_acquire_on_node(handle, 0, STARPU_W);
 
 	_starpu_data_invalidate(handle);
 }
@@ -829,7 +836,7 @@ void starpu_data_invalidate_submit(starpu_data_handle_t handle)
 {
 	STARPU_ASSERT(handle);
 
-	starpu_data_acquire_on_node_cb(handle, -1, STARPU_W, _starpu_data_invalidate, handle);
+	starpu_data_acquire_on_node_cb(handle, 0, STARPU_W, _starpu_data_invalidate, handle);
 }
 
 enum starpu_data_interface_id starpu_data_get_interface_id(starpu_data_handle_t handle)

+ 4 - 1
src/datawizard/interfaces/data_interface.h

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2009-2012  Université de Bordeaux 1
+ * Copyright (C) 2009-2012, 2014  Université de Bordeaux 1
  * Copyright (C) 2010, 2012, 2013, 2014  Centre National de la Recherche Scientifique
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -63,6 +63,9 @@ extern void _starpu_data_register_ram_pointer(starpu_data_handle_t handle,
 						void *ptr)
 	STARPU_ATTRIBUTE_INTERNAL;
 
+extern void _starpu_data_unregister_ram_pointer(starpu_data_handle_t handle)
+	STARPU_ATTRIBUTE_INTERNAL;
+
 extern int _starpu_data_is_multiformat_handle(starpu_data_handle_t handle);
 extern starpu_data_handle_t _starpu_data_get_data_handle_from_tag(int tag);
 

+ 14 - 6
src/datawizard/user_interactions.c

@@ -209,9 +209,14 @@ static inline void _starpu_data_acquire_continuation(void *arg)
 
 	STARPU_ASSERT(handle);
 
-	struct _starpu_data_replicate *replicate = &handle->per_node[wrapper->node];
+	if (wrapper->node >= 0)
+	{
+		int ret;
+		struct _starpu_data_replicate *replicate = &handle->per_node[wrapper->node];
 
-	_starpu_fetch_data_on_node(handle, replicate, wrapper->mode, 0, 0, NULL, NULL);
+		ret = _starpu_fetch_data_on_node(handle, replicate, wrapper->mode, 0, 0, NULL, NULL);
+		STARPU_ASSERT(!ret);
+	}
 
 	/* continuation of starpu_data_acquire */
 	STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock);
@@ -293,10 +298,13 @@ int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum star
  	* available again, otherwise we fetch the data directly */
 	if (!_starpu_attempt_to_submit_data_request_from_apps(handle, mode, _starpu_data_acquire_continuation, &wrapper))
 	{
-		/* no one has locked this data yet, so we proceed immediately */
-		struct _starpu_data_replicate *replicate = &handle->per_node[node];
-		int ret = _starpu_fetch_data_on_node(handle, replicate, mode, 0, 0, NULL, NULL);
-		STARPU_ASSERT(!ret);
+		if (node >= 0)
+		{
+			/* no one has locked this data yet, so we proceed immediately */
+			struct _starpu_data_replicate *replicate = &handle->per_node[node];
+			int ret = _starpu_fetch_data_on_node(handle, replicate, mode, 0, 0, NULL, NULL);
+			STARPU_ASSERT(!ret);
+		}
 	}
 	else
 	{