From 8668a01effa639990e3467c5b4ccf50fc88ad82e Mon Sep 17 00:00:00 2001
From: Thierry <thierry.gautier@inrialpes.fr>
Date: Tue, 12 Dec 2017 13:06:43 +0100
Subject: [PATCH] [add] support for omp_task_declare_dependencies_array and
 omp_task_declare_dependencies_array_noalias. These OMP runtime functions let
 the user to pass an array of count items, each item of size 'extent', to the
 runtime in order to indicate that there are dependencies on each item of the
 array.

---
 runtime/src/dllexports           |  2 +
 runtime/src/include/40/omp.h.var |  2 +
 runtime/src/include/45/omp.h.var |  2 +
 runtime/src/include/50/omp.h.var |  2 +
 runtime/src/kmp.h                |  3 ++
 runtime/src/kmp_ftn_entry.h      | 19 ++++++++
 runtime/src/kmp_ftn_os.h         |  8 ++++
 runtime/src/kmp_taskdeps.cpp     | 74 +++++++++++++++++++++++++++++++-
 8 files changed, 110 insertions(+), 2 deletions(-)

diff --git a/runtime/src/dllexports b/runtime/src/dllexports
index c99f073..9631fdc 100644
--- a/runtime/src/dllexports
+++ b/runtime/src/dllexports
@@ -510,6 +510,8 @@ kmp_set_warnings_off                        780
     omp_set_depend_info                     4002
     omp_task_declare_dependencies           4003
     omp_task_declare_dependencies_noalias   4004
+    omp_task_declare_dependencies_array         4005
+    omp_task_declare_dependencies_array_noalias 4006
     omp_get_num_teams                       865
     omp_get_team_num                        866
     omp_get_cancellation                    867
diff --git a/runtime/src/include/40/omp.h.var b/runtime/src/include/40/omp.h.var
index 3cbf611..3840fa0 100644
--- a/runtime/src/include/40/omp.h.var
+++ b/runtime/src/include/40/omp.h.var
@@ -128,6 +128,8 @@
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array( int, int, int, void* );
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array_noalias( int, int, int, void* );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies( int, int, void** );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_noalias( int, int, void** );
 #endif
diff --git a/runtime/src/include/45/omp.h.var b/runtime/src/include/45/omp.h.var
index b606711..789832c 100644
--- a/runtime/src/include/45/omp.h.var
+++ b/runtime/src/include/45/omp.h.var
@@ -146,6 +146,8 @@
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array( int, int, int, void* );
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array_noalias( int, int, int, void* );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies( int, int, void** );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_noalias( int, int, void** );
 #endif
diff --git a/runtime/src/include/50/omp.h.var b/runtime/src/include/50/omp.h.var
index b623c7a..69e36c9 100644
--- a/runtime/src/include/50/omp.h.var
+++ b/runtime/src/include/50/omp.h.var
@@ -146,6 +146,8 @@
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array( int, int, int, void* );
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array_noalias( int, int, int, void* );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies( int, int, void** );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_noalias( int, int, void** );
 #endif
diff --git a/runtime/src/kmp.h b/runtime/src/kmp.h
index 9c27f68..6f97ab2 100644
--- a/runtime/src/kmp.h
+++ b/runtime/src/kmp.h
@@ -2284,6 +2284,7 @@ typedef struct kmp_extra_depinfo kmp_extra_depinfo_t;
 /* extra deps from user program store by thread */
 struct kmp_extra_depinfo_th {
   kmp_uint32           ed_size;            // extra dependencies for the next task
+  kmp_uint32           ed_extent;          // extent if ed_mode & OMPEXT_MODE_ARRAY is true
   kmp_uint16           ed_mode;            // access mode
   kmp_uint16           ed_noalias;         // 0 if alias, else 1 if no alias deps
   kmp_intptr_t*        ed_deps;
@@ -3848,6 +3849,8 @@ KMP_EXPORT void __kmpc_end_push_init();
 KMP_EXPORT void __kmpc_omp_set_depend_info(void * addr, kmp_uint32 flag);
 KMP_EXPORT int __kmpc_omp_task_declare_dependencies(  ident_t *loc_ref, kmp_int32 gtid, int, int , void** );
 KMP_EXPORT int __kmpc_omp_task_declare_dependencies_noalias( ident_t *loc_ref, kmp_int32 gtid, int, int, void** );
+KMP_EXPORT int __kmpc_omp_task_declare_dependencies_array(  ident_t *loc_ref, kmp_int32 gtid, int, int, int, void* );
+KMP_EXPORT int __kmpc_omp_task_declare_dependencies_array_noalias( ident_t *loc_ref, kmp_int32 gtid, int, int, int, void* );
 
 KMP_EXPORT void __kmpc_taskgroup(ident_t *loc, int gtid);
 KMP_EXPORT void __kmpc_end_taskgroup(ident_t *loc, int gtid);
diff --git a/runtime/src/kmp_ftn_entry.h b/runtime/src/kmp_ftn_entry.h
index 19720f7..f4d8c6c 100644
--- a/runtime/src/kmp_ftn_entry.h
+++ b/runtime/src/kmp_ftn_entry.h
@@ -618,6 +618,25 @@ FN_TASK_DECLDEPS_NOALIAS( int mode, int count, void** array)
         return __kmpc_omp_task_declare_dependencies_noalias(0, __kmp_entry_gtid(), mode, count, array);
     #endif
 }
+int FTN_STDCALL
+FN_TASK_DECLDEPS_ARRAY( int mode, int count, int extent, void** array)
+{
+    #ifdef KMP_STUB
+        return __kmpc_omp_task_declare_dependencies_array(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #else
+        return __kmpc_omp_task_declare_dependencies_array(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #endif
+}
+
+int FTN_STDCALL
+FN_TASK_DECLDEPS_ARRAY_NOALIAS( int mode, int count, int extent, void** array)
+{
+    #ifdef KMP_STUB
+        return __kmpc_omp_task_declare_dependencies_array_noalias(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #else
+        return __kmpc_omp_task_declare_dependencies_array_noalias(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #endif
+}
 #endif
 
 kmp_proc_bind_t FTN_STDCALL xexpand(FTN_GET_PROC_BIND)(void) {
diff --git a/runtime/src/kmp_ftn_os.h b/runtime/src/kmp_ftn_os.h
index ca3aee3..95eaf02 100644
--- a/runtime/src/kmp_ftn_os.h
+++ b/runtime/src/kmp_ftn_os.h
@@ -83,6 +83,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS omp_task_declare_dependencies
 #define FN_TASK_DECLDEPS_NOALIAS omp_task_declare_dependencies_noalias
+#define FN_TASK_DECLDEPS_ARRAY omp_task_declare_dependencies_array
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS omp_task_declare_dependencies_array_noalias
 #endif
 #define FTN_GET_NUM_TEAMS omp_get_num_teams
 #define FTN_GET_TEAM_NUM omp_get_team_num
@@ -208,6 +210,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS omp_task_declare_dependencies_
 #define FN_TASK_DECLDEPS_NOALIAS omp_task_declare_dependencies_noalias_
+#define FN_TASK_DECLDEPS_ARRAY omp_task_declare_dependencies_array_
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS omp_task_declare_dependencies_array_noalias_
 #endif
 #define FTN_GET_NUM_TEAMS omp_get_num_teams_
 #define FTN_GET_TEAM_NUM omp_get_team_num_
@@ -334,6 +338,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS OMP_TASK_DECLARE_DEPENDENCIES
 #define FN_TASK_DECLDEPS_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_NOALIAS
+#define FN_TASK_DECLDEPS_ARRAY OMP_TASK_DECLARE_DEPENDENCIES_ARRAY
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_ARRAY_NOALIAS
 #endif
 #define FTN_GET_NUM_TEAMS OMP_GET_NUM_TEAMS
 #define FTN_GET_TEAM_NUM OMP_GET_TEAM_NUM
@@ -460,6 +466,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS OMP_TASK_DECLARE_DEPENDENCIES_
 #define FN_TASK_DECLDEPS_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_NOALIAS_
+#define FN_TASK_DECLDEPS_ARRAY OMP_TASK_DECLARE_DEPENDENCIES_ARRAY_
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_ARRAY_NOALIAS_
 #endif
 #define FTN_GET_NUM_TEAMS OMP_GET_NUM_TEAMS_
 #define FTN_GET_TEAM_NUM OMP_GET_TEAM_NUM_
diff --git a/runtime/src/kmp_taskdeps.cpp b/runtime/src/kmp_taskdeps.cpp
index 95c0c38..0467c96 100644
--- a/runtime/src/kmp_taskdeps.cpp
+++ b/runtime/src/kmp_taskdeps.cpp
@@ -917,6 +917,7 @@ static int kmp_add_extradeps( kmp_info_t *thread, int kind,
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+#define OMPEXT_MODE_ARRAY      (1<<8)
 
   kmp_extra_depinfo_th_t* bloc;
   if (thread->th.th_edeps_tail[kind] !=0)
@@ -925,6 +926,7 @@ static int kmp_add_extradeps( kmp_info_t *thread, int kind,
     bloc = &thread->th.th_edeps[kind];
 
   bloc->ed_size    = count;
+  bloc->ed_extent  = 0;
   bloc->ed_deps    = (kmp_intptr_t*)array;
   bloc->ed_mode    = (kmp_uint16)mode;
   bloc->ed_noalias = kind;
@@ -936,6 +938,29 @@ static int kmp_add_extradeps( kmp_info_t *thread, int kind,
   return 0;
 }
 
+/* */
+static int kmp_add_extradeps_array( kmp_info_t *thread, int kind,
+                                    int mode, int count, int extent, void* array)
+{
+  kmp_extra_depinfo_th_t* bloc;
+  if (thread->th.th_edeps_tail[kind] !=0)
+    bloc = (kmp_extra_depinfo_th_t*)__kmp_fast_allocate(thread, sizeof(kmp_extra_depinfo_th_t));
+  else
+    bloc = &thread->th.th_edeps[kind];
+
+  bloc->ed_size    = count;
+  bloc->ed_extent  = extent;
+  bloc->ed_deps    = (kmp_intptr_t*)array;
+  bloc->ed_mode    = OMPEXT_MODE_ARRAY|(kmp_uint16)mode;
+  bloc->ed_noalias = kind;
+  bloc->ed_next    = 0;
+  if (thread->th.th_edeps_tail[kind] !=0)
+    thread->th.th_edeps_tail[kind]->ed_next = bloc;
+  thread->th.th_edeps_tail[kind] = bloc;
+  thread->th.th_edps_size[kind] += count;
+  return 0;
+}
+
 
 /* */
 int __kmpc_omp_task_declare_dependencies( ident_t *loc_ref, kmp_int32 gtid,
@@ -975,6 +1000,45 @@ int __kmpc_omp_task_declare_dependencies_noalias( ident_t *loc_ref, kmp_int32 gt
 #endif
   return kmp_add_extradeps(thread, 1 /* no alias */, mode, count, array );
 }
+
+int __kmpc_omp_task_declare_dependencies_array( ident_t *loc_ref, kmp_int32 gtid,
+                                          int mode, int count, int extent, void* array)
+{
+  kmp_info_t *thread = __kmp_threads[ gtid ];
+  if (array==0) return EINVAL;
+  if (count<0) return EINVAL;
+#ifdef KMP_DEBUG
+  KMP_ASSERT( !((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT)) );
+#else
+  if ((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT))
+  {
+    printf("***error invalid access mode: %i\n", mode );
+    return EINVAL;
+  }
+#endif
+  return kmp_add_extradeps_array(thread, 0 /* alias */, mode, count, extent, array );
+}
+
+
+/* */
+int __kmpc_omp_task_declare_dependencies_array_noalias( ident_t *loc_ref, kmp_int32 gtid,
+                                                  int mode, int count, int extent, void* array)
+{
+  kmp_info_t *thread = __kmp_threads[ gtid ];
+  if (array==0) return EINVAL;
+  if (count<0) return EINVAL;
+#ifdef KMP_DEBUG
+  KMP_ASSERT( !((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT)) );
+#else
+  if ((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT))
+  {
+    printf("***error invalid access mode: %i\n", mode );
+    return EINVAL;
+  }
+#endif
+  return kmp_add_extradeps_array(thread, 1 /* no alias */, mode, count, extent, array );
+}
+
 #endif
 
 
@@ -1070,7 +1134,10 @@ kmp_int32 __kmpc_omp_task_with_deps(ident_t *loc_ref, kmp_int32 gtid,
       flags.alias = 0;
       for (i=0; i<bloc->ed_size; ++i, ++deps)
       {
-        deps->base_addr = bloc->ed_deps[i];
+        if (bloc->ed_mode & OMPEXT_MODE_ARRAY)
+          deps->base_addr = (kmp_intptr_t)(bloc->ed_extent*i+(unsigned char*)bloc->ed_deps);
+        else
+          deps->base_addr = bloc->ed_deps[i];
         deps->len       = 1;
         deps->flags     = flags;
       }
@@ -1098,7 +1165,10 @@ kmp_int32 __kmpc_omp_task_with_deps(ident_t *loc_ref, kmp_int32 gtid,
       flags.alias = 0;
       for (i=0; i<bloc->ed_size; ++i, ++deps)
       {
-        deps->base_addr = bloc->ed_deps[i];
+        if (bloc->ed_mode & OMPEXT_MODE_ARRAY)
+          deps->base_addr = (kmp_intptr_t)(bloc->ed_extent*i+(unsigned char*)bloc->ed_deps);
+        else
+          deps->base_addr = bloc->ed_deps[i];
         deps->len       = 1;
         deps->flags     = flags;
       }
-- 
GitLab