Browse Source

optimize allocating task buffers

Samuel Thibault 7 years ago
parent
commit
25352a708d
1 changed files with 10 additions and 8 deletions
  1. 10 8
      src/util/starpu_task_insert_utils.c

+ 10 - 8
src/util/starpu_task_insert_utils.c

@@ -203,15 +203,15 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_lis
 }
 }
 
 
 static
 static
-void _starpu_task_insert_check_nb_buffers(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int current_buffer)
+void _starpu_task_insert_data_make_room(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int current_buffer, int room)
 {
 {
-	if (current_buffer >= STARPU_NMAXBUFS)
+	if (current_buffer + room > STARPU_NMAXBUFS)
 	{
 	{
 		if (*allocated_buffers == 0)
 		if (*allocated_buffers == 0)
 		{
 		{
 			int i;
 			int i;
 			struct starpu_codelet *cl2 = task->cl;
 			struct starpu_codelet *cl2 = task->cl;
-			*allocated_buffers = STARPU_NMAXBUFS * 2;
+			*allocated_buffers = (current_buffer + room) * 2;
 			_STARPU_MALLOC(task->dyn_handles, *allocated_buffers * sizeof(starpu_data_handle_t));
 			_STARPU_MALLOC(task->dyn_handles, *allocated_buffers * sizeof(starpu_data_handle_t));
 			for(i=0 ; i<current_buffer ; i++)
 			for(i=0 ; i<current_buffer ; i++)
 			{
 			{
@@ -226,9 +226,9 @@ void _starpu_task_insert_check_nb_buffers(struct starpu_codelet *cl, struct star
 				}
 				}
 			}
 			}
 		}
 		}
-		else if (current_buffer >= *allocated_buffers)
+		else if (current_buffer + room > *allocated_buffers)
 		{
 		{
-			*allocated_buffers *= 2;
+			*allocated_buffers = (current_buffer + room) * 2;
 			_STARPU_REALLOC(task->dyn_handles, *allocated_buffers * sizeof(starpu_data_handle_t));
 			_STARPU_REALLOC(task->dyn_handles, *allocated_buffers * sizeof(starpu_data_handle_t));
 			if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || !cl->dyn_modes)
 			if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || !cl->dyn_modes)
 			{
 			{
@@ -244,7 +244,7 @@ static inline void starpu_task_insert_process_data_arg(struct starpu_codelet *cl
 	STARPU_ASSERT(cl != NULL);
 	STARPU_ASSERT(cl != NULL);
 	STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
 	STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
 
 
-	_starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer);
+	_starpu_task_insert_data_make_room(cl, task, allocated_buffers, *current_buffer, 1);
 
 
 	STARPU_TASK_SET_HANDLE(task, handle, *current_buffer);
 	STARPU_TASK_SET_HANDLE(task, handle, *current_buffer);
 	if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes))
 	if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes))
@@ -272,10 +272,11 @@ static inline void starpu_task_insert_process_data_array_arg(struct starpu_codel
 {
 {
 	STARPU_ASSERT(cl != NULL);
 	STARPU_ASSERT(cl != NULL);
 
 
+	_starpu_task_insert_data_make_room(cl, task, allocated_buffers, *current_buffer, nb_handles);
+
 	int i;
 	int i;
 	for(i=0 ; i<nb_handles ; i++)
 	for(i=0 ; i<nb_handles ; i++)
 	{
 	{
-		_starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer);
 		STARPU_TASK_SET_HANDLE(task, handles[i], *current_buffer);
 		STARPU_TASK_SET_HANDLE(task, handles[i], *current_buffer);
 		(*current_buffer)++;
 		(*current_buffer)++;
 	}
 	}
@@ -285,11 +286,12 @@ static inline void starpu_task_insert_process_data_mode_array_arg(struct starpu_
 {
 {
 	STARPU_ASSERT(cl != NULL);
 	STARPU_ASSERT(cl != NULL);
 
 
+	_starpu_task_insert_data_make_room(cl, task, allocated_buffers, *current_buffer, nb_descrs);
+
 	int i;
 	int i;
 	for(i=0 ; i<nb_descrs ; i++)
 	for(i=0 ; i<nb_descrs ; i++)
 	{
 	{
 		STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
 		STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
-		_starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer);
 		STARPU_TASK_SET_HANDLE(task, descrs[i].handle, *current_buffer);
 		STARPU_TASK_SET_HANDLE(task, descrs[i].handle, *current_buffer);
 		if (task->dyn_modes)
 		if (task->dyn_modes)
 		{
 		{