|
@@ -381,7 +381,11 @@ static size_t free_memory_on_node(struct _starpu_mem_chunk *mc, unsigned node)
|
|
data_interface = mc->chunk_interface;
|
|
data_interface = mc->chunk_interface;
|
|
STARPU_ASSERT(data_interface);
|
|
STARPU_ASSERT(data_interface);
|
|
|
|
|
|
|
|
+#ifdef STARPU_USE_NUMA
|
|
|
|
+ if (handle && (starpu_node_get_kind(node) == STARPU_CPU_RAM))
|
|
|
|
+#else /* STARPU_USE_NUMA */
|
|
if (handle && node == STARPU_MAIN_RAM)
|
|
if (handle && node == STARPU_MAIN_RAM)
|
|
|
|
+#endif /* STARPU_USE_NUMA */
|
|
_starpu_data_unregister_ram_pointer(handle);
|
|
_starpu_data_unregister_ram_pointer(handle);
|
|
|
|
|
|
_STARPU_TRACE_START_FREE(node, mc->size);
|
|
_STARPU_TRACE_START_FREE(node, mc->size);
|
|
@@ -629,7 +633,14 @@ static unsigned try_to_reuse_mem_chunk(struct _starpu_mem_chunk *mc, unsigned no
|
|
* away after writing it back to main memory */
|
|
* away after writing it back to main memory */
|
|
_starpu_spin_unlock(&mc_lock[node]);
|
|
_starpu_spin_unlock(&mc_lock[node]);
|
|
_STARPU_TRACE_START_WRITEBACK(node);
|
|
_STARPU_TRACE_START_WRITEBACK(node);
|
|
|
|
+#ifdef STARPU_USE_NUMA
|
|
|
|
+ int home_node = old_data->home_node;
|
|
|
|
+ if (home_node < 0 || (_starpu_node_get_kind(home_node) != STARPU_CPU_RAM))
|
|
|
|
+ home_node = STARPU_MAIN_RAM;
|
|
|
|
+ res = transfer_subtree_to_node(old_data, node, home_node);
|
|
|
|
+#else /* STARPU_USE_NUMA */
|
|
res = transfer_subtree_to_node(old_data, node, STARPU_MAIN_RAM);
|
|
res = transfer_subtree_to_node(old_data, node, STARPU_MAIN_RAM);
|
|
|
|
+#endif /* STARPU_USE_NUMA */
|
|
_STARPU_TRACE_END_WRITEBACK(node);
|
|
_STARPU_TRACE_END_WRITEBACK(node);
|
|
_starpu_spin_lock(&mc_lock[node]);
|
|
_starpu_spin_lock(&mc_lock[node]);
|
|
|
|
|
|
@@ -1436,11 +1447,15 @@ int _starpu_allocate_memory_on_node(starpu_data_handle_t handle, struct _starpu_
|
|
replicate->allocated = 1;
|
|
replicate->allocated = 1;
|
|
replicate->automatically_allocated = 1;
|
|
replicate->automatically_allocated = 1;
|
|
|
|
|
|
|
|
+#ifdef STARPU_USE_NUMA
|
|
|
|
+ if (replicate->relaxed_coherency == 0 && (starpu_node_get_kind(dst_node) == STARPU_CPU_RAM))
|
|
|
|
+#else /* STARPU_USE_NUMA */
|
|
if (replicate->relaxed_coherency == 0 && dst_node == STARPU_MAIN_RAM)
|
|
if (replicate->relaxed_coherency == 0 && dst_node == STARPU_MAIN_RAM)
|
|
|
|
+#endif /* STARPU_USE_NUMA */
|
|
{
|
|
{
|
|
/* We are allocating the buffer in main memory, also register it
|
|
/* We are allocating the buffer in main memory, also register it
|
|
* for the gcc plugin. */
|
|
* for the gcc plugin. */
|
|
- void *ptr = starpu_data_handle_to_pointer(handle, STARPU_MAIN_RAM);
|
|
|
|
|
|
+ void *ptr = starpu_data_handle_to_pointer(handle, dst_node);
|
|
if (ptr != NULL)
|
|
if (ptr != NULL)
|
|
{
|
|
{
|
|
_starpu_data_register_ram_pointer(handle, ptr);
|
|
_starpu_data_register_ram_pointer(handle, ptr);
|
|
@@ -1601,14 +1616,34 @@ choose_target(starpu_data_handle_t handle, unsigned node)
|
|
size_t size_handle = _starpu_data_get_size(handle);
|
|
size_t size_handle = _starpu_data_get_size(handle);
|
|
if (handle->home_node != -1)
|
|
if (handle->home_node != -1)
|
|
/* try to push on RAM if we can before to push on disk */
|
|
/* try to push on RAM if we can before to push on disk */
|
|
|
|
+#ifdef STARPU_USE_NUMA
|
|
|
|
+ if(starpu_node_get_kind(handle->home_node) == STARPU_DISK_RAM && (starpu_node_get_kind(node) != STARPU_CPU_RAM))
|
|
|
|
+#else /* STARPU_USE_NUMA */
|
|
if(starpu_node_get_kind(handle->home_node) == STARPU_DISK_RAM && node != STARPU_MAIN_RAM)
|
|
if(starpu_node_get_kind(handle->home_node) == STARPU_DISK_RAM && node != STARPU_MAIN_RAM)
|
|
|
|
+#endif /* STARPU_USE_NUMA */
|
|
{
|
|
{
|
|
|
|
+#ifdef STARPU_USE_NUMA
|
|
|
|
+ int i;
|
|
|
|
+ unsigned nb_numa_nodes = _starpu_get_nb_numa_nodes();
|
|
|
|
+ for (i=0; i<nb_numa_nodes; i++)
|
|
|
|
+ {
|
|
|
|
+ unsigned id = _starpu_numaid_to_memnode(i);
|
|
|
|
+ if (handle->per_node[id].allocated ||
|
|
|
|
+ _starpu_memory_manager_test_allocate_size(id, size_handle) == 1)
|
|
|
|
+ {
|
|
|
|
+ target = id;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (target == -1)
|
|
|
|
+#else /* STARPU_USE_NUMA */
|
|
if (handle->per_node[STARPU_MAIN_RAM].allocated ||
|
|
if (handle->per_node[STARPU_MAIN_RAM].allocated ||
|
|
_starpu_memory_manager_test_allocate_size(STARPU_MAIN_RAM, size_handle) == 1)
|
|
_starpu_memory_manager_test_allocate_size(STARPU_MAIN_RAM, size_handle) == 1)
|
|
{
|
|
{
|
|
target = STARPU_MAIN_RAM;
|
|
target = STARPU_MAIN_RAM;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
|
|
+#endif /* STARPU_USE_NUMA */
|
|
{
|
|
{
|
|
target = get_better_disk_can_accept_size(handle, node);
|
|
target = get_better_disk_can_accept_size(handle, node);
|
|
}
|
|
}
|
|
@@ -1623,12 +1658,34 @@ choose_target(starpu_data_handle_t handle, unsigned node)
|
|
{
|
|
{
|
|
/* handle->home_node == -1 */
|
|
/* handle->home_node == -1 */
|
|
/* no place for datas in RAM, we push on disk */
|
|
/* no place for datas in RAM, we push on disk */
|
|
|
|
+#ifdef STARPU_USE_NUMA
|
|
|
|
+ if (starpu_node_get_kind(node) == STARPU_CPU_RAM)
|
|
|
|
+#else /* STARPU_USE_NUMA */
|
|
if (node == STARPU_MAIN_RAM)
|
|
if (node == STARPU_MAIN_RAM)
|
|
|
|
+#endif /* STARPU_USE_NUMA */
|
|
{
|
|
{
|
|
target = get_better_disk_can_accept_size(handle, node);
|
|
target = get_better_disk_can_accept_size(handle, node);
|
|
}
|
|
}
|
|
/* node != 0 */
|
|
/* node != 0 */
|
|
/* try to push data to RAM if we can before to push on disk*/
|
|
/* try to push data to RAM if we can before to push on disk*/
|
|
|
|
+#ifdef STARPU_USE_NUMA
|
|
|
|
+ else {
|
|
|
|
+ int i;
|
|
|
|
+ unsigned nb_numa_nodes = _starpu_get_nb_numa_nodes();
|
|
|
|
+ for (i=0; i<nb_numa_nodes; i++)
|
|
|
|
+ {
|
|
|
|
+ unsigned id = _starpu_numaid_to_memnode(i);
|
|
|
|
+ if (handle->per_node[id].allocated ||
|
|
|
|
+ _starpu_memory_manager_test_allocate_size(id, size_handle) == 1)
|
|
|
|
+ {
|
|
|
|
+ target = id;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /* no place in RAM */
|
|
|
|
+ if (target == -1)
|
|
|
|
+#else /* STARPU_USE_NUMA */
|
|
else if (handle->per_node[STARPU_MAIN_RAM].allocated ||
|
|
else if (handle->per_node[STARPU_MAIN_RAM].allocated ||
|
|
_starpu_memory_manager_test_allocate_size(STARPU_MAIN_RAM, size_handle) == 1)
|
|
_starpu_memory_manager_test_allocate_size(STARPU_MAIN_RAM, size_handle) == 1)
|
|
{
|
|
{
|
|
@@ -1636,6 +1693,7 @@ choose_target(starpu_data_handle_t handle, unsigned node)
|
|
}
|
|
}
|
|
/* no place in RAM */
|
|
/* no place in RAM */
|
|
else
|
|
else
|
|
|
|
+#endif /* STARPU_USE_NUMA */
|
|
{
|
|
{
|
|
target = get_better_disk_can_accept_size(handle, node);
|
|
target = get_better_disk_can_accept_size(handle, node);
|
|
}
|
|
}
|