Просмотр исходного кода

Check the reduction methods access modes at submission time, to provide nicer error messages

Also, cope with old code that does not set the commute flag
Samuel Thibault лет назад: 4
Родитель
Сommit
880dfb244b
2 измененных файлов с 23 добавлено и 7 удалено
  1. 1 1
      ChangeLog
  2. 22 6
      src/datawizard/reduction.c

+ 1 - 1
ChangeLog

@@ -66,7 +66,7 @@ Small features:
     to specify allocated size.
 
 Changes:
-  * Require redux codelet to expose the STARPU_COMMUTE flag, since StarPU
+  * The redux codelet should expose the STARPU_COMMUTE flag, since StarPU
     actually uses commutability.
 
 Small changes:

+ 22 - 6
src/datawizard/reduction.c

@@ -29,6 +29,28 @@ void starpu_data_set_reduction_methods(starpu_data_handle_t handle,
 {
 	_starpu_spin_lock(&handle->header_lock);
 
+	if (init_cl)
+	{
+		STARPU_ASSERT_MSG(init_cl->nbuffers == 1, "The initialization method has to take one STARPU_W parameter");
+		STARPU_ASSERT_MSG(init_cl->modes[0] == STARPU_W, "The initialization method has to take one STARPU_W parameter");
+	}
+	if (redux_cl)
+	{
+		STARPU_ASSERT_MSG(redux_cl->nbuffers == 2, "The reduction method has to take one STARPU_RW|STARPU_COMMUTE parameter and one STARPU_R parameter");
+		if (!(redux_cl->modes[0] & STARPU_COMMUTE)) {
+			static int _warned = 0;
+			STARPU_HG_DISABLE_CHECKING(_warned);
+			if (!_warned)
+			{
+				_STARPU_DISP("Warning: The reduction method should use STARPU_COMMUTE for its first parameter");
+				_warned = 1;
+			}
+			redux_cl->modes[0] |= STARPU_COMMUTE;
+		}
+		STARPU_ASSERT_MSG(redux_cl->modes[0] == (STARPU_RW | STARPU_COMMUTE), "The first parameter of the reduction method has to use STARPU_RW|STARPU_COMMUTE");
+		STARPU_ASSERT_MSG(redux_cl->modes[1] == STARPU_R, "The second parameter of the reduction method has to use STARPU_R");
+	}
+
 	_starpu_codelet_check_deprecated_fields(redux_cl);
 	_starpu_codelet_check_deprecated_fields(init_cl);
 
@@ -262,8 +284,6 @@ void _starpu_data_end_reduction_mode(starpu_data_handle_t handle)
 					if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 1)))
 						STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_R, 1);
 
-					STARPU_ASSERT_MSG((STARPU_CODELET_GET_MODE(redux_task->cl, 0) & ~STARPU_COMMUTE) == STARPU_RW, "First parameter of reduction codelet %p has to be RW", redux_task->cl);
-					STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 1) == STARPU_R, "Second parameter of reduction codelet %p has to be R", redux_task->cl);
 					if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 0) & STARPU_COMMUTE))
 					{
 						static int warned;
@@ -332,7 +352,6 @@ void _starpu_data_end_reduction_mode(starpu_data_handle_t handle)
 
 			if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 0)))
 				STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_W, 0);
-			STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 0) == STARPU_W, "Parameter of initialization codelet %p has to be W", redux_task->cl);
 
 			STARPU_TASK_SET_HANDLE(redux_task, handle, 0);
 
@@ -362,9 +381,6 @@ void _starpu_data_end_reduction_mode(starpu_data_handle_t handle)
 			if (!(STARPU_CODELET_GET_MODE(redux_task->cl, 1)))
 				STARPU_CODELET_SET_MODE(redux_task->cl, STARPU_R, 1);
 
-			STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 0) == STARPU_RW, "First parameter of reduction codelet %p has to be RW", redux_task->cl);
-			STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(redux_task->cl, 1) == STARPU_R, "Second parameter of reduction codelet %p has to be R", redux_task->cl);
-
 			STARPU_TASK_SET_HANDLE(redux_task, handle, 0);
 			STARPU_TASK_SET_HANDLE(redux_task, replicate_array[replicate], 1);