瀏覽代碼

port r15685 from 1.2: Fix missing dependencies when a task accesses the same data in R and W modes

Samuel Thibault 10 年之前
父節點
當前提交
4003417753
共有 1 個文件被更改,包括 29 次插入8 次删除
  1. 29 8
      src/core/dependencies/implicit_data_deps.c

+ 29 - 8
src/core/dependencies/implicit_data_deps.c

@@ -111,9 +111,27 @@ static void _starpu_add_sync_task(starpu_data_handle_t handle, struct starpu_tas
 	l = handle->last_submitted_accessors.next;
 	while (l != &handle->last_submitted_accessors)
 	{
-		if (l->task != ignored_task)
+		if (l->task == ignored_task)
+		{
+			/* Don't make pre_sync_task depend on post_sync_task!
+			 * but still drop from the list.
+			 * This happens notably when a task accesses several
+			 * times to the same data.
+			 */
+			struct _starpu_task_wrapper_dlist *next;
+			l->prev->next = l->next;
+			l->next->prev = l->prev;
+			l->task = NULL;
+			l->prev = NULL;
+			next = l->next;
+			l->next = NULL;
+			l = next;
+		}
+		else
+		{
 			naccessors++;
-		l = l->next;
+			l = l->next;
+		}
 	}
 	_STARPU_DEP_DEBUG("%d accessors\n", naccessors);
 
@@ -126,15 +144,14 @@ static void _starpu_add_sync_task(starpu_data_handle_t handle, struct starpu_tas
 		while (l != &handle->last_submitted_accessors)
 		{
 			STARPU_ASSERT(l->task);
-			if (l->task != ignored_task)
-			{
-				task_array[i++] = l->task;
-				_starpu_add_dependency(handle, l->task, pre_sync_task);
-				_STARPU_DEP_DEBUG("dep %p -> %p\n", l->task, pre_sync_task);
-			}
+			STARPU_ASSERT(l->task != ignored_task);
+			task_array[i++] = l->task;
+			_starpu_add_dependency(handle, l->task, pre_sync_task);
+			_STARPU_DEP_DEBUG("dep %p -> %p\n", l->task, pre_sync_task);
 
 			struct _starpu_task_wrapper_dlist *prev = l;
 			l = l->next;
+			prev->task = NULL;
 			prev->next = NULL;
 			prev->prev = NULL;
 		}
@@ -404,9 +421,13 @@ void _starpu_release_data_enforce_sequential_consistency(struct starpu_task *tas
 				;
 			STARPU_ASSERT(l == &handle->last_submitted_accessors);
 #endif
+			STARPU_ASSERT(task_dependency_slot->task == task);
 
 			task_dependency_slot->next->prev = task_dependency_slot->prev;
 			task_dependency_slot->prev->next = task_dependency_slot->next;
+			task_dependency_slot->task = NULL;
+			task_dependency_slot->next = NULL;
+			task_dependency_slot->prev = NULL;
 #ifndef STARPU_USE_FXT
 			if (_starpu_bound_recording)
 #endif