diff --git a/include/internal/fmpi_futhark.h b/include/internal/fmpi_futhark.h index c87d0a0a7193e885158ff6e26ec864d6393da7f6..19912fd58c9d444c7dd6147bafa6ae652155a645 100644 --- a/include/internal/fmpi_futhark.h +++ b/include/internal/fmpi_futhark.h @@ -132,6 +132,20 @@ void * fmpi_futhark_new_data( const struct fmpi_futhark_ctx * ctx, const void * data, enum fmpi_type_base type, size_t dim_cnt, size_t x, size_t y, size_t z ); +/*------------------------------------------------------------------------------ + fmpi_futhark_free_data_sync() +------------------------------------------------------------------------------*/ +int fmpi_futhark_free_data_sync( + const struct fmpi_futhark_ctx * ctx, void * data, enum fmpi_type_base type, + size_t dim_cnt +); +/*------------------------------------------------------------------------------ + fmpi_futhark_free_data_async() +------------------------------------------------------------------------------*/ +int fmpi_futhark_free_data_async( + const struct fmpi_futhark_ctx * ctx, void * data, enum fmpi_type_base type, + size_t dim_cnt +); /*------------------------------------------------------------------------------ fmpi_futhark_get_data_sync() ------------------------------------------------------------------------------*/ diff --git a/include/internal/generic/fmpi_futhark_generic.h b/include/internal/generic/fmpi_futhark_generic.h index 266a52bf866828ce0b00a0355ebc683a859a7676..a00cea6eb6ee477941bf0c8636860a8d19d13f75 100644 --- a/include/internal/generic/fmpi_futhark_generic.h +++ b/include/internal/generic/fmpi_futhark_generic.h @@ -67,8 +67,8 @@ struct fmpi_futhark_ctx; void * fmpi_futhark_new_##D##d_##T( \ const struct fmpi_futhark_ctx * ctx, const void * array, size_t x, size_t y, size_t z \ ); \ -void fmpi_futhark_free_##D##d_##T( \ - const struct fmpi_futhark_ctx * ctx, void * array \ +int fmpi_futhark_free_##D##d_##T( \ + const struct fmpi_futhark_ctx * ctx, void * data \ ); \ int fmpi_futhark_values_##D##d_##T( \ const struct fmpi_futhark_ctx * ctx, void * in, void * out \ diff --git a/src/fmpi_futhark.c b/src/fmpi_futhark.c index 90350bd4a87038e72cc3fa55ff88c81a4bb204f5..430d4fc64420b8435e1e1c0db014075eec6bac69 100644 --- a/src/fmpi_futhark.c +++ b/src/fmpi_futhark.c @@ -45,6 +45,15 @@ static const fmpi_futhark_new_data_func fmpi_futhark_new_data_func_list[] = { FMPI_FUTHARK_FUNC_ENTRY_LIST(new, 3) }; +typedef int (*fmpi_futhark_free_data_func)( + const struct fmpi_futhark_ctx * ctx, void * data +); +static const fmpi_futhark_free_data_func fmpi_futhark_free_data_func_list[] = { + FMPI_FUTHARK_FUNC_ENTRY_LIST(free, 1), + FMPI_FUTHARK_FUNC_ENTRY_LIST(free, 2), + FMPI_FUTHARK_FUNC_ENTRY_LIST(free, 3) +}; + typedef int (*fmpi_futhark_get_data_func)( const struct fmpi_futhark_ctx * ctx, void * in, void * out ); @@ -160,6 +169,33 @@ void * fmpi_futhark_new_data( const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type); return fmpi_futhark_new_data_func_list[idx](ctx, data, x, y, z); } +/*------------------------------------------------------------------------------ + fmpi_futhark_free_data_sync() +------------------------------------------------------------------------------*/ +int fmpi_futhark_free_data_sync( + const struct fmpi_futhark_ctx * const ctx, void * const data, + const enum fmpi_type_base type, const size_t dim_cnt +){ + assert(ctx != NULL); + assert(data != NULL); + const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type); + const int err = fmpi_futhark_free_data_func_list[idx](ctx, data); + fmpi_futhark_sync(ctx); + fmpi_futhark_check_error(ctx, "futhark_free_##T##_##D##"); + return err; +} +/*------------------------------------------------------------------------------ + fmpi_futhark_free_data_async() +------------------------------------------------------------------------------*/ +int fmpi_futhark_free_data_async( + const struct fmpi_futhark_ctx * const ctx, void * const data, + const enum fmpi_type_base type, const size_t dim_cnt +){ + assert(ctx != NULL); + assert(data != NULL); + const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type); + return fmpi_futhark_free_data_func_list[idx](ctx, data); +} /*------------------------------------------------------------------------------ fmpi_futhark_get_data_sync() ------------------------------------------------------------------------------*/ @@ -214,17 +250,17 @@ void * fmpi_futhark_new_##D##d_##T( \ fmpi_futhark_sync(ctx); \ return data; \ } \ -void fmpi_futhark_free_##D##d_##T( \ - const struct fmpi_futhark_ctx * const ctx, void * const array \ +int fmpi_futhark_free_##D##d_##T( \ + const struct fmpi_futhark_ctx * const ctx, void * const data \ ){ \ _Static_assert((D) <= FMPI_DIM_MAX, ""); \ assert(ctx != NULL); \ - assert(array != NULL); \ - fmpi_futhark_sync(ctx); \ - const int err = futhark_free_##T##_##D##d(ctx->ctx, array); \ - if(err != 0) { \ - fmpi_futhark_check_error(ctx, CPL_STRINGIFY(futhark_free_##T##_##D##d)); \ + assert(data != NULL); \ + const int err = futhark_free_##T##_##D##d(ctx->ctx, data); \ + if(err != FUTHARK_SUCCESS) { \ + FMPI_RAISE_FUTHARK_ERROR(ctx, CPL_STRINGIFY(futhark_free_##T##_##D##d)"() failed!"); \ } \ + return err; \ } \ int fmpi_futhark_values_##D##d_##T( \ const struct fmpi_futhark_ctx * const ctx, void * const in, void * const out \