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