From ef2d5e22c49e40ce5e869f62418f670aa8c0ba48 Mon Sep 17 00:00:00 2001 From: Samuel Thibault <samuel.thibault@ens-lyon.org> Date: Mon, 16 Mar 2020 23:45:44 +0100 Subject: [PATCH] StarPU: Add support for registering MPI data types Fixes #97 --- CMakeLists.txt | 4 +++ runtime/starpu/include/chameleon_starpu.h.in | 1 + .../starpu/interface/cham_tile_interface.c | 36 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 059cebcee..5ecad49b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -656,6 +656,10 @@ if( CHAMELEON_SCHED_STARPU ) set(CHAMELEON_USE_MIGRATE "OFF") message("-- ${Blue}CHAMELEON_USE_MIGRATE is turned OFF because starpu_mpi_data_migrate not found${ColourReset}") endif() + check_function_exists(starpu_mpi_interface_datatype_register HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER) + if ( HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER ) + message("-- ${Blue}Add definition HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER${ColourReset}") + endif() check_function_exists(starpu_interface_copy2d HAVE_STARPU_INTERFACE_COPY2D) if ( HAVE_STARPU_INTERFACE_COPY2D ) message("-- ${Blue}Add definition HAVE_STARPU_INTERFACE_COPY2D${ColourReset}") diff --git a/runtime/starpu/include/chameleon_starpu.h.in b/runtime/starpu/include/chameleon_starpu.h.in index 1dec2fd48..f5a4fc1e6 100644 --- a/runtime/starpu/include/chameleon_starpu.h.in +++ b/runtime/starpu/include/chameleon_starpu.h.in @@ -38,6 +38,7 @@ #cmakedefine HAVE_STARPU_MPI_COMM_GET_ATTR #cmakedefine HAVE_STARPU_MPI_INIT_CONF #cmakedefine HAVE_STARPU_MPI_WAIT_FOR_ALL +#cmakedefine HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER #if defined(CHAMELEON_USE_MPI) #include <starpu_mpi.h> diff --git a/runtime/starpu/interface/cham_tile_interface.c b/runtime/starpu/interface/cham_tile_interface.c index 340918959..04325f473 100644 --- a/runtime/starpu/interface/cham_tile_interface.c +++ b/runtime/starpu/interface/cham_tile_interface.c @@ -481,6 +481,37 @@ cti_handle_get_allocsize( starpu_data_handle_t handle ) return cham_tile_interface->allocsize; } +#if defined(HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER) +int +cti_allocate_datatype( starpu_data_handle_t handle, + MPI_Datatype *datatype ) +{ + int ret; + + starpu_cham_tile_interface_t *cham_tile_interface = (starpu_cham_tile_interface_t *) + starpu_data_get_interface_on_node( handle, STARPU_MAIN_RAM ); + + size_t m = cham_tile_interface->tile.m; + size_t n = cham_tile_interface->tile.n; + size_t ld = cham_tile_interface->tile.ld; + size_t elemsize = CHAMELEON_Element_Size( cham_tile_interface->flttype ); + + ret = MPI_Type_vector( n, m * elemsize, ld * elemsize, MPI_BYTE, datatype ); + STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_vector failed"); + + ret = MPI_Type_commit( datatype ); + STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed"); + + return 0; +} + +void +cti_free_datatype( MPI_Datatype *datatype ) +{ + MPI_Type_free( datatype ); +} +#endif + void starpu_cham_tile_interface_init() __attribute__((constructor)); @@ -490,5 +521,10 @@ starpu_cham_tile_interface_init() if ( starpu_interface_cham_tile_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID ) { starpu_interface_cham_tile_ops.interfaceid = starpu_data_interface_get_next_id(); +#if defined(HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER) + starpu_mpi_interface_datatype_register( starpu_interface_cham_tile_ops.interfaceid, + cti_allocate_datatype, + cti_free_datatype ); +#endif } } -- GitLab