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

Fix setting diduse for a memory chunk: _starpu_memchunk_recently_used does not necessarily mean it was actually used, that could be a prefetch only. Make diduse marked from the tasks and from the data acquisitions instead

Samuel Thibault лет назад: 8
Родитель
Сommit
322115ff53
3 измененных файлов с 12 добавлено и 2 удалено
  1. 2 0
      src/datawizard/coherency.c
  2. 0 1
      src/datawizard/memalloc.c
  3. 10 1
      src/datawizard/user_interactions.c

+ 2 - 0
src/datawizard/coherency.c

@@ -1048,6 +1048,8 @@ int _starpu_fetch_task_input(struct starpu_task *task, struct _starpu_job *j, in
 		struct _starpu_data_replicate *local_replicate;
 
 		local_replicate = get_replicate(handle, mode, workerid, node);
+		if (local_replicate->mc)
+			local_replicate->mc->diduse = 1;
 
 		_STARPU_TASK_SET_INTERFACE(task , local_replicate->data_interface, index);
 

+ 0 - 1
src/datawizard/memalloc.c

@@ -1463,7 +1463,6 @@ void _starpu_memchunk_recently_used(struct _starpu_mem_chunk *mc, unsigned node)
 		/* user-allocated memory */
 		return;
 	_starpu_spin_lock(&mc_lock[node]);
-	mc->diduse = 1;
 	MC_LIST_ERASE(node, mc);
 	MC_LIST_PUSH_BACK(node, mc);
 	_starpu_spin_unlock(&mc_lock[node]);

+ 10 - 1
src/datawizard/user_interactions.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2009-2016  Université de Bordeaux
+ * Copyright (C) 2009-2017  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016  CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -82,6 +82,11 @@ static void _starpu_data_acquire_fetch_data_callback(void *arg)
 
 	wrapper->callback(wrapper->callback_arg);
 
+	struct _starpu_data_replicate *replicate =
+		wrapper->node >= 0 ? &handle->per_node[wrapper->node] : NULL;
+	if (replicate && replicate->mc)
+		replicate->mc->diduse = 1;
+
 	free(wrapper);
 }
 
@@ -216,6 +221,8 @@ static inline void _starpu_data_acquire_continuation(void *arg)
 
 	ret = _starpu_fetch_data_on_node(handle, wrapper->node, replicate, wrapper->mode, 0, 0, 0, NULL, NULL, 0, "_starpu_data_acquire_continuation");
 	STARPU_ASSERT(!ret);
+	if (replicate && replicate->mc)
+		replicate->mc->diduse = 1;
 
 	/* continuation of starpu_data_acquire */
 	STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock);
@@ -302,6 +309,8 @@ int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum star
 		/* no one has locked this data yet, so we proceed immediately */
 		int ret = _starpu_fetch_data_on_node(handle, node, replicate, mode, 0, 0, 0, NULL, NULL, 0, "starpu_data_acquire_on_node");
 		STARPU_ASSERT(!ret);
+		if (replicate && replicate->mc)
+			replicate->mc->diduse = 1;
 	}
 	else
 	{