From 397e948c2b5a8cecc1b68d0e31392126c525074b Mon Sep 17 00:00:00 2001 From: "raphael.bach" <raphael.bach@etu.hesge.ch> Date: Mon, 16 May 2022 19:25:52 +0200 Subject: [PATCH] Make `FMPI_TASK_FUTHARK_SYNC()` work with variable number of arguments --- examples/array_sum/main.c | 14 +- include/fmpi_task.h | 10 +- include/internal/generic/fmpi_task_generic.h | 305 ++++++++++++++++++- 3 files changed, 311 insertions(+), 18 deletions(-) diff --git a/examples/array_sum/main.c b/examples/array_sum/main.c index 80a4000..bf10eb0 100644 --- a/examples/array_sum/main.c +++ b/examples/array_sum/main.c @@ -15,7 +15,7 @@ #define T int64_t -FMPI_TASK_FUTHARK_SYNC(fut_array_sum, futhark_entry_array_sum) +FMPI_TASK_FUTHARK_SYNC(array_sum, 1) int main(int argc, char * argv[]) { @@ -27,18 +27,18 @@ int main(int argc, char * argv[]) T in[64] = { 17,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 17,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 17,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, - 0,0,0,0,17,0,0,0, - 0,0,0,0,0,0,0,0, + 17,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,17, }; T out; - struct fmpi_task array_sum_task = FMPI_TASK_REGISTER( - ctx, fut_array_sum, + struct fmpi_task array_sum_task = FMPI_TASK_REGISTER( + ctx, array_sum, fmpi_data_1d_out(ctx, &out, 1), - fmpi_data_1d_in_new(ctx, in, 64), + fmpi_data_1d_in_new(ctx, in, 64) ); fmpi_task_run(ctx, &array_sum_task); if(fmpi_is_root(ctx)) { diff --git a/include/fmpi_task.h b/include/fmpi_task.h index 7b95cc7..85ff21b 100644 --- a/include/fmpi_task.h +++ b/include/fmpi_task.h @@ -168,14 +168,8 @@ void fmpi_task_run(const struct fmpi_ctx * ctx, const struct fmpi_task * task); * FMPI_TASK_FUTHARK_SYNC(fut_array_sum, futhark_entry_array_sum) * } */ -#define FMPI_TASK_FUTHARK_SYNC(task_name, func) \ -void task_name(const struct fmpi_ctx * ctx, const struct fmpi_task_args * args); \ -void task_name(const struct fmpi_ctx * const ctx, const struct fmpi_task_args * const args) { \ - assert(ctx != NULL); \ - assert(args != NULL); \ - func(ctx->fut->ctx, args->out.start, args->in[0].start); \ - fmpi_futhark_sync(ctx->fut); \ -} +#define FMPI_TASK_FUTHARK_SYNC(func, arg_cnt) \ + FMPI_TASK_DEFINITION(func, arg_cnt) /*------------------------------------------------------------------------------ FMPI_TASK_FUTHARK_ASYNC() ------------------------------------------------------------------------------*/ diff --git a/include/internal/generic/fmpi_task_generic.h b/include/internal/generic/fmpi_task_generic.h index f0ce5e3..fcc5de1 100644 --- a/include/internal/generic/fmpi_task_generic.h +++ b/include/internal/generic/fmpi_task_generic.h @@ -34,23 +34,322 @@ #define FMPI_PRIV_TASK_CONCAT(A, B) FMPI_PRIV_TASK_CONCAT_(A, B) #define FMPI_PRIV_TASK_CONCAT_(A, B) A##B +#define FMPI_TASK_DEFINITION(FUNC, N) \ +void FUNC##_##N(const struct fmpi_ctx * ctx, const struct fmpi_task_args * args); \ +void FUNC##_##N( \ + const struct fmpi_ctx * const ctx, const struct fmpi_task_args * const args \ +){ \ + assert(ctx != NULL); \ + assert(args != NULL); \ + assert(args->cnt == N); \ + FMPI_TASK_FUNC_##N(FUNC, ctx->fut->ctx, args); \ + fmpi_futhark_sync(ctx->fut); \ +} + #define FMPI_TASK_REGISTER_IMPL(ctx, func, ...) \ FMPI_PRIV_TASK_CONCAT(FMPI_TASK_REGISTER_, CPL_ARG_COUNT(__VA_ARGS__)) \ (ctx, func, __VA_ARGS__) #define FMPI_TASK_REGISTER_1(ctx, func, arg_out) \ - fmpi_task_register((ctx), (func), &(struct fmpi_task_args){ \ + fmpi_task_register((ctx), func##_0, &(struct fmpi_task_args){ \ .out = (arg_out), \ .cnt = 0 \ }) #define FMPI_TASK_REGISTER_N(ctx, func, arg_out, ...) \ - fmpi_task_register((ctx), (func), &(struct fmpi_task_args){ \ + fmpi_task_register((ctx), FMPI_PRIV_TASK_CONCAT(func##_, CPL_ARG_COUNT(__VA_ARGS__)), &(struct fmpi_task_args){ \ .in = {__VA_ARGS__}, \ .out = (arg_out), \ - .cnt = CPL_ARG_COUNT(__VA_ARGS__)-1 \ + .cnt = CPL_ARG_COUNT(__VA_ARGS__) \ }) +#define FMPI_TASK_FUNC_0(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start) + +#define FMPI_TASK_FUNC_1(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start \ + ) +#define FMPI_TASK_FUNC_2(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start \ + ) +#define FMPI_TASK_FUNC_3(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start \ + ) +#define FMPI_TASK_FUNC_4(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start \ + ) +#define FMPI_TASK_FUNC_5(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start \ + ) +#define FMPI_TASK_FUNC_6(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start \ + ) +#define FMPI_TASK_FUNC_7(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start \ + ) +#define FMPI_TASK_FUNC_8(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start \ + ) +#define FMPI_TASK_FUNC_9(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start \ + ) +#define FMPI_TASK_FUNC_10(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start \ + ) +#define FMPI_TASK_FUNC_11(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start \ + ) +#define FMPI_TASK_FUNC_12(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start \ + ) +#define FMPI_TASK_FUNC_13(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start \ + ) +#define FMPI_TASK_FUNC_14(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start \ + ) +#define FMPI_TASK_FUNC_15(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start \ + ) +#define FMPI_TASK_FUNC_16(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start \ + ) +#define FMPI_TASK_FUNC_17(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start \ + ) +#define FMPI_TASK_FUNC_18(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start \ + ) +#define FMPI_TASK_FUNC_19(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start \ + ) +#define FMPI_TASK_FUNC_20(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start \ + ) +#define FMPI_TASK_FUNC_21(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start \ + ) +#define FMPI_TASK_FUNC_22(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start \ + ) +#define FMPI_TASK_FUNC_23(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start \ + ) +#define FMPI_TASK_FUNC_24(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start \ + ) +#define FMPI_TASK_FUNC_25(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start \ + ) +#define FMPI_TASK_FUNC_26(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start, args->in[25].start \ + ) +#define FMPI_TASK_FUNC_27(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start, args->in[25].start, args->in[26].start \ + ) +#define FMPI_TASK_FUNC_28(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start, args->in[25].start, args->in[26].start, \ + args->in[27].start \ + ) +#define FMPI_TASK_FUNC_29(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start, args->in[25].start, args->in[26].start, \ + args->in[27].start, args->in[28].start \ + ) +#define FMPI_TASK_FUNC_30(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start, args->in[25].start, args->in[26].start, \ + args->in[27].start, args->in[28].start, args->in[29].start \ + ) +#define FMPI_TASK_FUNC_31(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start, args->in[25].start, args->in[26].start, \ + args->in[27].start, args->in[28].start, args->in[29].start, \ + args->in[30].start \ + ) +#define FMPI_TASK_FUNC_32(func, ctx, args) \ + futhark_entry_##func(ctx, args->out.start, \ + args->in[00].start, args->in[01].start, args->in[02].start, \ + args->in[03].start, args->in[04].start, args->in[05].start, \ + args->in[06].start, args->in[07].start, args->in[08].start, \ + args->in[09].start, args->in[10].start, args->in[11].start, \ + args->in[12].start, args->in[13].start, args->in[14].start, \ + args->in[15].start, args->in[16].start, args->in[17].start, \ + args->in[18].start, args->in[19].start, args->in[20].start, \ + args->in[21].start, args->in[22].start, args->in[23].start, \ + args->in[24].start, args->in[25].start, args->in[26].start, \ + args->in[27].start, args->in[28].start, args->in[29].start, \ + args->in[30].start, args->in[31] \ + ) + #define FMPI_TASK_REGISTER_2(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__) #define FMPI_TASK_REGISTER_3(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__) #define FMPI_TASK_REGISTER_4(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__) -- GitLab