diff --git a/include/internal/fmpi_futhark.h b/include/internal/fmpi_futhark.h index f96d0e21a11a7f7a59d1dfe171a6224ae2ed868e..99673c43496cacccca23bbe9306b4f69ab1499ee 100644 --- a/include/internal/fmpi_futhark.h +++ b/include/internal/fmpi_futhark.h @@ -132,6 +132,13 @@ 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_get_data_sync() +------------------------------------------------------------------------------*/ +void * fmpi_futhark_get_data_sync( + const struct fmpi_futhark_ctx * ctx, void * in, void * out, + enum fmpi_type_base type, size_t dim_cnt +); /*============================================================================== MACRO ==============================================================================*/ diff --git a/include/internal/generic/fmpi_futhark_generic.h b/include/internal/generic/fmpi_futhark_generic.h index cfecb3b6b0d06748a71577bfb0a1e473aa34189d..266a52bf866828ce0b00a0355ebc683a859a7676 100644 --- a/include/internal/generic/fmpi_futhark_generic.h +++ b/include/internal/generic/fmpi_futhark_generic.h @@ -69,6 +69,9 @@ void * fmpi_futhark_new_##D##d_##T( \ ); \ void fmpi_futhark_free_##D##d_##T( \ const struct fmpi_futhark_ctx * ctx, void * array \ +); \ +int fmpi_futhark_values_##D##d_##T( \ + const struct fmpi_futhark_ctx * ctx, void * in, void * out \ ) FMPI_DECLARE_FUNCS_DT(FMPI_FUTHARK_DECLARATION, 1, FMPI_FUTHARK_TYPES); diff --git a/src/fmpi_futhark.c b/src/fmpi_futhark.c index a76aeb3d359da47d96ff126e3ee803888812e7f8..112a8eaaf7403aaa6dad62f3a3618d86bfd9c5a1 100644 --- a/src/fmpi_futhark.c +++ b/src/fmpi_futhark.c @@ -44,6 +44,15 @@ static const fmpi_futhark_new_data_func fmpi_futhark_new_data_func_list[] = { FMPI_FUTHARK_FUNC_ENTRY_LIST(new, 2), FMPI_FUTHARK_FUNC_ENTRY_LIST(new, 3) }; + +typedef int (*fmpi_futhark_get_data_func)( + const struct fmpi_futhark_ctx * ctx, void * in, void * out +); +static const fmpi_futhark_get_data_func fmpi_futhark_get_data_func_list[] = { + FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 1), + FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 2), + FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 3) +}; /*============================================================================== MACRO ==============================================================================*/ @@ -151,6 +160,29 @@ 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_get_data() +------------------------------------------------------------------------------*/ +void * fmpi_futhark_get_data_sync( + const struct fmpi_futhark_ctx * const ctx, void * const in, void * const out, + const enum fmpi_type_base type, const size_t dim_cnt +){ + assert(ctx != NULL); + assert(in != NULL); + assert(out != NULL); + assert(dim_cnt <= FMPI_DIM_MAX); + const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type); + const int err = fmpi_futhark_get_data_func_list[idx](ctx, in, out); + if(err != FUTHARK_SUCCESS) { + FMPI_RAISE_FUTHARK_ERROR(ctx, "futhark_values_##T##_##D##d() failed!"); + return NULL; + } + fmpi_futhark_sync(ctx); + if(fmpi_futhark_check_error(ctx, "futhark_values_##T##_##D##d") == true) { + return NULL; + } + return out; +} #define FMPI_FUTHARK_DEFINITION(D, T) \ void * fmpi_futhark_new_##D##d_##T( \ @@ -178,6 +210,15 @@ void fmpi_futhark_free_##D##d_##T( \ if(err != 0) { \ fmpi_futhark_check_error(ctx, CPL_STRINGIFY(futhark_free_##T##_##D##d)); \ } \ +} \ +int fmpi_futhark_values_##D##d_##T( \ + const struct fmpi_futhark_ctx * const ctx, void * const in, void * const out \ +){ \ + _Static_assert((D) <= FMPI_DIM_MAX, ""); \ + assert(ctx != NULL); \ + assert(in != NULL); \ + assert(out != NULL); \ + return futhark_values_##T##_##D##d(ctx->ctx, in, out); \ } FMPI_DEFINE_FUNCS_DT(FMPI_FUTHARK_DEFINITION, 1, FMPI_FUTHARK_TYPES)