Selaa lähdekoodia

MPI: Make defining a datatype optional

so that for complex cases one can have pack/unpack be called.
Samuel Thibault 5 vuotta sitten
vanhempi
commit
23db69fa59

+ 2 - 1
mpi/examples/user_datatype/my_interface.c

@@ -67,10 +67,11 @@ void _starpu_my_data_datatype_allocate(MPI_Datatype *mpi_datatype)
 	free(myinterface);
 }
 
-void starpu_my_data_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype)
+int starpu_my_data_datatype_allocate(starpu_data_handle_t handle, MPI_Datatype *mpi_datatype)
 {
 	(void)handle;
 	_starpu_my_data_datatype_allocate(mpi_datatype);
+	return 0;
 }
 
 void starpu_my_data_datatype_free(MPI_Datatype *mpi_datatype)

+ 1 - 1
mpi/examples/user_datatype/my_interface.h

@@ -47,7 +47,7 @@ int starpu_my_data_interface_get_int(void *interface);
 #define STARPU_MY_DATA_GET_INT(interface)	starpu_my_data_interface_get_int(interface)
 
 void _starpu_my_data_datatype_allocate(MPI_Datatype *mpi_datatype);
-void starpu_my_data_datatype_allocate(starpu_data_handle_t handle, 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);
 
 void starpu_my_data_display_codelet_cpu(void *descr[], void *_args);

+ 1 - 1
mpi/include/starpu_mpi.h

@@ -337,7 +337,7 @@ int starpu_mpi_isend_array_detached_unlock_tag_prio(unsigned array_size, starpu_
 */
 int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, starpu_mpi_tag_t *data_tag, MPI_Comm *comm, starpu_tag_t tag);
 
-typedef void (*starpu_mpi_datatype_allocate_func_t)(starpu_data_handle_t, MPI_Datatype *);
+typedef int (*starpu_mpi_datatype_allocate_func_t)(starpu_data_handle_t, MPI_Datatype *);
 typedef void (*starpu_mpi_datatype_free_func_t)(MPI_Datatype *);
 
 /**

+ 29 - 9
mpi/src/starpu_mpi_datatype.c

@@ -43,7 +43,7 @@ void _starpu_mpi_datatype_shutdown(void)
  * 	Matrix
  */
 
-static void handle_to_datatype_matrix(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
+static int handle_to_datatype_matrix(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
 {
 	int ret;
 
@@ -57,13 +57,15 @@ static void handle_to_datatype_matrix(starpu_data_handle_t data_handle, MPI_Data
 
 	ret = MPI_Type_commit(datatype);
 	STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed");
+
+	return 0;
 }
 
 /*
  * 	Block
  */
 
-static void handle_to_datatype_block(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
+static int handle_to_datatype_block(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
 {
 	int ret;
 
@@ -86,13 +88,15 @@ static void handle_to_datatype_block(starpu_data_handle_t data_handle, MPI_Datat
 
 	ret = MPI_Type_commit(datatype);
 	STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed");
+
+	return 0;
 }
 
 /*
  * 	Tensor
  */
 
-static void handle_to_datatype_tensor(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
+static int handle_to_datatype_tensor(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
 {
 	int ret;
 
@@ -124,13 +128,15 @@ static void handle_to_datatype_tensor(starpu_data_handle_t data_handle, MPI_Data
 
 	ret = MPI_Type_commit(datatype);
 	STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed");
+
+	return 0;
 }
 
 /*
  * 	Vector
  */
 
-static void handle_to_datatype_vector(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
+static int handle_to_datatype_vector(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
 {
 	int ret;
 
@@ -142,13 +148,15 @@ static void handle_to_datatype_vector(starpu_data_handle_t data_handle, MPI_Data
 
 	ret = MPI_Type_commit(datatype);
 	STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed");
+
+	return 0;
 }
 
 /*
  * 	Variable
  */
 
-static void handle_to_datatype_variable(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
+static int handle_to_datatype_variable(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
 {
 	int ret;
 
@@ -159,13 +167,15 @@ static void handle_to_datatype_variable(starpu_data_handle_t data_handle, MPI_Da
 
 	ret = MPI_Type_commit(datatype);
 	STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed");
+
+	return 0;
 }
 
 /*
  * 	Void
  */
 
-static void handle_to_datatype_void(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
+static int handle_to_datatype_void(starpu_data_handle_t data_handle, MPI_Datatype *datatype)
 {
 	int ret;
 	(void)data_handle;
@@ -175,6 +185,8 @@ static void handle_to_datatype_void(starpu_data_handle_t data_handle, MPI_Dataty
 
 	ret = MPI_Type_commit(datatype);
 	STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed");
+
+	return 0;
 }
 
 /*
@@ -225,8 +237,15 @@ void _starpu_mpi_datatype_allocate(starpu_data_handle_t data_handle, struct _sta
 		if (table)
 		{
 			STARPU_ASSERT_MSG(table->allocate_datatype_func, "Handle To Datatype Function not defined for StarPU data interface %d", id);
-			table->allocate_datatype_func(data_handle, &req->datatype);
-			req->registered_datatype = 1;
+			int ret = table->allocate_datatype_func(data_handle, &req->datatype);
+			if (ret == 0)
+				req->registered_datatype = 1;
+			else
+			{
+				/* Couldn't register, probably complex data which needs packing. */
+				req->datatype = MPI_BYTE;
+				req->registered_datatype = 0;
+			}
 		}
 		else
 		{
@@ -315,7 +334,8 @@ void _starpu_mpi_datatype_free(starpu_data_handle_t data_handle, MPI_Datatype *d
 		if (table)
 		{
 			STARPU_ASSERT_MSG(table->free_datatype_func, "Free Datatype Function not defined for StarPU data interface %d", id);
-			table->free_datatype_func(datatype);
+			if (*datatype != MPI_BYTE)
+				table->free_datatype_func(datatype);
 		}
 
 	}