From 29d0db24d5c877bb65fc34a35280641f25df544c Mon Sep 17 00:00:00 2001 From: "raphael.bach" <raphael.bach@etu.hesge.ch> Date: Thu, 23 Jun 2022 22:12:30 +0200 Subject: [PATCH] Add `fmpi_futhark_new_data_{sync,async}()` --- include/internal/fmpi_futhark.h | 11 ++++++++-- src/fmpi_futhark.c | 34 ++++++++++++++++++++++-------- src/fmpi_task.c | 37 ++++++++++++++++++++++++++------- 3 files changed, 63 insertions(+), 19 deletions(-) diff --git a/include/internal/fmpi_futhark.h b/include/internal/fmpi_futhark.h index 19912fd..1947b5c 100644 --- a/include/internal/fmpi_futhark.h +++ b/include/internal/fmpi_futhark.h @@ -126,9 +126,16 @@ int fmpi_futhark_sync(const struct fmpi_futhark_ctx * ctx); */ _Bool fmpi_futhark_check_error(const struct fmpi_futhark_ctx * ctx, const char * func); /*------------------------------------------------------------------------------ - fmpi_futhark_new_data() + fmpi_futhark_new_data_sync() ------------------------------------------------------------------------------*/ -void * fmpi_futhark_new_data( +void * fmpi_futhark_new_data_sync( + 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_new_data_async() +------------------------------------------------------------------------------*/ +void * fmpi_futhark_new_data_async( 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 ); diff --git a/src/fmpi_futhark.c b/src/fmpi_futhark.c index 4815641..98e88e3 100644 --- a/src/fmpi_futhark.c +++ b/src/fmpi_futhark.c @@ -156,9 +156,26 @@ _Bool fmpi_futhark_check_error( return false; } /*------------------------------------------------------------------------------ - fmpi_futhark_new_data() + fmpi_futhark_new_data_sync() ------------------------------------------------------------------------------*/ -void * fmpi_futhark_new_data( +void * fmpi_futhark_new_data_sync( + const struct fmpi_futhark_ctx * const ctx, const void * const data, + const enum fmpi_type_base type, const size_t dim_cnt, + const size_t x, const size_t y, const size_t z +){ + assert(ctx != NULL); + assert(data != NULL); + assert(dim_cnt <= FMPI_DIM_MAX); + const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type); + void * new_data = fmpi_futhark_new_data_func_list[idx](ctx, data, x, y, z); + fmpi_futhark_sync(ctx); + fmpi_futhark_check_error(ctx, "futhark_new_##T##_##D##"); + return new_data; +} +/*------------------------------------------------------------------------------ + fmpi_futhark_new_data_async() +------------------------------------------------------------------------------*/ +void * fmpi_futhark_new_data_async( const struct fmpi_futhark_ctx * const ctx, const void * const data, const enum fmpi_type_base type, const size_t dim_cnt, const size_t x, const size_t y, const size_t z @@ -236,18 +253,17 @@ void * fmpi_futhark_get_data_async( #define FMPI_FUTHARK_DEFINITION(D, T) \ void * fmpi_futhark_new_##D##d_##T( \ - const struct fmpi_futhark_ctx * const ctx, const void * const array, \ + const struct fmpi_futhark_ctx * const ctx, const void * const data, \ const size_t x, const size_t y, const size_t z \ ){ \ _Static_assert((D) <= FMPI_DIM_MAX, ""); \ assert(ctx != NULL); \ - assert(array != NULL); \ - struct futhark_##T##_##D##d * data = FMPI_FUTHARK_NEW_##D(T, ctx->ctx, array, x, y, z); \ - if(data == NULL) { \ - fmpi_futhark_check_error(ctx, CPL_STRINGIFY(futhark_new_##T##_##D##d)); \ + assert(data != NULL); \ + struct futhark_##T##_##D##d * new_data = FMPI_FUTHARK_NEW_##D(T, ctx->ctx, data, x, y, z); \ + if(new_data == NULL) { \ + FMPI_RAISE_FUTHARK_ERROR(ctx, CPL_STRINGIFY(futhark_new_##T##_##D##d)"() failed!"); \ } \ - fmpi_futhark_sync(ctx); \ - return data; \ + return new_data; \ } \ int fmpi_futhark_free_##D##d_##T( \ const struct fmpi_futhark_ctx * const ctx, void * const data \ diff --git a/src/fmpi_task.c b/src/fmpi_task.c index a2babfb..848365e 100644 --- a/src/fmpi_task.c +++ b/src/fmpi_task.c @@ -64,14 +64,35 @@ struct fmpi_task fmpi_task_register( FMPI_RAISE_ERROR(ctx->err_handler, "FMPI", "fmpi_new_domain() failed!"); continue; } - void * start = fmpi_futhark_new_data( - ctx->fut, task.domains[i].parts[rank].start, task.domains[i].data.type.base, - task.domains[i].data.dim_cnt, - task.domains[i].parts[rank].dim_len[0], - task.domains[i].parts[rank].dim_len[1], - task.domains[i].parts[rank].dim_len[2] - ); - task.args.in[i].start = start; + void * data = NULL; + if(task.type == FMPI_TASK_TYPE_SYNC) { + data = fmpi_futhark_new_data_sync( + ctx->fut, task.domains[i].parts[rank].start, task.domains[i].data.type.base, + task.domains[i].data.dim_cnt, + task.domains[i].parts[rank].dim_len[0], + task.domains[i].parts[rank].dim_len[1], + task.domains[i].parts[rank].dim_len[2] + ); + if(data == NULL) { + FMPI_RAISE_ERROR(ctx->err_handler, "FMPI", + "fmpi_futhark_new_data_sync() failed!" + ); + } + } else { + data = fmpi_futhark_new_data_async( + ctx->fut, task.domains[i].parts[rank].start, task.domains[i].data.type.base, + task.domains[i].data.dim_cnt, + task.domains[i].parts[rank].dim_len[0], + task.domains[i].parts[rank].dim_len[1], + task.domains[i].parts[rank].dim_len[2] + ); + if(data == NULL) { + FMPI_RAISE_ERROR(ctx->err_handler, "FMPI", + "fmpi_futhark_new_data_async() failed!" + ); + } + } + task.args.in[i].start = data; } ctx->tasks[ctx->task_cnt++] = task; if(task.type == FMPI_TASK_TYPE_SYNC) { -- GitLab