diff --git a/CMakeLists.txt b/CMakeLists.txt index 15ea0144e1860d88c8d9b87ba0464dfb46a92df0..3ca797c2129058e1db8af4ce189a3565b5243306 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_interface_copy2d HAVE_STARPU_INTERFACE_COPY2D) + if ( HAVE_STARPU_INTERFACE_COPY2D ) + message("-- ${Blue}Add definition HAVE_STARPU_INTERFACE_COPY2D${ColourReset}") + endif() if (CHAMELEON_USE_MPI) # Check if a specific function exist check_function_exists(starpu_mpi_data_register_comm HAVE_STARPU_MPI_DATA_REGISTER) diff --git a/runtime/starpu/include/chameleon_starpu.h.in b/runtime/starpu/include/chameleon_starpu.h.in index 7fb15f321ab21ad2c9bfb17a8e93771bbb0d0b2e..fed67ec50d78da3e941a3423775683218a983b6b 100644 --- a/runtime/starpu/include/chameleon_starpu.h.in +++ b/runtime/starpu/include/chameleon_starpu.h.in @@ -30,6 +30,7 @@ #cmakedefine HAVE_STARPU_DATA_SET_COORDINATES #cmakedefine HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS #cmakedefine HAVE_STARPU_DATA_SET_OOC_FLAG +#cmakedefine HAVE_STARPU_INTERFACE_COPY2D #cmakedefine HAVE_STARPU_MPI_DATA_MIGRATE #cmakedefine HAVE_STARPU_MPI_DATA_REGISTER #cmakedefine HAVE_STARPU_MPI_COMM_RANK diff --git a/runtime/starpu/interface/cham_tile_interface.c b/runtime/starpu/interface/cham_tile_interface.c index 549ed65f14f8692db8e623cbbd0cb6ecba56dc8f..93ecebfc193b4f3aa6fc23acdc3741b8d7bafb98 100644 --- a/runtime/starpu/interface/cham_tile_interface.c +++ b/runtime/starpu/interface/cham_tile_interface.c @@ -361,6 +361,36 @@ cti_describe( void *data_interface, char *buf, size_t size ) (unsigned) cham_tile_interface->flttype ); } +#ifdef HAVE_STARPU_INTERFACE_COPY2D +static int cti_copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) +{ + starpu_cham_tile_interface_t *cham_tile_src = (starpu_cham_tile_interface_t *) src_interface; + starpu_cham_tile_interface_t *cham_tile_dst = (starpu_cham_tile_interface_t *) dst_interface; + size_t elemsize = CHAMELEON_Element_Size( cham_tile_src->flttype ); + size_t m = cham_tile_src->tile.m; + size_t n = cham_tile_src->tile.n; + size_t ld_src = cham_tile_src->tile.ld; + size_t ld_dst = cham_tile_dst->tile.ld; + int ret = 0; + + if (starpu_interface_copy2d( (uintptr_t) cham_tile_src->tile.mat, 0, src_node, + (uintptr_t) cham_tile_dst->tile.mat, 0, dst_node, + m * elemsize, + n, ld_src * elemsize, ld_dst * elemsize, + async_data) ) + ret = -EAGAIN; + + starpu_interface_data_copy( src_node, dst_node, (size_t) n*m*elemsize ); + + return ret; +} + +static const struct starpu_data_copy_methods cti_copy_methods = +{ + .any_to_any = cti_copy_any_to_any, +}; +#endif + struct starpu_data_interface_ops starpu_interface_cham_tile_ops = { .init = cti_init, @@ -379,7 +409,9 @@ struct starpu_data_interface_ops starpu_interface_cham_tile_ops = .pack_data = cti_pack_data, .unpack_data = cti_unpack_data, .describe = cti_describe, - //.copy_methods =&cti_copy_methods, +#ifdef HAVE_STARPU_INTERFACE_COPY2D + .copy_methods =&cti_copy_methods, +#endif .interfaceid = STARPU_UNKNOWN_INTERFACE_ID, .interface_size = sizeof(starpu_cham_tile_interface_t), .name = "STARPU_CHAM_TILE_INTERFACE"