Przeglądaj źródła

src: define pack and unpack operations for bcsr data interface

Nathalie Furmento 8 lat temu
rodzic
commit
769eb7571d
1 zmienionych plików z 48 dodań i 1 usunięć
  1. 48 1
      src/datawizard/interfaces/bcsr_interface.c

+ 48 - 1
src/datawizard/interfaces/bcsr_interface.c

@@ -47,6 +47,8 @@ static size_t bcsr_interface_get_size(starpu_data_handle_t handle);
 static int bcsr_compare(void *data_interface_a, void *data_interface_b);
 static uint32_t footprint_bcsr_interface_crc32(starpu_data_handle_t handle);
 static starpu_ssize_t describe(void *data_interface, char *buf, size_t size);
+static int pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count);
+static int unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count);
 
 struct starpu_data_interface_ops starpu_interface_bcsr_ops =
 {
@@ -60,7 +62,10 @@ struct starpu_data_interface_ops starpu_interface_bcsr_ops =
 	.footprint = footprint_bcsr_interface_crc32,
 	.compare = bcsr_compare,
 	.describe = describe,
-	.handle_to_pointer = bcsr_handle_to_pointer
+	.handle_to_pointer = bcsr_handle_to_pointer,
+	.name = "STARPU_BCSR_INTERFACE",
+	.pack_data = pack_data,
+	.unpack_data = unpack_data
 };
 
 static void *bcsr_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node)
@@ -395,3 +400,45 @@ static starpu_ssize_t describe(void *data_interface, char *buf, size_t size)
 			(unsigned) bcsr->c,
 			(unsigned) bcsr->elemsize);
 }
+
+static int pack_data(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count)
+{
+	STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node));
+
+	struct starpu_bcsr_interface *bcsr = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, node);
+
+	*count = bcsr->nnz * sizeof(bcsr->colind[0]);
+	*count += (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]);
+	*count += bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize;
+
+	if (ptr != NULL)
+	{
+		starpu_malloc_flags(ptr, *count, 0);
+		char *tmp = *ptr;
+		memcpy(tmp, (void*)bcsr->colind, bcsr->nnz * sizeof(bcsr->colind[0]));
+		tmp += bcsr->nnz * sizeof(bcsr->colind[0]);
+		memcpy(tmp, (void*)bcsr->rowptr, (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]));
+		tmp += (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]);
+		memcpy(tmp, (void*)bcsr->nzval, bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize);
+	}
+
+	return 0;
+}
+
+static int unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count)
+{
+	STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node));
+
+	struct starpu_bcsr_interface *bcsr = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, node);
+
+	STARPU_ASSERT(count == (bcsr->nnz * sizeof(bcsr->colind[0]))+((bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]))+(bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize));
+
+	char *tmp = ptr;
+	memcpy((void*)bcsr->colind, tmp, bcsr->nnz * sizeof(bcsr->colind[0]));
+	tmp += bcsr->nnz * sizeof(bcsr->colind[0]);
+	memcpy((void*)bcsr->rowptr, tmp, (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]));
+	tmp += (bcsr->nrow + 1) * sizeof(bcsr->rowptr[0]);
+	memcpy((void*)bcsr->nzval, tmp, bcsr->r * bcsr->c * bcsr->nnz * bcsr->elemsize);
+	return 0;
+}
+