Browse Source

include/ src: fix how access mode of data is set and get when dealing with dynamic handles

Nathalie Furmento 10 years ago
parent
commit
1e80cd6515
3 changed files with 7 additions and 10 deletions
  1. 1 1
      include/starpu_task.h
  2. 1 1
      src/util/starpu_task_insert.c
  3. 5 8
      src/util/starpu_task_insert_utils.c

+ 1 - 1
include/starpu_task.h

@@ -245,7 +245,7 @@ struct starpu_task
 #define STARPU_CODELET_GET_MODE(codelet, i) (((codelet)->dyn_modes) ? (codelet)->dyn_modes[i] : (codelet)->modes[i])
 #define STARPU_CODELET_SET_MODE(codelet, mode, i) do { if ((codelet)->dyn_modes) (codelet)->dyn_modes[i] = mode; else (codelet)->modes[i] = mode; } while(0)
 
-#define STARPU_TASK_GET_MODE(task, i) ((task)->cl->nbuffers == STARPU_VARIABLE_NBUFFERS ? \
+#define STARPU_TASK_GET_MODE(task, i) ((task)->cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (task)->dyn_modes ? \
 						(((task)->dyn_modes) ? (task)->dyn_modes[i] : (task)->modes[i]) : \
 						STARPU_CODELET_GET_MODE((task)->cl, i) )
 #define STARPU_TASK_SET_MODE(task, mode, i) do { \

+ 1 - 1
src/util/starpu_task_insert.c

@@ -52,7 +52,7 @@ void starpu_codelet_unpack_args(void *_cl_arg, ...)
 
 		size_t arg_size;
 		memcpy(&arg_size, cl_arg+current_arg_offset, sizeof(arg_size));
-		current_arg_offset += sizeof(size_t);
+		current_arg_offset += sizeof(arg_size);
 
 		memcpy(argptr, cl_arg+current_arg_offset, arg_size);
 		current_arg_offset += arg_size;

+ 5 - 8
src/util/starpu_task_insert_utils.c

@@ -48,7 +48,7 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_lis
 	int nargs = 0;
 	char *_arg_buffer = NULL; // We would like a void* but we use a char* to allow pointer arithmetic
 	size_t _arg_buffer_size = 0;
-	size_t current_offset = sizeof(int);
+	size_t current_offset = sizeof(nargs);
 
 	while((arg_type = va_arg(varg_list, int)) != 0)
 	{
@@ -185,17 +185,14 @@ void _starpu_task_insert_check_nb_buffers(struct starpu_codelet *cl, struct star
 			int i;
 			*allocated_buffers = STARPU_NMAXBUFS * 2;
 			(*task)->dyn_handles = malloc(*allocated_buffers * sizeof(starpu_data_handle_t));
-			(*task)->dyn_modes = malloc(*allocated_buffers * sizeof(enum starpu_data_access_mode));
 			for(i=0 ; i<nbuffers ; i++)
 			{
 				(*task)->dyn_handles[i] = (*task)->handles[i];
 			}
-			if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS)
+			(*task)->dyn_modes = malloc(*allocated_buffers * sizeof(enum starpu_data_access_mode));
+			for(i=0 ; i<nbuffers ; i++)
 			{
-				for(i=0 ; i<nbuffers ; i++)
-				{
-					(*task)->dyn_modes[i] = (*task)->modes[i];
-				}
+				(*task)->dyn_modes[i] = ((*task)->cl->nbuffers == STARPU_VARIABLE_NBUFFERS) ? (*task)->modes[i] : STARPU_CODELET_GET_MODE((*task)->cl, i);
 			}
 		}
 		else
@@ -299,7 +296,7 @@ void _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **
 			{
 				_starpu_task_insert_check_nb_buffers(cl, task, &allocated_buffers, nbuffers);
 				STARPU_TASK_SET_HANDLE((*task), descrs[i].handle, nbuffers);
-				if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS)
+				if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (*task)->dyn_modes)
 					STARPU_TASK_SET_MODE(*task, descrs[i].mode, nbuffers);
 				else if (STARPU_CODELET_GET_MODE(cl, nbuffers))
 				{