diff --git a/runtime/src/dllexports b/runtime/src/dllexports index c99f073f0adfaeca5af9352b834ca913d5e950a1..9631fdcfcc33a6412ee0016eca6bbd2cc891cdfa 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 3cbf6111069008877fdda8fc34031c2c3837abc8..3840fa0fd885e1b813c5af2376af5ab8616497dd 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 b606711eaa94cdcbb5c64f481b8c6421e7268662..789832ca04b49a3ccdb5577898432057e7d678cf 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 b623c7a74af72dcd4cb58643b6671162c3f59eed..69e36c9d9063ad33798e9b347d2d3dd22c20b972 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 9c27f68012fab6ef7a094b3f1c8ca897c220b983..6f97ab27ecbb65895f74198dbf2dbcd2cf8d6df1 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 19720f71cdaf320239d0282b02365528f9f9d1f3..f4d8c6cdb1535513bc92e89f1092ec9ef524bb91 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 ca3aee39261f16a744419e8962e9ad9466a42bcb..95eaf02dc890102fc6a90d9f07dc9fc92484f35d 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 95c0c38c309dd10ccb4766053653ee2d9476fa49..0467c96ddf54f76e2176d3d18aeb66e561f763db 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; }