Selaa lähdekoodia

mpi: new functions starpu_mpi_interface_datatype_register() and
starpu_mpi_interface_datatype_unregister() which take a enum
starpu_data_interface_id instead of a starpu_data_handle_t

Nathalie Furmento 5 vuotta sitten
vanhempi
commit
29f1c3a26d
2 muutettua tiedostoa jossa 30 lisäystä ja 4 poistoa
  1. 17 1
      mpi/include/starpu_mpi.h
  2. 13 3
      mpi/src/starpu_mpi_datatype.c

+ 17 - 1
mpi/include/starpu_mpi.h

@@ -350,11 +350,27 @@ typedef void (*starpu_mpi_datatype_free_func_t)(MPI_Datatype *);
 int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func);
 
 /**
+   Register functions to create and free a MPI datatype for the given
+   interface id.
+   Similar to starpu_mpi_datatype_register().
+   It is important that the function is called before any
+   communication can take place for a data with the given handle. See
+   \ref ExchangingUserDefinedDataInterface for an example.
+*/
+int starpu_mpi_interface_datatype_register(enum starpu_data_interface_id id, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func);
+
+/**
    Unregister the MPI datatype functions stored for the interface of
    the given handle.
 */
 int starpu_mpi_datatype_unregister(starpu_data_handle_t handle);
 
+/**
+   Unregister the MPI datatype functions stored for the interface of
+   the given interface id. Similar to starpu_mpi_datatype_unregister().
+*/
+int starpu_mpi_interface_datatype_unregister(enum starpu_data_interface_id id);
+
 /** @} */
 
 /**
@@ -518,7 +534,7 @@ starpu_mpi_tag_t starpu_mpi_data_get_tag(starpu_data_handle_t handle);
 	If there is several nodes owning data in ::STARPU_W mode, a
 	node will be selected according to a given node selection
 	policy (see ::STARPU_NODE_SELECTION_POLICY or
-	starpu_mpi_node_selection_set_current_policy()) 
+	starpu_mpi_node_selection_set_current_policy())
 	<li>
 	The argument ::STARPU_EXECUTE_ON_NODE followed by an integer
 	can be used to specify the node;

+ 13 - 3
mpi/src/starpu_mpi_datatype.c

@@ -322,9 +322,8 @@ void _starpu_mpi_datatype_free(starpu_data_handle_t data_handle, MPI_Datatype *d
 	/* else the datatype is not predefined by StarPU */
 }
 
-int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func)
+int starpu_mpi_interface_datatype_register(enum starpu_data_interface_id id, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func);
 {
-	enum starpu_data_interface_id id = starpu_data_get_interface_id(handle);
 	struct _starpu_mpi_datatype_funcs *table;
 
 	STARPU_ASSERT_MSG(id >= STARPU_MAX_INTERFACE_ID, "Cannot redefine the MPI datatype for a predefined StarPU datatype");
@@ -349,9 +348,14 @@ int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatyp
 	return 0;
 }
 
-int starpu_mpi_datatype_unregister(starpu_data_handle_t handle)
+int starpu_mpi_datatype_register(starpu_data_handle_t handle, starpu_mpi_datatype_allocate_func_t allocate_datatype_func, starpu_mpi_datatype_free_func_t free_datatype_func)
 {
 	enum starpu_data_interface_id id = starpu_data_get_interface_id(handle);
+	starpu_mpi_interface_datatype_register(id, allocate_datatype_func, free_datatype_func);
+}
+
+int starpu_mpi_interface_datatype_unregister(enum starpu_data_interface_id id)
+{
 	struct _starpu_mpi_datatype_funcs *table;
 
 	STARPU_ASSERT_MSG(id >= STARPU_MAX_INTERFACE_ID, "Cannot redefine the MPI datatype for a predefined StarPU datatype");
@@ -366,3 +370,9 @@ int starpu_mpi_datatype_unregister(starpu_data_handle_t handle)
 	STARPU_PTHREAD_MUTEX_UNLOCK(&_starpu_mpi_datatype_funcs_table_mutex);
 	return 0;
 }
+
+int starpu_mpi_datatype_unregister(starpu_data_handle_t handle)
+{
+	enum starpu_data_interface_id id = starpu_data_get_interface_id(handle);
+	starpu_mpi_interface_datatype_unregister(id);
+}