Parcourir la source

add parameter size to function starpu_free_buffer_on_node()

Nathalie Furmento il y a 12 ans
Parent
commit
8fdc9fbc75

+ 2 - 2
doc/chapters/basic-api.texi

@@ -1202,8 +1202,8 @@ Allocate @var{size} bytes on node @var{dst_node}. This returns 0 if allocation
 failed, the allocation method should then return -ENOMEM as allocated size.
 @end deftypefun
 
-@deftypefun void starpu_free_buffer_on_node (uint32_t @var{dst_node}, uintptr_t @var{data})
-Free @var{data} on node @var{dst_node}.
+@deftypefun void starpu_free_buffer_on_node (uint32_t @var{dst_node}, uintptr_t @var{data}, size_t @var{size})
+Free @var{data} of @var{size} bytes on node @var{dst_node}.
 @end deftypefun
 
 @node Data Partition

+ 7 - 7
examples/filters/custom_mf/custom_interface.c

@@ -183,28 +183,28 @@ static ssize_t allocate_custom_buffer_on_node(void *data_interface, uint32_t nod
 #ifdef STARPU_USE_OPENCL
 fail_opencl:
 #ifdef STARPU_USE_CUDA
-	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cuda_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cuda_ptr, size);
 #endif
 #endif
 #ifdef STARPU_USE_CUDA
 fail_cuda:
 #endif
-	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cpu_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cpu_ptr, size);
 fail_cpu:
 	return -ENOMEM;
 }
 
 static void free_custom_buffer_on_node(void *data_interface, uint32_t node)
 {
-	struct custom_data_interface *custom_interface;
-	custom_interface = (struct custom_data_interface *) data_interface;
+	struct custom_data_interface *custom_interface = (struct custom_data_interface *) data_interface;
+	size_t size = custom_interface->nx * custom_interface->ops->cpu_elemsize;
 
-	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cpu_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cpu_ptr, size);
 #ifdef STARPU_USE_CUDA
-	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cuda_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->cuda_ptr, size);
 #endif
 #ifdef STARPU_USE_OPENCL
-	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->opencl_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) custom_interface->opencl_ptr, size);
 #endif
 }
 

+ 5 - 3
examples/interface/complex_interface.c

@@ -80,7 +80,7 @@ static starpu_ssize_t complex_allocate_data_on_node(void *data_interface, uint32
 	return 2*requested_memory;
 
 fail_imaginary:
-	starpu_free_buffer_on_node(node, (uintptr_t) addr_real);
+	starpu_free_buffer_on_node(node, (uintptr_t) addr_real, requested_memory);
 fail_real:
 	return -ENOMEM;
 }
@@ -88,8 +88,10 @@ fail_real:
 static void complex_free_data_on_node(void *data_interface, uint32_t node)
 {
 	struct starpu_complex_interface *complex_interface = (struct starpu_complex_interface *) data_interface;
-	starpu_free_buffer_on_node(node, (uintptr_t) complex_interface->real);
-	starpu_free_buffer_on_node(node, (uintptr_t) complex_interface->imaginary);
+	ssize_t requested_memory = complex_interface->nx * sizeof(complex_interface->real[0]);
+
+	starpu_free_buffer_on_node(node, (uintptr_t) complex_interface->real, requested_memory);
+	starpu_free_buffer_on_node(node, (uintptr_t) complex_interface->imaginary, requested_memory);
 }
 
 static size_t complex_get_size(starpu_data_handle_t handle)

+ 1 - 1
include/starpu_data_interfaces.h

@@ -147,7 +147,7 @@ void starpu_data_register_same(starpu_data_handle_t *handledst, starpu_data_hand
 /* Allocate SIZE bytes on node NODE */
 uintptr_t starpu_allocate_buffer_on_node(uint32_t dst_node, size_t size);
 /* Free ADDR on node NODE */
-void starpu_free_buffer_on_node(uint32_t dst_node, uintptr_t addr);
+void starpu_free_buffer_on_node(uint32_t dst_node, uintptr_t addr, size_t size);
 
 /* Return the pointer associated with HANDLE on node NODE or NULL if HANDLE's
  * interface does not support this operation or data for this handle is not

+ 10 - 5
src/datawizard/interfaces/bcsr_interface.c

@@ -296,9 +296,9 @@ static ssize_t allocate_bcsr_buffer_on_node(void *data_interface_, uint32_t dst_
 	return allocated_memory;
 
 fail_rowptr:
-	starpu_free_buffer_on_node(dst_node, addr_colind);
+	starpu_free_buffer_on_node(dst_node, addr_colind, nnz*sizeof(uint32_t));
 fail_colind:
-	starpu_free_buffer_on_node(dst_node, addr_nzval);
+	starpu_free_buffer_on_node(dst_node, addr_nzval, nnz*r*c*elemsize);
 fail_nzval:
 	/* allocation failed */
 	return -ENOMEM;
@@ -307,10 +307,15 @@ fail_nzval:
 static void free_bcsr_buffer_on_node(void *data_interface, uint32_t node)
 {
 	struct starpu_bcsr_interface *bcsr_interface = (struct starpu_bcsr_interface *) data_interface;
+	uint32_t nnz = bcsr_interface->nnz;
+	uint32_t nrow = bcsr_interface->nrow;
+	size_t elemsize = bcsr_interface->elemsize;
+	uint32_t r = bcsr_interface->r;
+	uint32_t c = bcsr_interface->c;
 
-	starpu_free_buffer_on_node(node, bcsr_interface->nzval);
-	starpu_free_buffer_on_node(node, (uintptr_t) bcsr_interface->colind);
-	starpu_free_buffer_on_node(node, (uintptr_t) bcsr_interface->rowptr);
+	starpu_free_buffer_on_node(node, bcsr_interface->nzval, nnz*r*c*elemsize);
+	starpu_free_buffer_on_node(node, (uintptr_t) bcsr_interface->colind, nnz*sizeof(uint32_t));
+	starpu_free_buffer_on_node(node, (uintptr_t) bcsr_interface->rowptr, (nrow+1)*sizeof(uint32_t));
 }
 
 #ifdef STARPU_USE_CUDA

+ 5 - 1
src/datawizard/interfaces/block_interface.c

@@ -327,8 +327,12 @@ static ssize_t allocate_block_buffer_on_node(void *data_interface_, uint32_t dst
 static void free_block_buffer_on_node(void *data_interface, uint32_t node)
 {
 	struct starpu_block_interface *block_interface = (struct starpu_block_interface *) data_interface;
+	uint32_t nx = block_interface->nx;
+	uint32_t ny = block_interface->ny;
+	uint32_t nz = block_interface->nz;
+	size_t elemsize = block_interface->elemsize;
 
-	starpu_free_buffer_on_node(node, block_interface->ptr);
+	starpu_free_buffer_on_node(node, block_interface->ptr, nx*ny*nz*elemsize);
 }
 
 #ifdef STARPU_USE_CUDA

+ 8 - 7
src/datawizard/interfaces/coo_interface.c

@@ -380,9 +380,9 @@ allocate_coo_buffer_on_node(void *data_interface, uint32_t dst_node)
 	return n_values * (sizeof(coo_interface->columns[0]) + sizeof(coo_interface->rows[0]) + elemsize);
 
 fail_values:
-	starpu_free_buffer_on_node(dst_node, (uintptr_t) addr_rows);
+	starpu_free_buffer_on_node(dst_node, (uintptr_t) addr_rows, n_values * sizeof(coo_interface->rows[0]));
 fail_rows:
-	starpu_free_buffer_on_node(dst_node, (uintptr_t) addr_columns);
+	starpu_free_buffer_on_node(dst_node, (uintptr_t) addr_columns, n_values * sizeof(coo_interface->columns[0]));
 fail_columns:
 	return -ENOMEM;
 }
@@ -390,12 +390,13 @@ fail_columns:
 static void
 free_coo_buffer_on_node(void *data_interface, uint32_t node)
 {
-	struct starpu_coo_interface *coo_interface =
-		(struct starpu_coo_interface *) data_interface;
+	struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface;
+	uint32_t n_values = coo_interface->n_values;
+	size_t elemsize = coo_interface->elemsize;
 
-	starpu_free_buffer_on_node(node, (uintptr_t) coo_interface->columns);
-	starpu_free_buffer_on_node(node, (uintptr_t) coo_interface->rows);
-	starpu_free_buffer_on_node(node, coo_interface->values);
+	starpu_free_buffer_on_node(node, (uintptr_t) coo_interface->columns, n_values * sizeof(coo_interface->columns[0]));
+	starpu_free_buffer_on_node(node, (uintptr_t) coo_interface->rows, n_values * sizeof(coo_interface->rows[0]));
+	starpu_free_buffer_on_node(node, coo_interface->values, n_values * elemsize);
 }
 
 static size_t

+ 8 - 5
src/datawizard/interfaces/csr_interface.c

@@ -271,9 +271,9 @@ static ssize_t allocate_csr_buffer_on_node(void *data_interface_, uint32_t dst_n
 	return allocated_memory;
 
 fail_rowptr:
-	starpu_free_buffer_on_node(dst_node, (uintptr_t) addr_colind);
+	starpu_free_buffer_on_node(dst_node, (uintptr_t) addr_colind, nnz*sizeof(uint32_t));
 fail_colind:
-	starpu_free_buffer_on_node(dst_node, addr_nzval);
+	starpu_free_buffer_on_node(dst_node, addr_nzval, nnz*elemsize);
 fail_nzval:
 	/* allocation failed */
 	return -ENOMEM;
@@ -282,10 +282,13 @@ fail_nzval:
 static void free_csr_buffer_on_node(void *data_interface, uint32_t node)
 {
 	struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) data_interface;
+	uint32_t nnz = csr_interface->nnz;
+	uint32_t nrow = csr_interface->nrow;
+	size_t elemsize = csr_interface->elemsize;
 
-	starpu_free_buffer_on_node(node, csr_interface->nzval);
-	starpu_free_buffer_on_node(node, (uintptr_t) csr_interface->colind);
-	starpu_free_buffer_on_node(node, (uintptr_t) csr_interface->rowptr);
+	starpu_free_buffer_on_node(node, csr_interface->nzval, nnz*elemsize);
+	starpu_free_buffer_on_node(node, (uintptr_t) csr_interface->colind, nnz*sizeof(uint32_t));
+	starpu_free_buffer_on_node(node, (uintptr_t) csr_interface->rowptr, (nrow+1)*sizeof(uint32_t));
 }
 
 #ifdef STARPU_USE_CUDA

+ 4 - 1
src/datawizard/interfaces/matrix_interface.c

@@ -305,8 +305,11 @@ static ssize_t allocate_matrix_buffer_on_node(void *data_interface_, uint32_t ds
 static void free_matrix_buffer_on_node(void *data_interface, uint32_t node)
 {
 	struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) data_interface;
+	uint32_t nx = matrix_interface->nx;
+	uint32_t ny = matrix_interface->ny;
+	size_t elemsize = matrix_interface->elemsize;
 
-	starpu_free_buffer_on_node(node, matrix_interface->ptr);
+	starpu_free_buffer_on_node(node, matrix_interface->ptr, nx*ny*elemsize);
 }
 
 #ifdef STARPU_USE_CUDA

+ 8 - 5
src/datawizard/interfaces/multiformat_interface.c

@@ -275,13 +275,13 @@ static ssize_t allocate_multiformat_buffer_on_node(void *data_interface_, uint32
 #ifdef STARPU_USE_OPENCL
 fail_opencl:
 #ifdef STARPU_USE_CUDA
-	starpu_free_buffer_on_node(dst_node, (uintptr_t) multiformat_interface->cuda_ptr);
+	starpu_free_buffer_on_node(dst_node, (uintptr_t) multiformat_interface->cuda_ptr, multiformat_interface->nx * multiformat_interface->ops->cuda_elemsize);
 #endif
 #endif
 #ifdef STARPU_USE_CUDA
 fail_cuda:
 #endif
-	starpu_free_buffer_on_node(dst_node, (uintptr_t) multiformat_interface->cpu_ptr);
+	starpu_free_buffer_on_node(dst_node, (uintptr_t) multiformat_interface->cpu_ptr, multiformat_interface->nx * multiformat_interface->ops->cpu_elemsize);
 fail_cpu:
 	return -ENOMEM;
 }
@@ -291,14 +291,17 @@ static void free_multiformat_buffer_on_node(void *data_interface, uint32_t node)
 	struct starpu_multiformat_interface *multiformat_interface;
 	multiformat_interface = (struct starpu_multiformat_interface *) data_interface;
 
-	starpu_free_buffer_on_node(node, (uintptr_t) multiformat_interface->cpu_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) multiformat_interface->cpu_ptr,
+				   multiformat_interface->nx * multiformat_interface->ops->cpu_elemsize);
 	multiformat_interface->cpu_ptr = NULL;
 #ifdef STARPU_USE_CUDA
-	starpu_free_buffer_on_node(node, (uintptr_t) multiformat_interface->cuda_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) multiformat_interface->cuda_ptr,
+				   multiformat_interface->nx * multiformat_interface->ops->cuda_elemsize);
 	multiformat_interface->cuda_ptr = NULL;
 #endif
 #ifdef STARPU_USE_OPENCL
-	starpu_free_buffer_on_node(node, (uintptr_t) multiformat_interface->opencl_ptr);
+	starpu_free_buffer_on_node(node, (uintptr_t) multiformat_interface->opencl_ptr,
+				   multiformat_interface->nx * multiformat_interface->ops->opencl_elemsize);
 	multiformat_interface->opencl_ptr = NULL;
 #endif
 }

+ 2 - 1
src/datawizard/interfaces/variable_interface.c

@@ -214,7 +214,8 @@ static ssize_t allocate_variable_buffer_on_node(void *data_interface_, uint32_t
 
 static void free_variable_buffer_on_node(void *data_interface, uint32_t node)
 {
-	starpu_free_buffer_on_node(node, STARPU_VARIABLE_GET_PTR(data_interface));
+	struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) data_interface;
+	starpu_free_buffer_on_node(node, variable_interface->ptr, variable_interface->elemsize);
 }
 
 #ifdef STARPU_USE_CUDA

+ 3 - 1
src/datawizard/interfaces/vector_interface.c

@@ -262,8 +262,10 @@ static ssize_t allocate_vector_buffer_on_node(void *data_interface_, uint32_t ds
 static void free_vector_buffer_on_node(void *data_interface, uint32_t node)
 {
 	struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) data_interface;
+	uint32_t nx = vector_interface->nx;
+	size_t elemsize = vector_interface->elemsize;
 
-	starpu_free_buffer_on_node(node, vector_interface->ptr);
+	starpu_free_buffer_on_node(node, vector_interface->ptr, nx*elemsize);
 }
 
 #ifdef STARPU_USE_CUDA