From b1dbd3afc3675fc844e9c9abf39f53172ddca92e Mon Sep 17 00:00:00 2001
From: "raphael.bach" <raphael.bach@etu.hesge.ch>
Date: Tue, 14 Jun 2022 22:00:11 +0200
Subject: [PATCH] Add `fmpi_stencil` to `fmpi_task`

---
 include/fmpi_task.h                          |  8 ++-
 include/internal/generic/fmpi_task_generic.h | 74 ++++++++++----------
 src/fmpi_task.c                              |  8 ++-
 3 files changed, 47 insertions(+), 43 deletions(-)

diff --git a/include/fmpi_task.h b/include/fmpi_task.h
index 19ca51d..98ae439 100644
--- a/include/fmpi_task.h
+++ b/include/fmpi_task.h
@@ -31,6 +31,7 @@
 // Internal
 #include "fmpi_data.h"
 #include "fmpi_domain.h"
+#include "fmpi_stencil.h"
 #include "internal/fmpi_futhark.h"
 #include "internal/generic/fmpi_task_generic.h"
 /*==============================================================================
@@ -92,6 +93,7 @@ typedef struct fmpi_task {
     fmpi_task_func func;        //!< TODO
     struct fmpi_task_args args; //!< TODO
     struct fmpi_domain domains[FMPI_TASK_ARGS_MAX]; //!< TODO
+    struct fmpi_stencil stencil; //!< TODO
 } fmpi_task;
 /*==============================================================================
     PUBLIC FUNCTION
@@ -119,7 +121,7 @@ typedef struct fmpi_task {
  */
 struct fmpi_task fmpi_task_register(
     struct fmpi_ctx * ctx, const fmpi_task_func func,
-    const struct fmpi_task_args * args
+    struct fmpi_stencil stencil, const struct fmpi_task_args * args
 );
 /*------------------------------------------------------------------------------
     fmpi_task_run()
@@ -147,8 +149,8 @@ void fmpi_task_run(const struct fmpi_ctx * ctx, const struct fmpi_task * task);
 /*------------------------------------------------------------------------------
     FMPI_TASK_REGISTER()
 ------------------------------------------------------------------------------*/
-#define FMPI_TASK_REGISTER(ctx, func, ...) \
-    FMPI_TASK_REGISTER_IMPL(ctx, func, __VA_ARGS__)
+#define FMPI_TASK_REGISTER(ctx, func, stencil, ...) \
+    FMPI_TASK_REGISTER_IMPL(ctx, func, stencil, __VA_ARGS__)
 /*------------------------------------------------------------------------------
     FMPI_TASK_FUTHARK_SYNC()
 ------------------------------------------------------------------------------*/
diff --git a/include/internal/generic/fmpi_task_generic.h b/include/internal/generic/fmpi_task_generic.h
index fcc5de1..dee037a 100644
--- a/include/internal/generic/fmpi_task_generic.h
+++ b/include/internal/generic/fmpi_task_generic.h
@@ -46,18 +46,18 @@ void FUNC##_##N( \
     fmpi_futhark_sync(ctx->fut); \
 }
 
-#define FMPI_TASK_REGISTER_IMPL(ctx, func, ...) \
+#define FMPI_TASK_REGISTER_IMPL(ctx, func, stencil, ...) \
     FMPI_PRIV_TASK_CONCAT(FMPI_TASK_REGISTER_, CPL_ARG_COUNT(__VA_ARGS__)) \
-    (ctx, func, __VA_ARGS__)
+    (ctx, func, stencil,__VA_ARGS__)
 
-#define FMPI_TASK_REGISTER_1(ctx, func, arg_out) \
-    fmpi_task_register((ctx), func##_0, &(struct fmpi_task_args){ \
+#define FMPI_TASK_REGISTER_1(ctx, func, stencil, arg_out) \
+    fmpi_task_register((ctx), func##_0, stencil, &(struct fmpi_task_args){ \
         .out = (arg_out), \
         .cnt = 0 \
     })
 
-#define FMPI_TASK_REGISTER_N(ctx, func, arg_out, ...) \
-    fmpi_task_register((ctx), FMPI_PRIV_TASK_CONCAT(func##_, CPL_ARG_COUNT(__VA_ARGS__)), &(struct fmpi_task_args){ \
+#define FMPI_TASK_REGISTER_N(ctx, func, stencil, arg_out, ...) \
+    fmpi_task_register((ctx), FMPI_PRIV_TASK_CONCAT(func##_, CPL_ARG_COUNT(__VA_ARGS__)), stencil, &(struct fmpi_task_args){ \
         .in = {__VA_ARGS__}, \
         .out = (arg_out), \
         .cnt = CPL_ARG_COUNT(__VA_ARGS__) \
@@ -350,37 +350,37 @@ void FUNC##_##N( \
         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__)
-#define FMPI_TASK_REGISTER_5(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_6(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_7(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_8(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_9(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_10(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_11(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_12(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_13(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_14(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_15(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_16(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_17(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_18(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_19(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_20(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_21(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_22(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_23(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_24(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_25(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_26(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_27(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_28(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_29(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_30(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_31(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_32(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_2(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_3(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_4(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_5(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_6(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_7(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_8(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_9(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_10(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_11(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_12(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_13(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_14(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_15(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_16(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_17(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_18(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_19(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_20(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_21(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_22(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_23(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_24(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_25(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_26(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_27(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_28(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_29(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_30(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_31(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_32(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
 /*==============================================================================
     GUARD
 ==============================================================================*/
diff --git a/src/fmpi_task.c b/src/fmpi_task.c
index f49e921..2995731 100644
--- a/src/fmpi_task.c
+++ b/src/fmpi_task.c
@@ -28,6 +28,7 @@
 #include <stdint.h> // int64_t
 // Internal
 #include "fmpi_domain.h"
+#include "fmpi_stencil.h"
 #include "internal/fmpi_ctx.h"
 #include "internal/fmpi_futhark.h"
 #include "internal/fmpi_futhark_entry.h"
@@ -40,15 +41,16 @@
     fmpi_task_run()
 ------------------------------------------------------------------------------*/
 struct fmpi_task fmpi_task_register(
-    struct fmpi_ctx * const ctx, const fmpi_task_func func,
-    const struct fmpi_task_args * const args
+    struct fmpi_ctx * ctx, const fmpi_task_func func,
+    const struct fmpi_stencil stencil, const struct fmpi_task_args * args
 ){
     assert(ctx != NULL);
     assert(ctx->task_cnt < FMPI_TASK_MAX);
     assert(args != NULL);
     struct fmpi_task task = {
         .func = func,
-        .args = *args
+        .args = *args,
+        .stencil = stencil
     };
     const size_t rank = (size_t)ctx->mpi->rank;
     for(size_t i = 0; i < task.args.cnt; i++) {
-- 
GitLab