瀏覽代碼

src/datawizard/interfaces/csr_interface.c: implement pack and unpack operations for csr data interface

Nathalie Furmento 8 年之前
父節點
當前提交
b5517decc2
共有 1 個文件被更改,包括 49 次插入1 次删除
  1. 49 1
      src/datawizard/interfaces/csr_interface.c

+ 49 - 1
src/datawizard/interfaces/csr_interface.c

@@ -45,6 +45,8 @@ static size_t csr_interface_get_size(starpu_data_handle_t handle);
 static int csr_compare(void *data_interface_a, void *data_interface_b);
 static uint32_t footprint_csr_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_csr_ops =
 {
@@ -58,7 +60,9 @@ struct starpu_data_interface_ops starpu_interface_csr_ops =
 	.footprint = footprint_csr_interface_crc32,
 	.compare = csr_compare,
 	.describe = describe,
-	.name = "STARPU_CSR_INTERFACE"
+	.name = "STARPU_CSR_INTERFACE",
+	.pack_data = pack_data,
+	.unpack_data = unpack_data
 };
 
 static void register_csr_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface)
@@ -342,3 +346,47 @@ static starpu_ssize_t describe(void *data_interface, char *buf, size_t size)
 			(unsigned) csr->nrow,
 			(unsigned) csr->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_csr_interface *csr = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node);
+
+	// We first pack colind
+	*count = csr->nnz * sizeof(csr->colind[0]);
+	// Then rowptr
+	*count += (csr->nrow + 1) * sizeof(csr->rowptr[0]);
+	// Then nnzval
+	*count += csr->nnz * csr->elemsize;
+
+	if (ptr != NULL)
+	{
+		starpu_malloc_flags(ptr, *count, 0);
+		char *tmp = *ptr;
+		memcpy(tmp, (void*)csr->colind, csr->nnz * sizeof(csr->colind[0]));
+		tmp += csr->nnz * sizeof(csr->colind[0]);
+		memcpy(tmp, (void*)csr->rowptr, (csr->nrow + 1) * sizeof(csr->rowptr[0]));
+		tmp += (csr->nrow + 1) * sizeof(csr->rowptr[0]);
+		memcpy(tmp, (void*)csr->nzval, csr->nnz * csr->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_csr_interface *csr = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node);
+
+	STARPU_ASSERT(count == (csr->nnz * sizeof(csr->colind[0]))+((csr->nrow + 1) * sizeof(csr->rowptr[0]))+(csr->nnz * csr->elemsize));
+
+	char *tmp = ptr;
+	memcpy((void*)csr->colind, tmp, csr->nnz * sizeof(csr->colind[0]));
+	tmp += csr->nnz * sizeof(csr->colind[0]);
+	memcpy((void*)csr->rowptr, tmp, (csr->nrow + 1) * sizeof(csr->rowptr[0]));
+	tmp += (csr->nrow + 1) * sizeof(csr->rowptr[0]);
+	memcpy((void*)csr->nzval, tmp, csr->nnz * csr->elemsize);
+	return 0;
+}