瀏覽代碼

mpi: Do not call the peek_data method when not defined in the interface

Samuel Thibault 4 年之前
父節點
當前提交
0f1d878461
共有 2 個文件被更改,包括 23 次插入4 次删除
  1. 9 2
      mpi/src/mpi/starpu_mpi_mpi.c
  2. 14 2
      mpi/src/nmad/starpu_mpi_nmad.c

+ 9 - 2
mpi/src/mpi/starpu_mpi_mpi.c

@@ -887,8 +887,15 @@ static void _starpu_mpi_handle_request_termination(struct _starpu_mpi_req *req)
 				}
 				else if (req->request_type == RECV_REQ)
 				{
-					starpu_data_peek_node(req->data_handle, req->node, req->ptr, req->count);
-					starpu_free_on_node_flags(req->node, (uintptr_t)req->ptr, req->count, 0);
+					if (starpu_data_get_interface_ops(req->data_handle)->peek_data)
+					{
+						starpu_data_peek_node(req->data_handle, req->node, req->ptr, req->count);
+						starpu_free_on_node_flags(req->node, (uintptr_t)req->ptr, req->count, 0);
+					}
+					else
+					{
+						starpu_data_unpack_node(req->data_handle, req->node, req->ptr, req->count);
+					}
 					starpu_memory_deallocate(req->node, req->count);
 				}
 			}

+ 14 - 2
mpi/src/nmad/starpu_mpi_nmad.c

@@ -346,8 +346,20 @@ void _starpu_mpi_handle_request_termination(struct _starpu_mpi_req* req)
 		if (req->registered_datatype == 0)
 		{
 			if (req->request_type == RECV_REQ)
-				starpu_data_peek_node(req->data_handle, req->node, req->ptr, req->count);
-			starpu_free_on_node_flags(req->node, (uintptr_t) req->ptr, req->count, 0);
+			{
+				if (starpu_data_get_interface_ops(req->data_handle)->peek_data)
+				{
+					starpu_data_peek_node(req->data_handle, req->node, req->ptr, req->count);
+					starpu_free_on_node_flags(req->node, (uintptr_t) req->ptr, req->count, 0);
+				}
+				else
+				{
+					// req->ptr is freed by starpu_data_unpack
+					starpu_data_unpack_node(req->data_handle, req->node, req->ptr, req->count);
+				}
+			}
+			else
+				starpu_free_on_node_flags(req->node, (uintptr_t) req->ptr, req->count, 0);
 		}
 		else
 		{