Kaynağa Gözat

mpi/examples: add an example in which the allocation function for a MPI datatype return -1 and thus the data will be exchanged with pack/unpack

Nathalie Furmento 5 yıl önce
ebeveyn
işleme
64e98199a5

+ 7 - 1
mpi/examples/Makefile.am

@@ -342,14 +342,20 @@ endif
 
 if BUILD_EXAMPLES
 examplebin_PROGRAMS +=				\
-	user_datatype/user_datatype
+	user_datatype/user_datatype		\
+	user_datatype/user_datatype2
 
 user_datatype_user_datatype_SOURCES =		\
 	user_datatype/user_datatype.c		\
 	user_datatype/my_interface.c
 
+user_datatype_user_datatype2_SOURCES =		\
+	user_datatype/user_datatype2.c		\
+	user_datatype/my_interface.c
+
 if !STARPU_SIMGRID
 starpu_mpi_EXAMPLES	+=			\
+	user_datatype/user_datatype2		\
 	user_datatype/user_datatype
 endif
 endif

+ 84 - 0
mpi/examples/user_datatype/my_interface.c

@@ -79,6 +79,18 @@ void starpu_my_data_datatype_free(MPI_Datatype *mpi_datatype)
 	MPI_Type_free(mpi_datatype);
 }
 
+int starpu_my_data2_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype)
+{
+	(void)handle;
+	(void)mpi_datatype;
+	return -1;
+}
+
+void starpu_my_data2_datatype_free(MPI_Datatype *mpi_datatype)
+{
+	STARPU_ASSERT_MSG(0, "should not be called\n");
+}
+
 char starpu_my_data_interface_get_char(void *interface)
 {
 	struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) interface;
@@ -198,6 +210,43 @@ static int data_unpack_data(starpu_data_handle_t handle, unsigned node, void *pt
 	return 0;
 }
 
+static int data_pack_data2(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count)
+{
+	STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node));
+
+	*count = sizeof(int) + sizeof(char);
+	if (ptr != NULL)
+	{
+		int d = starpu_my_data_get_int(handle);
+		char c = starpu_my_data_get_char(handle);
+
+		*ptr = (void*) starpu_malloc_on_node_flags(node, *count, 0);
+		memcpy(*ptr, &d, sizeof(int));
+		char *x = *ptr;
+		x += sizeof(int);
+		memcpy(x, &c, sizeof(char));
+	}
+
+	return 0;
+}
+
+static int data_unpack_data2(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count)
+{
+	(void)count;
+	STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node));
+	STARPU_ASSERT(count == sizeof(int)+sizeof(char));
+
+	struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) starpu_data_get_interface_on_node(handle, node);
+	struct starpu_my_data *data = (struct starpu_my_data *)my_data->ptr;
+	memcpy(&data->d, ptr, sizeof(int));
+	char *x = ptr;
+	x += sizeof(int);
+	memcpy(&data->c, x, sizeof(char));
+
+	starpu_free_on_node_flags(node, (uintptr_t)ptr, count, 0);
+	return 0;
+}
+
 static starpu_ssize_t data_describe(void *data_interface, char *buf, size_t size)
 {
 	struct starpu_my_data_interface *my_data = (struct starpu_my_data_interface *) data_interface;
@@ -278,3 +327,38 @@ void starpu_my_data_register(starpu_data_handle_t *handleptr, unsigned home_node
 
 	starpu_data_register(handleptr, home_node, &data, &interface_data_ops);
 }
+
+static struct starpu_data_interface_ops interface_data2_ops =
+{
+	.register_data_handle = data_register_data_handle,
+	.allocate_data_on_node = data_allocate_data_on_node,
+	.free_data_on_node = data_free_data_on_node,
+	//	.copy_methods = &data_copy_methods,
+	.get_size = data_get_size,
+	.get_alloc_size = data_get_alloc_size,
+	.footprint = data_footprint,
+	.interfaceid = STARPU_UNKNOWN_INTERFACE_ID,
+	.interface_size = sizeof(struct starpu_my_data_interface),
+	.to_pointer = data_to_pointer,
+	.pack_data = data_pack_data2,
+	.unpack_data = data_unpack_data2,
+	.describe = data_describe
+};
+
+void starpu_my_data2_register(starpu_data_handle_t *handleptr, unsigned home_node, struct starpu_my_data *xc)
+{
+	if (interface_data2_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID)
+	{
+		interface_data2_ops.interfaceid = starpu_data_interface_get_next_id();
+	}
+
+	struct starpu_my_data_interface data =
+	{
+	 	.id = interface_data_ops.interfaceid,
+		.ptr = (uintptr_t) xc,
+		.dev_handle = (uintptr_t) xc,
+		.offset = 0,
+	};
+
+	starpu_data_register(handleptr, home_node, &data, &interface_data2_ops);
+}

+ 3 - 0
mpi/examples/user_datatype/my_interface.h

@@ -36,6 +36,7 @@ struct starpu_my_data
 };
 
 void starpu_my_data_register(starpu_data_handle_t *handle, unsigned home_node, struct starpu_my_data *xc);
+void starpu_my_data2_register(starpu_data_handle_t *handle, unsigned home_node, struct starpu_my_data *xc);
 
 char starpu_my_data_get_char(starpu_data_handle_t handle);
 int starpu_my_data_get_int(starpu_data_handle_t handle);
@@ -49,6 +50,8 @@ int starpu_my_data_interface_get_int(void *interface);
 void _starpu_my_data_datatype_allocate(MPI_Datatype *mpi_datatype);
 int starpu_my_data_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype);
 void starpu_my_data_datatype_free(MPI_Datatype *mpi_datatype);
+int starpu_my_data2_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype);
+void starpu_my_data2_datatype_free(MPI_Datatype *mpi_datatype);
 
 void starpu_my_data_display_codelet_cpu(void *descr[], void *_args);
 void starpu_my_data_compare_codelet_cpu(void *descr[], void *_args);