|
@@ -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;
|
|
|
+}
|