Browse Source

Cleanup the various data interfaces by using the
starpu_data_get_interface_on_node whenever possible.

Cédric Augonnet 15 years ago
parent
commit
b99221a3bb

+ 3 - 2
src/datawizard/coherency.c

@@ -369,8 +369,9 @@ int fetch_task_input(struct starpu_task *task, uint32_t mask)
 		if (STARPU_UNLIKELY(ret))
 			goto enomem;
 
-		memcpy(&interface[index], &state->interface[local_memory_node], 
-				sizeof(starpu_data_interface_t));
+		void *src_interface = starpu_data_get_interface_on_node(state, local_memory_node);
+
+		memcpy(&interface[index], src_interface, sizeof(starpu_data_interface_t));
 	}
 
 	TRACE_END_FETCH_INPUT(NULL);

+ 13 - 7
src/datawizard/interfaces/bcsr_filters.c

@@ -24,14 +24,17 @@ unsigned starpu_canonical_block_filter_bcsr(starpu_filter *f __attribute__((unus
 {
 	unsigned nchunks;
 
-	uint32_t nnz = root_data->interface[0].bcsr.nnz;
+	struct starpu_bcsr_interface_s *interface =
+		starpu_data_get_interface_on_node(root_data, 0);
 
-	size_t elemsize = root_data->interface[0].bcsr.elemsize;
-	uint32_t firstentry = root_data->interface[0].bcsr.firstentry;
+	uint32_t nnz = interface->nnz;
+
+	size_t elemsize = interface->elemsize;
+	uint32_t firstentry = interface->firstentry;
 
 	/* size of the tiles */
-	uint32_t r = root_data->interface[0].bcsr.r;
-	uint32_t c = root_data->interface[0].bcsr.c;
+	uint32_t r = interface->r;
+	uint32_t c = interface->c;
 
 	/* we create as many subdata as there are blocks ... */
 	nchunks = nnz;
@@ -54,7 +57,8 @@ unsigned starpu_canonical_block_filter_bcsr(starpu_filter *f __attribute__((unus
 		unsigned node;
 		for (node = 0; node < MAXNODES; node++)
 		{
-			starpu_blas_interface_t *local = &sub_handle->interface[node].blas;
+			starpu_blas_interface_t *local =
+				starpu_data_get_interface_on_node(root_data, node);
 
 			local->nx = c;
 			local->ny = r;
@@ -62,7 +66,9 @@ unsigned starpu_canonical_block_filter_bcsr(starpu_filter *f __attribute__((unus
 			local->elemsize = elemsize;
 
 			if (root_data->per_node[node].allocated) {
-				uint8_t *nzval = (uint8_t *)(root_data->interface[node].bcsr.nzval);
+				struct starpu_bcsr_interface_s *node_interface =
+					starpu_data_get_interface_on_node(root_data, node);
+				uint8_t *nzval = (uint8_t *)(node_interface->nzval);
 				local->ptr = (uintptr_t)&nzval[firstentry + ptr_offset];
 			}
 		}

+ 56 - 41
src/datawizard/interfaces/bcsr_interface.c

@@ -75,7 +75,8 @@ void starpu_register_bcsr_data(struct starpu_data_state_t **handle, uint32_t hom
 	unsigned node;
 	for (node = 0; node < MAXNODES; node++)
 	{
-		starpu_bcsr_interface_t *local_interface = &state->interface[node].bcsr;
+		starpu_bcsr_interface_t *local_interface =
+			starpu_data_get_interface_on_node(state, node);
 
 		if (node == home_node) {
 			local_interface->nzval = nzval;
@@ -153,32 +154,50 @@ static size_t dump_bcsr_interface(starpu_data_interface_t *interface, void *_buf
 /* offer an access to the data parameters */
 uint32_t starpu_get_bcsr_nnz(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].bcsr.nnz);
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nnz;
 }
 
 uint32_t starpu_get_bcsr_nrow(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].bcsr.nrow);
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nrow;
 }
 
 uint32_t starpu_get_bcsr_firstentry(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].bcsr.firstentry);
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->firstentry;
 }
 
 uint32_t starpu_get_bcsr_r(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].bcsr.r);
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->r;
 }
 
 uint32_t starpu_get_bcsr_c(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].bcsr.c);
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->c;
 }
 
 size_t starpu_get_bcsr_elemsize(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].bcsr.elemsize);
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->elemsize;
 }
 
 uintptr_t starpu_get_bcsr_local_nzval(struct starpu_data_state_t *state)
@@ -188,33 +207,28 @@ uintptr_t starpu_get_bcsr_local_nzval(struct starpu_data_state_t *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].bcsr.nzval);
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+	
+	return interface->nzval;
 }
 
 uint32_t *starpu_get_bcsr_local_colind(struct starpu_data_state_t *state)
 {
-//	unsigned node;
-//	node = get_local_memory_node();
-//
-//	STARPU_ASSERT(state->per_node[node].allocated);
-//
-//	return (state->interface[node].bcsr.colind);
-
-	/* XXX */
-	return (state->interface[0].bcsr.colind);
+	/* XXX 0 */
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->colind;
 }
 
 uint32_t *starpu_get_bcsr_local_rowptr(struct starpu_data_state_t *state)
 {
-//	unsigned node;
-//	node = get_local_memory_node();
-//
-//	STARPU_ASSERT(state->per_node[node].allocated);
-//
-//	return (state->interface[node].bcsr.rowptr);
-	
-	/* XXX */
-	return (state->interface[0].bcsr.rowptr);
+	/* XXX 0 */
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->rowptr;
 }
 
 
@@ -244,13 +258,15 @@ static size_t allocate_bcsr_buffer_on_node(struct starpu_data_state_t *state, ui
 	size_t allocated_memory;
 
 	/* we need the 3 arrays to be allocated */
+	starpu_bcsr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, dst_node);
 
-	uint32_t nnz = state->interface[dst_node].bcsr.nnz;
-	uint32_t nrow = state->interface[dst_node].bcsr.nrow;
-	size_t elemsize = state->interface[dst_node].bcsr.elemsize;
+	uint32_t nnz = interface->nnz;
+	uint32_t nrow = interface->nrow;
+	size_t elemsize = interface->elemsize;
 
-	uint32_t r = state->interface[dst_node].bcsr.r;
-	uint32_t c = state->interface[dst_node].bcsr.c;
+	uint32_t r = interface->r;
+	uint32_t c = interface->c;
 
 	node_kind kind = get_node_kind(dst_node);
 
@@ -294,9 +310,9 @@ static size_t allocate_bcsr_buffer_on_node(struct starpu_data_state_t *state, ui
 		nnz*r*c*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t);
 
 	/* update the data properly in consequence */
-	state->interface[dst_node].bcsr.nzval = addr_nzval;
-	state->interface[dst_node].bcsr.colind = addr_colind;
-	state->interface[dst_node].bcsr.rowptr = addr_rowptr;
+	interface->nzval = addr_nzval;
+	interface->colind = addr_colind;
+	interface->rowptr = addr_rowptr;
 	
 	return allocated_memory;
 
@@ -361,8 +377,8 @@ static int copy_cublas_to_ram(struct starpu_data_state_t *state, uint32_t src_no
 	starpu_bcsr_interface_t *src_bcsr;
 	starpu_bcsr_interface_t *dst_bcsr;
 
-	src_bcsr = &state->interface[src_node].bcsr;
-	dst_bcsr = &state->interface[dst_node].bcsr;
+	src_bcsr = starpu_data_get_interface_on_node(state, src_node);
+	dst_bcsr = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nnz = src_bcsr->nnz;
 	uint32_t nrow = src_bcsr->nrow;
@@ -390,8 +406,8 @@ static int copy_ram_to_cublas(struct starpu_data_state_t *state, uint32_t src_no
 	starpu_bcsr_interface_t *src_bcsr;
 	starpu_bcsr_interface_t *dst_bcsr;
 
-	src_bcsr = &state->interface[src_node].bcsr;
-	dst_bcsr = &state->interface[dst_node].bcsr;
+	src_bcsr = starpu_data_get_interface_on_node(state, src_node);
+	dst_bcsr = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nnz = src_bcsr->nnz;
 	uint32_t nrow = src_bcsr->nrow;
@@ -418,12 +434,11 @@ static int copy_ram_to_cublas(struct starpu_data_state_t *state, uint32_t src_no
 /* as not all platform easily have a BLAS lib installed ... */
 static int dummy_copy_ram_to_ram(struct starpu_data_state_t *state, uint32_t src_node, uint32_t dst_node)
 {
-
 	starpu_bcsr_interface_t *src_bcsr;
 	starpu_bcsr_interface_t *dst_bcsr;
 
-	src_bcsr = &state->interface[src_node].bcsr;
-	dst_bcsr = &state->interface[dst_node].bcsr;
+	src_bcsr = starpu_data_get_interface_on_node(state, src_node);
+	dst_bcsr = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nnz = src_bcsr->nnz;
 	uint32_t nrow = src_bcsr->nrow;

+ 6 - 3
src/datawizard/interfaces/blas_filters.c

@@ -80,9 +80,12 @@ unsigned starpu_vertical_block_filter_func(starpu_filter *f, data_state *root_da
 	unsigned nchunks;
 	uint32_t arg = f->filter_arg;
 
-	uint32_t nx = root_data->interface[0].blas.nx;
-	uint32_t ny = root_data->interface[0].blas.ny;
-	size_t elemsize = root_data->interface[0].blas.elemsize;
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(root_data, 0);
+
+	uint32_t nx = interface->nx;
+	uint32_t ny = interface->ny;
+	size_t elemsize = interface->elemsize;
 
 	/* we will have arg chunks */
 	nchunks = STARPU_MIN(ny, arg);

+ 57 - 32
src/datawizard/interfaces/blas_interface.c

@@ -110,7 +110,8 @@ void starpu_register_blas_data(struct starpu_data_state_t **handle, uint32_t hom
 	unsigned node;
 	for (node = 0; node < MAXNODES; node++)
 	{
-		starpu_blas_interface_t *local_interface = &state->interface[node].blas;
+		starpu_blas_interface_t *local_interface =
+			starpu_data_get_interface_on_node(state, node);
 
 		if (node == home_node) {
 			local_interface->ptr = ptr;
@@ -157,8 +158,7 @@ struct dumped_blas_interface_s {
 static void display_blas_interface(data_state *state, FILE *f)
 {
 	starpu_blas_interface_t *interface;
-
-	interface = &state->interface[0].blas;
+		starpu_data_get_interface_on_node(state, 0);
 
 	fprintf(f, "%u\t%u\t", interface->nx, interface->ny);
 }
@@ -178,11 +178,10 @@ static size_t dump_blas_interface(starpu_data_interface_t *interface, void *_buf
 
 static size_t blas_interface_get_size(struct starpu_data_state_t *state)
 {
-	size_t size;
-	starpu_blas_interface_t *interface;
-
-	interface = &state->interface[0].blas;
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
 
+	size_t size;
 	size = (size_t)interface->nx*interface->ny*interface->elemsize; 
 
 	return size;
@@ -191,12 +190,18 @@ static size_t blas_interface_get_size(struct starpu_data_state_t *state)
 /* offer an access to the data parameters */
 uint32_t starpu_get_blas_nx(data_state *state)
 {
-	return (state->interface[0].blas.nx);
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nx;
 }
 
 uint32_t starpu_get_blas_ny(data_state *state)
 {
-	return (state->interface[0].blas.ny);
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->ny;
 }
 
 uint32_t starpu_get_blas_local_ld(data_state *state)
@@ -206,7 +211,10 @@ uint32_t starpu_get_blas_local_ld(data_state *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].blas.ld);
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->ld;
 }
 
 uintptr_t starpu_get_blas_local_ptr(data_state *state)
@@ -216,12 +224,18 @@ uintptr_t starpu_get_blas_local_ptr(data_state *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].blas.ptr);
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->ptr;
 }
 
 size_t starpu_get_blas_elemsize(data_state *state)
 {
-	return (state->interface[0].blas.elemsize);
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->elemsize;
 }
 
 /* memory allocation/deallocation primitives for the BLAS interface */
@@ -237,10 +251,14 @@ static size_t allocate_blas_buffer_on_node(data_state *state, uint32_t dst_node)
 	cudaError_t status;
 	size_t pitch;
 #endif
-	uint32_t nx = state->interface[dst_node].blas.nx;
-	uint32_t ny = state->interface[dst_node].blas.ny;
+
+	starpu_blas_interface_t *interface =
+		starpu_data_get_interface_on_node(state, dst_node);
+
+	uint32_t nx = interface->nx;
+	uint32_t ny = interface->ny;
 	uint32_t ld = nx; // by default
-	size_t elemsize = state->interface[dst_node].blas.elemsize;
+	size_t elemsize = interface->elemsize;
 
 	node_kind kind = get_node_kind(dst_node);
 
@@ -275,8 +293,8 @@ static size_t allocate_blas_buffer_on_node(data_state *state, uint32_t dst_node)
 		allocated_memory = (size_t)nx*ny*elemsize;
 
 		/* update the data properly in consequence */
-		state->interface[dst_node].blas.ptr = addr;
-		state->interface[dst_node].blas.ld = ld;
+		interface->ptr = addr;
+		interface->ld = ld;
 	} else {
 		/* allocation failed */
 		allocated_memory = 0;
@@ -315,8 +333,8 @@ static int copy_cublas_to_ram(data_state *state, uint32_t src_node, uint32_t dst
 	starpu_blas_interface_t *src_blas;
 	starpu_blas_interface_t *dst_blas;
 
-	src_blas = &state->interface[src_node].blas;
-	dst_blas = &state->interface[dst_node].blas;
+	src_blas = starpu_data_get_interface_on_node(state, src_node);
+	dst_blas = starpu_data_get_interface_on_node(state, dst_node);
 
 	size_t elemsize = src_blas->elemsize;
 
@@ -337,8 +355,9 @@ static int copy_ram_to_cublas(data_state *state, uint32_t src_node, uint32_t dst
 	starpu_blas_interface_t *src_blas;
 	starpu_blas_interface_t *dst_blas;
 
-	src_blas = &state->interface[src_node].blas;
-	dst_blas = &state->interface[dst_node].blas;
+	src_blas = starpu_data_get_interface_on_node(state, src_node);
+	dst_blas = starpu_data_get_interface_on_node(state, dst_node);
+
 	size_t elemsize = src_blas->elemsize;
 
 	cudaError_t cures;
@@ -362,8 +381,8 @@ static int copy_cublas_to_ram_async(data_state *state, uint32_t src_node, uint32
 	starpu_blas_interface_t *src_blas;
 	starpu_blas_interface_t *dst_blas;
 
-	src_blas = &state->interface[src_node].blas;
-	dst_blas = &state->interface[dst_node].blas;
+	src_blas = starpu_data_get_interface_on_node(state, src_node);
+	dst_blas = starpu_data_get_interface_on_node(state, dst_node);
 
 	size_t elemsize = src_blas->elemsize;
 
@@ -400,8 +419,8 @@ static int copy_ram_to_cublas_async(struct starpu_data_state_t *state, uint32_t
 	starpu_blas_interface_t *src_blas;
 	starpu_blas_interface_t *dst_blas;
 
-	src_blas = &state->interface[src_node].blas;
-	dst_blas = &state->interface[dst_node].blas;
+	src_blas = starpu_data_get_interface_on_node(state, src_node);
+	dst_blas = starpu_data_get_interface_on_node(state, dst_node);
 
 	size_t elemsize = src_blas->elemsize;
 
@@ -433,16 +452,22 @@ static int copy_ram_to_cublas_async(struct starpu_data_state_t *state, uint32_t
 /* as not all platform easily have a BLAS lib installed ... */
 static int dummy_copy_ram_to_ram(data_state *state, uint32_t src_node, uint32_t dst_node)
 {
+	starpu_blas_interface_t *src_blas;
+	starpu_blas_interface_t *dst_blas;
+
+	src_blas = starpu_data_get_interface_on_node(state, src_node);
+	dst_blas = starpu_data_get_interface_on_node(state, dst_node);
+
 	unsigned y;
-	uint32_t nx = state->interface[dst_node].blas.nx;
-	uint32_t ny = state->interface[dst_node].blas.ny;
-	size_t elemsize = state->interface[dst_node].blas.elemsize;
+	uint32_t nx = dst_blas->nx;
+	uint32_t ny = dst_blas->ny;
+	size_t elemsize = dst_blas->elemsize;
 
-	uint32_t ld_src = state->interface[src_node].blas.ld;
-	uint32_t ld_dst = state->interface[dst_node].blas.ld;
+	uint32_t ld_src = src_blas->ld;
+	uint32_t ld_dst = dst_blas->ld;
 
-	uintptr_t ptr_src = state->interface[src_node].blas.ptr;
-	uintptr_t ptr_dst = state->interface[dst_node].blas.ptr;
+	uintptr_t ptr_src = src_blas->ptr;
+	uintptr_t ptr_dst = dst_blas->ptr;
 
 
 	for (y = 0; y < ny; y++)

+ 68 - 37
src/datawizard/interfaces/block_interface.c

@@ -96,7 +96,8 @@ void starpu_register_block_data(struct starpu_data_state_t **handle, uint32_t ho
 	unsigned node;
 	for (node = 0; node < MAXNODES; node++)
 	{
-		starpu_block_interface_t *local_interface = &state->interface[node].block;
+		starpu_block_interface_t *local_interface =
+			starpu_data_get_interface_on_node(state, node);
 
 		if (node == home_node) {
 			local_interface->ptr = ptr;
@@ -150,7 +151,7 @@ static void display_block_interface(data_state *state, FILE *f)
 {
 	starpu_block_interface_t *interface;
 
-	interface = &state->interface[0].block;
+	interface = starpu_data_get_interface_on_node(state, 0);
 
 	fprintf(f, "%u\t%u\t%u\t", interface->nx, interface->ny, interface->nz);
 }
@@ -175,7 +176,7 @@ static size_t block_interface_get_size(struct starpu_data_state_t *state)
 	size_t size;
 	starpu_block_interface_t *interface;
 
-	interface = &state->interface[0].block;
+	interface = starpu_data_get_interface_on_node(state, 0);
 
 	size = interface->nx*interface->ny*interface->nz*interface->elemsize; 
 
@@ -185,17 +186,26 @@ static size_t block_interface_get_size(struct starpu_data_state_t *state)
 /* offer an access to the data parameters */
 uint32_t starpu_get_block_nx(data_state *state)
 {
-	return (state->interface[0].block.nx);
+	starpu_block_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nx;
 }
 
 uint32_t starpu_get_block_ny(data_state *state)
 {
-	return (state->interface[0].block.ny);
+	starpu_block_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->ny;
 }
 
 uint32_t starpu_get_block_nz(data_state *state)
 {
-	return (state->interface[0].block.nz);
+	starpu_block_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nz;
 }
 
 uint32_t starpu_get_block_local_ldy(data_state *state)
@@ -204,8 +214,11 @@ uint32_t starpu_get_block_local_ldy(data_state *state)
 	node = get_local_memory_node();
 
 	STARPU_ASSERT(state->per_node[node].allocated);
+	
+	starpu_block_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
 
-	return (state->interface[node].block.ldy);
+	return interface->ldy;
 }
 
 uint32_t starpu_get_block_local_ldz(data_state *state)
@@ -215,7 +228,10 @@ uint32_t starpu_get_block_local_ldz(data_state *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].block.ldz);
+	starpu_block_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->ldz;
 }
 
 uintptr_t starpu_get_block_local_ptr(data_state *state)
@@ -225,12 +241,18 @@ uintptr_t starpu_get_block_local_ptr(data_state *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].block.ptr);
+	starpu_block_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->ptr;
 }
 
 size_t starpu_get_block_elemsize(data_state *state)
 {
-	return (state->interface[0].block.elemsize);
+	starpu_block_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->elemsize;
 }
 
 
@@ -246,10 +268,13 @@ static size_t allocate_block_buffer_on_node(data_state *state, uint32_t dst_node
 #ifdef USE_CUDA
 	cudaError_t status;
 #endif
-	uint32_t nx = state->interface[dst_node].block.nx;
-	uint32_t ny = state->interface[dst_node].block.ny;
-	uint32_t nz = state->interface[dst_node].block.nz;
-	size_t elemsize = state->interface[dst_node].block.elemsize;
+	starpu_block_interface_t *dst_block =
+		starpu_data_get_interface_on_node(state, dst_node);
+
+	uint32_t nx = dst_block->nx;
+	uint32_t ny = dst_block->ny;
+	uint32_t nz = dst_block->nz;
+	size_t elemsize = dst_block->elemsize;
 
 	node_kind kind = get_node_kind(dst_node);
 
@@ -285,9 +310,9 @@ static size_t allocate_block_buffer_on_node(data_state *state, uint32_t dst_node
 		allocated_memory = nx*ny*nz*elemsize;
 
 		/* update the data properly in consequence */
-		state->interface[dst_node].block.ptr = addr;
-		state->interface[dst_node].block.ldy = nx;
-		state->interface[dst_node].block.ldz = nx*ny;
+		dst_block->ptr = addr;
+		dst_block->ldy = nx;
+		dst_block->ldz = nx*ny;
 	} else {
 		/* allocation failed */
 		allocated_memory = 0;
@@ -326,8 +351,8 @@ static int copy_cublas_to_ram(data_state *state, uint32_t src_node, uint32_t dst
 	starpu_block_interface_t *src_block;
 	starpu_block_interface_t *dst_block;
 
-	src_block = &state->interface[src_node].block;
-	dst_block = &state->interface[dst_node].block;
+	src_block = starpu_data_get_interface_on_node(state, src_node);
+	dst_block = starpu_data_get_interface_on_node(state, dst_node);
 
 	//fprintf(stderr, "COPY BLOCK -> RAM nx %d ny %d nz %d SRC ldy %d DST ldy %d\n", src_block->nx,  src_block->ny,  src_block->nz,  src_block->ldy, dst_block->ldy);
 
@@ -366,8 +391,8 @@ static int copy_cublas_to_ram_async(data_state *state, uint32_t src_node, uint32
 	starpu_block_interface_t *src_block;
 	starpu_block_interface_t *dst_block;
 
-	src_block = &state->interface[src_node].block;
-	dst_block = &state->interface[dst_node].block;
+	src_block = starpu_data_get_interface_on_node(state, src_node);
+	dst_block = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nx = src_block->nx;
 	uint32_t ny = src_block->ny;
@@ -486,8 +511,8 @@ static int copy_ram_to_cublas_async(data_state *state, uint32_t src_node, uint32
 	starpu_block_interface_t *src_block;
 	starpu_block_interface_t *dst_block;
 
-	src_block = &state->interface[src_node].block;
-	dst_block = &state->interface[dst_node].block;
+	src_block = starpu_data_get_interface_on_node(state, src_node);
+	dst_block = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nx = src_block->nx;
 	uint32_t ny = src_block->ny;
@@ -604,8 +629,8 @@ static int copy_ram_to_cublas(data_state *state, uint32_t src_node, uint32_t dst
 	starpu_block_interface_t *src_block;
 	starpu_block_interface_t *dst_block;
 
-	src_block = &state->interface[src_node].block;
-	dst_block = &state->interface[dst_node].block;
+	src_block = starpu_data_get_interface_on_node(state, src_node);
+	dst_block = starpu_data_get_interface_on_node(state, dst_node);
 
 	if ((src_block->nx == src_block->ldy) && (src_block->ldy == dst_block->ldy))
 	{
@@ -639,18 +664,24 @@ static int copy_ram_to_cublas(data_state *state, uint32_t src_node, uint32_t dst
 /* as not all platform easily have a BLAS lib installed ... */
 static int dummy_copy_ram_to_ram(data_state *state, uint32_t src_node, uint32_t dst_node)
 {
-	uint32_t nx = state->interface[dst_node].block.nx;
-	uint32_t ny = state->interface[dst_node].block.ny;
-	uint32_t nz = state->interface[dst_node].block.nz;
-	size_t elemsize = state->interface[dst_node].block.elemsize;
-
-	uint32_t ldy_src = state->interface[src_node].block.ldy;
-	uint32_t ldz_src = state->interface[src_node].block.ldz;
-	uint32_t ldy_dst = state->interface[dst_node].block.ldy;
-	uint32_t ldz_dst = state->interface[dst_node].block.ldz;
-
-	uintptr_t ptr_src = state->interface[src_node].block.ptr;
-	uintptr_t ptr_dst = state->interface[dst_node].block.ptr;
+	starpu_block_interface_t *src_block;
+	starpu_block_interface_t *dst_block;
+
+	src_block = starpu_data_get_interface_on_node(state, src_node);
+	dst_block = starpu_data_get_interface_on_node(state, dst_node);
+
+	uint32_t nx = dst_block->nx;
+	uint32_t ny = dst_block->ny;
+	uint32_t nz = dst_block->nz;
+	size_t elemsize = dst_block->elemsize;
+
+	uint32_t ldy_src = src_block->ldy;
+	uint32_t ldz_src = src_block->ldz;
+	uint32_t ldy_dst = dst_block->ldy;
+	uint32_t ldz_dst = dst_block->ldz;
+
+	uintptr_t ptr_src = src_block->ptr;
+	uintptr_t ptr_dst = dst_block->ptr;
 
 	unsigned y, z;
 	for (z = 0; z < nz; z++)

+ 44 - 20
src/datawizard/interfaces/csr_interface.c

@@ -73,7 +73,8 @@ void starpu_register_csr_data(struct starpu_data_state_t **handle, uint32_t home
 	unsigned node;
 	for (node = 0; node < MAXNODES; node++)
 	{
-		starpu_csr_interface_t *local_interface = &state->interface[node].csr;
+		starpu_csr_interface_t *local_interface =
+			starpu_data_get_interface_on_node(state, node);
 
 		if (node == home_node) {
 			local_interface->nzval = nzval;
@@ -144,22 +145,34 @@ static size_t dump_csr_interface(starpu_data_interface_t *interface, void *_buff
 /* offer an access to the data parameters */
 uint32_t starpu_get_csr_nnz(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].csr.nnz);
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nnz;
 }
 
 uint32_t starpu_get_csr_nrow(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].csr.nrow);
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nrow;
 }
 
 uint32_t starpu_get_csr_firstentry(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].csr.firstentry);
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->firstentry;
 }
 
 size_t starpu_get_csr_elemsize(struct starpu_data_state_t *state)
 {
-	return (state->interface[0].csr.elemsize);
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->elemsize;
 }
 
 uintptr_t starpu_get_csr_local_nzval(struct starpu_data_state_t *state)
@@ -169,7 +182,10 @@ uintptr_t starpu_get_csr_local_nzval(struct starpu_data_state_t *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].csr.nzval);
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->nzval;
 }
 
 uint32_t *starpu_get_csr_local_colind(struct starpu_data_state_t *state)
@@ -179,7 +195,10 @@ uint32_t *starpu_get_csr_local_colind(struct starpu_data_state_t *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].csr.colind);
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->colind;
 }
 
 uint32_t *starpu_get_csr_local_rowptr(struct starpu_data_state_t *state)
@@ -189,7 +208,10 @@ uint32_t *starpu_get_csr_local_rowptr(struct starpu_data_state_t *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].csr.rowptr);
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->rowptr;
 }
 
 static size_t csr_interface_get_size(struct starpu_data_state_t *state)
@@ -215,10 +237,12 @@ static size_t allocate_csr_buffer_on_node(struct starpu_data_state_t *state, uin
 	size_t allocated_memory;
 
 	/* we need the 3 arrays to be allocated */
+	starpu_csr_interface_t *interface =
+		starpu_data_get_interface_on_node(state, dst_node);
 
-	uint32_t nnz = state->interface[dst_node].csr.nnz;
-	uint32_t nrow = state->interface[dst_node].csr.nrow;
-	size_t elemsize = state->interface[dst_node].csr.elemsize;
+	uint32_t nnz = interface->nnz;
+	uint32_t nrow = interface->nrow;
+	size_t elemsize = interface->elemsize;
 
 	node_kind kind = get_node_kind(dst_node);
 
@@ -262,9 +286,9 @@ static size_t allocate_csr_buffer_on_node(struct starpu_data_state_t *state, uin
 		nnz*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t);
 
 	/* update the data properly in consequence */
-	state->interface[dst_node].csr.nzval = addr_nzval;
-	state->interface[dst_node].csr.colind = addr_colind;
-	state->interface[dst_node].csr.rowptr = addr_rowptr;
+	interface->nzval = addr_nzval;
+	interface->colind = addr_colind;
+	interface->rowptr = addr_rowptr;
 	
 	return allocated_memory;
 
@@ -329,8 +353,8 @@ static int copy_cublas_to_ram(struct starpu_data_state_t *state, uint32_t src_no
 	starpu_csr_interface_t *src_csr;
 	starpu_csr_interface_t *dst_csr;
 
-	src_csr = &state->interface[src_node].csr;
-	dst_csr = &state->interface[dst_node].csr;
+	src_csr = starpu_data_get_interface_on_node(state, src_node);
+	dst_csr = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nnz = src_csr->nnz;
 	uint32_t nrow = src_csr->nrow;
@@ -355,8 +379,8 @@ static int copy_ram_to_cublas(struct starpu_data_state_t *state, uint32_t src_no
 	starpu_csr_interface_t *src_csr;
 	starpu_csr_interface_t *dst_csr;
 
-	src_csr = &state->interface[src_node].csr;
-	dst_csr = &state->interface[dst_node].csr;
+	src_csr = starpu_data_get_interface_on_node(state, src_node);
+	dst_csr = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nnz = src_csr->nnz;
 	uint32_t nrow = src_csr->nrow;
@@ -384,8 +408,8 @@ static int dummy_copy_ram_to_ram(struct starpu_data_state_t *state, uint32_t src
 	starpu_csr_interface_t *src_csr;
 	starpu_csr_interface_t *dst_csr;
 
-	src_csr = &state->interface[src_node].csr;
-	dst_csr = &state->interface[dst_node].csr;
+	src_csr = starpu_data_get_interface_on_node(state, src_node);
+	dst_csr = starpu_data_get_interface_on_node(state, dst_node);
 
 	uint32_t nnz = src_csr->nnz;
 	uint32_t nrow = src_csr->nrow;

+ 42 - 24
src/datawizard/interfaces/vector_interface.c

@@ -99,7 +99,8 @@ void starpu_register_vector_data(struct starpu_data_state_t **handle, uint32_t h
 	unsigned node;
 	for (node = 0; node < MAXNODES; node++)
 	{
-		starpu_vector_interface_t *local_interface = &state->interface[node].vector;
+		starpu_vector_interface_t *local_interface = 
+			starpu_data_get_interface_on_node(state, node);
 
 		if (node == home_node) {
 			local_interface->ptr = ptr;
@@ -141,8 +142,8 @@ struct dumped_vector_interface_s {
 
 static void display_vector_interface(data_state *state, FILE *f)
 {
-	starpu_vector_interface_t *interface;
-	interface =  &state->interface[0].vector;
+	starpu_vector_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
 
 	fprintf(f, "%u\t", interface->nx);
 }
@@ -163,9 +164,8 @@ static size_t dump_vector_interface(starpu_data_interface_t *interface, void *_b
 static size_t vector_interface_get_size(struct starpu_data_state_t *state)
 {
 	size_t size;
-	starpu_vector_interface_t *interface;
-
-	interface =  &state->interface[0].vector;
+	starpu_vector_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
 
 	size = interface->nx*interface->elemsize;
 
@@ -175,7 +175,10 @@ static size_t vector_interface_get_size(struct starpu_data_state_t *state)
 /* offer an access to the data parameters */
 uint32_t starpu_get_vector_nx(data_state *state)
 {
-	return (state->interface[0].vector.nx);
+	starpu_vector_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->nx;
 }
 
 uintptr_t starpu_get_vector_local_ptr(data_state *state)
@@ -185,12 +188,18 @@ uintptr_t starpu_get_vector_local_ptr(data_state *state)
 
 	STARPU_ASSERT(state->per_node[node].allocated);
 
-	return (state->interface[node].vector.ptr);
+	starpu_vector_interface_t *interface =
+		starpu_data_get_interface_on_node(state, node);
+
+	return interface->ptr;
 }
 
 size_t starpu_get_vector_elemsize(data_state *state)
 {
-	return (state->interface[0].vector.elemsize);
+	starpu_vector_interface_t *interface =
+		starpu_data_get_interface_on_node(state, 0);
+
+	return interface->elemsize;
 }
 
 /* memory allocation/deallocation primitives for the vector interface */
@@ -198,11 +207,14 @@ size_t starpu_get_vector_elemsize(data_state *state)
 /* returns the size of the allocated area */
 static size_t allocate_vector_buffer_on_node(data_state *state, uint32_t dst_node)
 {
+	starpu_vector_interface_t *interface =
+		starpu_data_get_interface_on_node(state, dst_node);
+
 	uintptr_t addr = 0;
 	size_t allocated_memory;
 
-	uint32_t nx = state->interface[dst_node].vector.nx;
-	size_t elemsize = state->interface[dst_node].vector.elemsize;
+	uint32_t nx = interface->nx;
+	size_t elemsize = interface->elemsize;
 
 	node_kind kind = get_node_kind(dst_node);
 
@@ -224,7 +236,7 @@ static size_t allocate_vector_buffer_on_node(data_state *state, uint32_t dst_nod
 		allocated_memory = nx*elemsize;
 
 		/* update the data properly in consequence */
-		state->interface[dst_node].vector.ptr = addr;
+		interface->ptr = addr;
 	} else {
 		/* allocation failed */
 		allocated_memory = 0;
@@ -256,8 +268,8 @@ static int copy_cublas_to_ram(data_state *state, uint32_t src_node, uint32_t dst
 	starpu_vector_interface_t *src_vector;
 	starpu_vector_interface_t *dst_vector;
 
-	src_vector = &state->interface[src_node].vector;
-	dst_vector = &state->interface[dst_node].vector;
+	src_vector = starpu_data_get_interface_on_node(state, src_node);
+	dst_vector = starpu_data_get_interface_on_node(state, dst_node);
 
 	cublasGetVector(src_vector->nx, src_vector->elemsize,
 		(uint8_t *)src_vector->ptr, 1,
@@ -273,8 +285,8 @@ static int copy_ram_to_cublas(data_state *state, uint32_t src_node, uint32_t dst
 	starpu_vector_interface_t *src_vector;
 	starpu_vector_interface_t *dst_vector;
 
-	src_vector = &state->interface[src_node].vector;
-	dst_vector = &state->interface[dst_node].vector;
+	src_vector = starpu_data_get_interface_on_node(state, src_node);
+	dst_vector = starpu_data_get_interface_on_node(state, dst_node);
 
 	cublasSetVector(src_vector->nx, src_vector->elemsize,
 		(uint8_t *)src_vector->ptr, 1,
@@ -290,8 +302,8 @@ static int copy_cublas_to_ram_async(data_state *state, uint32_t src_node, uint32
 	starpu_vector_interface_t *src_vector;
 	starpu_vector_interface_t *dst_vector;
 
-	src_vector = &state->interface[src_node].vector;
-	dst_vector = &state->interface[dst_node].vector;
+	src_vector = starpu_data_get_interface_on_node(state, src_node);
+	dst_vector = starpu_data_get_interface_on_node(state, dst_node);
 
 	cudaError_t cures;
 	cures = cudaMemcpyAsync((char *)dst_vector->ptr, (char *)src_vector->ptr, src_vector->nx*src_vector->elemsize, cudaMemcpyDeviceToHost, *stream);
@@ -317,8 +329,8 @@ static int copy_ram_to_cublas_async(struct starpu_data_state_t *state, uint32_t
 	starpu_vector_interface_t *src_vector;
 	starpu_vector_interface_t *dst_vector;
 
-	src_vector = &state->interface[src_node].vector;
-	dst_vector = &state->interface[dst_node].vector;
+	src_vector = starpu_data_get_interface_on_node(state, src_node);
+	dst_vector = starpu_data_get_interface_on_node(state, dst_node);
 
 	cudaError_t cures;
 	
@@ -345,11 +357,17 @@ static int copy_ram_to_cublas_async(struct starpu_data_state_t *state, uint32_t
 
 static int dummy_copy_ram_to_ram(data_state *state, uint32_t src_node, uint32_t dst_node)
 {
-	uint32_t nx = state->interface[dst_node].vector.nx;
-	size_t elemsize = state->interface[dst_node].vector.elemsize;
+	starpu_vector_interface_t *src_vector;
+	starpu_vector_interface_t *dst_vector;
+
+	src_vector = starpu_data_get_interface_on_node(state, src_node);
+	dst_vector = starpu_data_get_interface_on_node(state, dst_node);
+
+	uint32_t nx = dst_vector->nx;
+	size_t elemsize = dst_vector->elemsize;
 
-	uintptr_t ptr_src = state->interface[src_node].vector.ptr;
-	uintptr_t ptr_dst = state->interface[dst_node].vector.ptr;
+	uintptr_t ptr_src = src_vector->ptr;
+	uintptr_t ptr_dst = dst_vector->ptr;
 
 	memcpy((void *)ptr_dst, (void *)ptr_src, nx*elemsize);
 

+ 2 - 1
src/datawizard/memalloc.c

@@ -428,7 +428,8 @@ static void register_mem_chunk(data_state *state, uint32_t dst_node, size_t size
 	mc->automatically_allocated = automatically_allocated;
 
 	/* the interface was already filled by ops->allocate_data_on_node */
-	memcpy(&mc->interface, &state->interface[dst_node], sizeof(starpu_data_interface_t));
+	void *src_interface = starpu_data_get_interface_on_node(state, dst_node);
+	memcpy(&mc->interface, src_interface, sizeof(starpu_data_interface_t));
 
 	res = pthread_rwlock_wrlock(&mc_rwlock[dst_node]);
 	STARPU_ASSERT(!res);