瀏覽代碼

mpi redux: Fix setting dependencies between taskB and taskC

taskA might finished very quickly, and thus taskB get submitted or even
complete very quickly, even before we can add dependencies between taskB and
taskC, and then the validity of taskB is questionable.

Better create taskC early and add dependencies before submitting taskA
(and thus before submitting taskB).
Samuel Thibault 5 年之前
父節點
當前提交
aa1d2ebd06
共有 1 個文件被更改,包括 8 次插入9 次删除
  1. 8 9
      mpi/src/starpu_mpi_task_insert.c

+ 8 - 9
mpi/src/starpu_mpi_task_insert.c

@@ -818,8 +818,12 @@ void starpu_mpi_redux_data_prio(MPI_Comm comm, starpu_data_handle_t data_handle,
 	// need to count how many nodes have the data in redux mode
 	if (me == rank)
 	{
-		int i, j=0;
-		struct starpu_task *taskBs[nb_nodes];
+		int i;
+
+		// taskC depends on all taskBs created
+		struct starpu_task *taskC = starpu_task_create();
+		taskC->cl = &_starpu_mpi_redux_data_readwrite_cl;
+		STARPU_TASK_SET_HANDLE(taskC, data_handle, 0);
 
 		for(i=0 ; i<nb_nodes ; i++)
 		{
@@ -857,8 +861,8 @@ void starpu_mpi_redux_data_prio(MPI_Comm comm, starpu_data_handle_t data_handle,
 				args->taskB->cl = args->data_handle->redux_cl;
 				args->taskB->sequential_consistency = 0;
 				STARPU_TASK_SET_HANDLE(args->taskB, args->data_handle, 0);
-				taskBs[j] = args->taskB;
-				j++;
+
+				starpu_task_declare_deps_array(taskC, 1, &args->taskB);
 
 				// Submit taskA
 				starpu_task_insert(&_starpu_mpi_redux_data_read_cl,
@@ -868,11 +872,6 @@ void starpu_mpi_redux_data_prio(MPI_Comm comm, starpu_data_handle_t data_handle,
 			}
 		}
 
-		// Submit taskC which depends on all taskBs created
-		struct starpu_task *taskC = starpu_task_create();
-		taskC->cl = &_starpu_mpi_redux_data_readwrite_cl;
-		STARPU_TASK_SET_HANDLE(taskC, data_handle, 0);
-		starpu_task_declare_deps_array(taskC, j, taskBs);
 		int ret = starpu_task_submit(taskC);
 		STARPU_ASSERT(ret == 0);
 	}