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