Browse Source

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 years ago
parent
commit
880dfb244b
2 changed files with 23 additions and 7 deletions
  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);