|
@@ -39,12 +39,10 @@ static struct _starpu_mem_chunk *mc_dirty_head[STARPU_MAXNODES];
|
|
|
static unsigned mc_nb[STARPU_MAXNODES], mc_clean_nb[STARPU_MAXNODES];
|
|
|
|
|
|
/* TODO: no home doesn't mean always clean, should push to larger memory nodes */
|
|
|
-/* TODO: REDUX always dirty */
|
|
|
-
|
|
|
#define MC_LIST_PUSH_BACK(node, mc) do { \
|
|
|
_starpu_mem_chunk_list_push_back(mc_list[node], mc); \
|
|
|
if ((mc)->clean || (mc)->home) \
|
|
|
- /* This is clean */ \
|
|
|
+ /* This is clean */ \
|
|
|
mc_clean_nb[node]++; \
|
|
|
else if (!mc_dirty_head[node]) \
|
|
|
/* This is the only dirty element for now */ \
|
|
@@ -52,6 +50,13 @@ static unsigned mc_nb[STARPU_MAXNODES], mc_clean_nb[STARPU_MAXNODES];
|
|
|
mc_nb[node]++; \
|
|
|
} while(0)
|
|
|
|
|
|
+#define MC_LIST_PUSH_CLEAN(node, mc) do { \
|
|
|
+ _starpu_mem_chunk_list_push_front(mc_list[node], mc); \
|
|
|
+ /* This is clean */ \
|
|
|
+ mc_clean_nb[node]++; \
|
|
|
+ mc_nb[node]++; \
|
|
|
+} while (0)
|
|
|
+
|
|
|
#define MC_LIST_ERASE(node, mc) do { \
|
|
|
if ((mc)->clean || (mc)->home) \
|
|
|
mc_clean_nb[node]--; /* One clean element less */ \
|
|
@@ -1330,6 +1335,21 @@ void _starpu_memchunk_recently_used(struct _starpu_mem_chunk *mc, unsigned node)
|
|
|
_starpu_spin_unlock(&mc_lock[node]);
|
|
|
}
|
|
|
|
|
|
+/* This memchunk will not be used in the close future, put it on the clean
|
|
|
+ * list, so we will to evict it first */
|
|
|
+void _starpu_memchunk_wont_use(struct _starpu_mem_chunk *mc, unsigned node)
|
|
|
+{
|
|
|
+ if (!mc)
|
|
|
+ /* user-allocated memory */
|
|
|
+ return;
|
|
|
+ _starpu_spin_lock(&mc_lock[node]);
|
|
|
+ MC_LIST_ERASE(node, mc);
|
|
|
+ /* Caller will schedule a clean transfer */
|
|
|
+ mc->clean = 1;
|
|
|
+ MC_LIST_PUSH_CLEAN(node, mc);
|
|
|
+ _starpu_spin_unlock(&mc_lock[node]);
|
|
|
+}
|
|
|
+
|
|
|
/* This memchunk is being written to, and thus becomes dirty */
|
|
|
void _starpu_memchunk_dirty(struct _starpu_mem_chunk *mc, unsigned node)
|
|
|
{
|