ソースを参照

_starpu_add_writer_after_readers() : only declare task_array and call starpu_task_declare_deps_array() if nreaders is > 0.

* Avoids declaring a VLA of size 0.
* Avoids calling starpu_task_declare_deps_array() when it is perfectly sure that it will return immediatly.
Cyril Roelandt 13 年 前
コミット
aa29dfc519
共有1 個のファイルを変更した17 個の追加14 個の削除を含む
  1. 17 14
      src/core/dependencies/implicit_data_deps.c

+ 17 - 14
src/core/dependencies/implicit_data_deps.c

@@ -80,21 +80,25 @@ static void _starpu_add_writer_after_readers(starpu_data_handle_t handle, struct
 	}
 	_STARPU_DEP_DEBUG("%d readers\n", nreaders);
 
-	/* Put all tasks in the list into task_array */
-	struct starpu_task *task_array[nreaders];
-	unsigned i = 0;
-	l = handle->last_submitted_readers;
-	while (l)
+	if (nreaders > 0)
 	{
-		STARPU_ASSERT(l->task);
-		if (l->task != post_sync_task) {
-			task_array[i++] = l->task;
-			_STARPU_DEP_DEBUG("dep %p -> %p\n", l->task, pre_sync_task);
-		}
+		/* Put all tasks in the list into task_array */
+		struct starpu_task *task_array[nreaders];
+		unsigned i = 0;
+		l = handle->last_submitted_readers;
+		while (l)
+		{
+			STARPU_ASSERT(l->task);
+			if (l->task != post_sync_task) {
+				task_array[i++] = l->task;
+				_STARPU_DEP_DEBUG("dep %p -> %p\n", l->task, pre_sync_task);
+			}
 
-		struct _starpu_task_wrapper_list *prev = l;
-		l = l->next;
-		free(prev);
+			struct _starpu_task_wrapper_list *prev = l;
+			l = l->next;
+			free(prev);
+		}
+		starpu_task_declare_deps_array(pre_sync_task, nreaders, task_array);
 	}
 #ifndef STARPU_USE_FXT
 	if (_starpu_bound_recording)
@@ -121,7 +125,6 @@ static void _starpu_add_writer_after_readers(starpu_data_handle_t handle, struct
 	handle->last_submitted_readers = NULL;
 	handle->last_submitted_writer = post_sync_task;
 
-	starpu_task_declare_deps_array(pre_sync_task, nreaders, task_array);
 }
 /* Write after Write (WAW) */
 static void _starpu_add_writer_after_writer(starpu_data_handle_t handle, struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task)