|
@@ -16,10 +16,12 @@
|
|
|
|
|
|
#include <starpu.h>
|
|
|
#include <common/utils.h>
|
|
|
+#include <common/thread.h>
|
|
|
#include <datawizard/memory_manager.h>
|
|
|
|
|
|
static size_t global_size[STARPU_MAXNODES];
|
|
|
static size_t used_size[STARPU_MAXNODES];
|
|
|
+static starpu_pthread_mutex_t lock_nodes[STARPU_MAXNODES];
|
|
|
|
|
|
int _starpu_memory_manager_init()
|
|
|
{
|
|
@@ -29,6 +31,7 @@ int _starpu_memory_manager_init()
|
|
|
{
|
|
|
global_size[i] = 0;
|
|
|
used_size[i] = 0;
|
|
|
+ _STARPU_PTHREAD_MUTEX_INIT(&lock_nodes[i], NULL);
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -47,26 +50,33 @@ size_t _starpu_memory_manager_get_global_memory_size(unsigned node)
|
|
|
|
|
|
int _starpu_memory_manager_can_allocate_size(size_t size, unsigned node)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ _STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]);
|
|
|
if (global_size[node] == 0)
|
|
|
{
|
|
|
// We do not have information on the available size, let's suppose it is going to fit
|
|
|
used_size[node] += size;
|
|
|
- return 1;
|
|
|
+ ret = 1;
|
|
|
}
|
|
|
else if (used_size[node] + size < global_size[node])
|
|
|
{
|
|
|
used_size[node] += size;
|
|
|
- return 1;
|
|
|
+ ret = 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- return 0;
|
|
|
+ ret = 0;
|
|
|
}
|
|
|
+ _STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
void _starpu_memory_manager_deallocate_size(size_t size, unsigned node)
|
|
|
{
|
|
|
+ _STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]);
|
|
|
used_size[node] -= size;
|
|
|
+ _STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]);
|
|
|
}
|
|
|
|
|
|
ssize_t starpu_memory_get_available(unsigned node)
|