diff --git a/CMakeLists.txt b/CMakeLists.txt index 059cebceebf032ba903c17bd70cdb2c77a17296c..5ecad49b276fd783d159dfc0a022c8a7f6f47ad6 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 1dec2fd4898764cb08a601e778de6651609d3a10..f5a4fc1e6819f07549341639eb0c08324d01a799 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 34091895989c0c8360332ceda412a9d862600735..04325f473fedca87d80380ea3e07bd04dc21040a 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 } }