
This patch supports "lvalue" parsing (or "locator list item type" parsing) for several OpenMP clause types for C++, as required for OpenMP 5.0 and above. This version has been rebased -- some things have changed around template handling recently, e.g. removal of build_non_dependent_expr and tsubst_copy. A new potential corner-case issue has shown up regarding implicit mapping of references to pointer to pointers -- an interaction with the post-review fixes/rework for the patch here: https://gcc.gnu.org/pipermail/gcc-patches/2023-November/638602.html Which fixed the (new) tests baseptrs-[6789].C. I've noted that for now in the patch, and adjusted the baseptrs-[46].C tests slightly to accommodate. 2024-01-08 Julian Brown <julian@codesourcery.com> gcc/c-family/ * c-common.h (c_omp_address_inspector): Remove static from get_origin and maybe_unconvert_ref methods. * c-omp.cc (c_omp_split_clauses): Support OMP_ARRAY_SECTION. (c_omp_address_inspector::map_supported_p): Handle OMP_ARRAY_SECTION. (c_omp_address_inspector::get_origin): Avoid dereferencing possibly NULL type when processing template decls. (c_omp_address_inspector::maybe_unconvert_ref): Likewise. gcc/cp/ * constexpr.cc (potential_consant_expression_1): Handle OMP_ARRAY_SECTION. * cp-tree.h (grok_omp_array_section, build_omp_array_section): Add prototypes. * decl2.cc (grok_omp_array_section): New function. * error.cc (dump_expr): Handle OMP_ARRAY_SECTION. * parser.cc (cp_parser_new): Initialize parser->omp_array_section_p. (cp_parser_statement_expr): Disallow array sections. (cp_parser_postfix_open_square_expression): Support OMP_ARRAY_SECTION parsing. (cp_parser_parenthesized_expression_list, cp_parser_lambda_expression, cp_parser_braced_list): Disallow array sections. (cp_parser_omp_var_list_no_open): Remove ALLOW_DEREF parameter, add MAP_LVALUE in its place. Support generalised lvalue parsing for OpenMP map, to and from clauses. Use OMP_ARRAY_SECTION code instead of TREE_LIST to represent OpenMP array sections. (cp_parser_omp_var_list): Remove ALLOW_DEREF parameter, add MAP_LVALUE. Pass to cp_parser_omp_var_list_no_open. (cp_parser_oacc_data_clause): Update call to cp_parser_omp_var_list. (cp_parser_omp_clause_map): Add sk_omp scope around cp_parser_omp_var_list_no_open call. * parser.h (cp_parser): Add omp_array_section_p field. * pt.cc (tsubst, tsubst_copy, tsubst_omp_clause_decl, tsubst_copy_and_build): Add OMP_ARRAY_SECTION support. * semantics.cc (handle_omp_array_sections_1, handle_omp_array_sections, cp_oacc_check_attachments, finish_omp_clauses): Use OMP_ARRAY_SECTION instead of TREE_LIST where appropriate. Handle more types of map expression. * typeck.cc (build_omp_array_section): New function. gcc/ * gimplify.cc (gimplify_expr): Ensure OMP_ARRAY_SECTION has been processed out before gimplification. * tree-pretty-print.cc (dump_generic_node): Support OMP_ARRAY_SECTION. * tree.def (OMP_ARRAY_SECTION): New tree code. gcc/testsuite/ * c-c++-common/gomp/map-6.c: Update expected output. * c-c++-common/gomp/target-enter-data-1.c: Update scan test. * g++.dg/gomp/array-section-1.C: New test. * g++.dg/gomp/array-section-2.C: New test. * g++.dg/gomp/bad-array-section-1.C: New test. * g++.dg/gomp/bad-array-section-2.C: New test. * g++.dg/gomp/bad-array-section-3.C: New test. * g++.dg/gomp/bad-array-section-4.C: New test. * g++.dg/gomp/bad-array-section-5.C: New test. * g++.dg/gomp/bad-array-section-6.C: New test. * g++.dg/gomp/bad-array-section-7.C: New test. * g++.dg/gomp/bad-array-section-8.C: New test. * g++.dg/gomp/bad-array-section-9.C: New test. * g++.dg/gomp/bad-array-section-10.C: New test. * g++.dg/gomp/bad-array-section-11.C: New test. * g++.dg/gomp/has_device_addr-non-lvalue-1.C: New test. * g++.dg/gomp/pr67522.C: Update expected output. * g++.dg/gomp/ind-base-3.C: New test. * g++.dg/gomp/map-assignment-1.C: New test. * g++.dg/gomp/map-inc-1.C: New test. * g++.dg/gomp/map-lvalue-ref-1.C: New test. * g++.dg/gomp/map-ptrmem-1.C: New test. * g++.dg/gomp/map-ptrmem-2.C: New test. * g++.dg/gomp/map-static-cast-lvalue-1.C: New test. * g++.dg/gomp/map-ternary-1.C: New test. * g++.dg/gomp/member-array-2.C: New test. libgomp/ * testsuite/libgomp.c++/baseptrs-4.C: Remove commented-out cases that now work. * testsuite/libgomp.c++/baseptrs-6.C: New test. * testsuite/libgomp.c++/ind-base-1.C: New test. * testsuite/libgomp.c++/ind-base-2.C: New test. * testsuite/libgomp.c++/lvalue-tofrom-1.C: New test. * testsuite/libgomp.c++/lvalue-tofrom-2.C: New test. * testsuite/libgomp.c++/map-comma-1.C: New test. * testsuite/libgomp.c++/map-rvalue-ref-1.C: New test. * testsuite/libgomp.c++/struct-ref-1.C: New test. * testsuite/libgomp.c-c++-common/array-field-1.c: New test. * testsuite/libgomp.c-c++-common/array-of-struct-1.c: New test. * testsuite/libgomp.c-c++-common/array-of-struct-2.c: New test.
3200 lines
58 KiB
C
3200 lines
58 KiB
C
// { dg-do run }
|
|
|
|
// This is essentially baseptrs-4.C with templates.
|
|
|
|
#include <cstring>
|
|
#include <cassert>
|
|
|
|
#define MAP_DECLS
|
|
|
|
#define NONREF_DECL_BASE
|
|
#define REF_DECL_BASE
|
|
#define PTR_DECL_BASE
|
|
#define REF2PTR_DECL_BASE
|
|
|
|
#define ARRAY_DECL_BASE
|
|
#define REF2ARRAY_DECL_BASE
|
|
#define PTR_OFFSET_DECL_BASE
|
|
#define REF2PTR_OFFSET_DECL_BASE
|
|
|
|
#define MAP_SECTIONS
|
|
|
|
#define NONREF_DECL_MEMBER_SLICE
|
|
#define NONREF_DECL_MEMBER_SLICE_BASEPTR
|
|
#define REF_DECL_MEMBER_SLICE
|
|
#define REF_DECL_MEMBER_SLICE_BASEPTR
|
|
#define PTR_DECL_MEMBER_SLICE
|
|
#define PTR_DECL_MEMBER_SLICE_BASEPTR
|
|
#define REF2PTR_DECL_MEMBER_SLICE
|
|
#define REF2PTR_DECL_MEMBER_SLICE_BASEPTR
|
|
|
|
#define ARRAY_DECL_MEMBER_SLICE
|
|
#define ARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
#define REF2ARRAY_DECL_MEMBER_SLICE
|
|
#define REF2ARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
#define PTR_OFFSET_DECL_MEMBER_SLICE
|
|
#define PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
#define REF2PTR_OFFSET_DECL_MEMBER_SLICE
|
|
#define REF2PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
|
|
#define PTRARRAY_DECL_MEMBER_SLICE
|
|
#define PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
#define REF2PTRARRAY_DECL_MEMBER_SLICE
|
|
#define REF2PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
#define PTRPTR_OFFSET_DECL_MEMBER_SLICE
|
|
#define PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
#define REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE
|
|
#define REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
|
|
#define NONREF_COMPONENT_BASE
|
|
#define NONREF_COMPONENT_MEMBER_SLICE
|
|
#define NONREF_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
|
|
#define REF_COMPONENT_BASE
|
|
#define REF_COMPONENT_MEMBER_SLICE
|
|
#define REF_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
|
|
#define PTR_COMPONENT_BASE
|
|
#define PTR_COMPONENT_MEMBER_SLICE
|
|
#define PTR_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
|
|
#define REF2PTR_COMPONENT_BASE
|
|
#define REF2PTR_COMPONENT_MEMBER_SLICE
|
|
#define REF2PTR_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
|
|
#ifdef MAP_DECLS
|
|
template<int N>
|
|
void
|
|
map_decls (void)
|
|
{
|
|
int x = 0;
|
|
int &y = x;
|
|
int arr[4];
|
|
int (&arrref)[N] = arr;
|
|
int *z = &arr[0];
|
|
int *&t = z;
|
|
|
|
memset (arr, 0, sizeof arr);
|
|
|
|
#pragma omp target map(x)
|
|
{
|
|
x++;
|
|
}
|
|
|
|
#pragma omp target map(y)
|
|
{
|
|
y++;
|
|
}
|
|
|
|
assert (x == 2);
|
|
assert (y == 2);
|
|
|
|
/* "A variable that is of type pointer is treated as if it is the base
|
|
pointer of a zero-length array section that appeared as a list item in a
|
|
map clause." */
|
|
#pragma omp target map(z)
|
|
{
|
|
z++;
|
|
}
|
|
|
|
/* "A variable that is of type reference to pointer is treated as if it had
|
|
appeared in a map clause as a zero-length array section."
|
|
|
|
The pointer here is *not* associated with a target address, so we're not
|
|
disallowed from modifying it. */
|
|
#pragma omp target map(t)
|
|
{
|
|
t++;
|
|
}
|
|
|
|
assert (z == &arr[2]);
|
|
assert (t == &arr[2]);
|
|
|
|
#pragma omp target map(arr)
|
|
{
|
|
arr[2]++;
|
|
}
|
|
|
|
#pragma omp target map(arrref)
|
|
{
|
|
arrref[2]++;
|
|
}
|
|
|
|
assert (arr[2] == 2);
|
|
assert (arrref[2] == 2);
|
|
}
|
|
#endif
|
|
|
|
template<typename T>
|
|
struct S {
|
|
T a;
|
|
T &b;
|
|
T *c;
|
|
T *&d;
|
|
T e[4];
|
|
T (&f)[4];
|
|
|
|
S(T a1, T &b1, T *c1, T *&d1) :
|
|
a(a1), b(b1), c(c1), d(d1), f(e)
|
|
{
|
|
memset (e, 0, sizeof e);
|
|
}
|
|
};
|
|
|
|
#ifdef NONREF_DECL_BASE
|
|
template<typename T>
|
|
void
|
|
nonref_decl_base (void)
|
|
{
|
|
T a = 0, b = 0, c, *d = &c;
|
|
S<T> mys(a, b, &c, d);
|
|
|
|
#pragma omp target map(mys.a)
|
|
{
|
|
mys.a++;
|
|
}
|
|
|
|
#pragma omp target map(mys.b)
|
|
{
|
|
mys.b++;
|
|
}
|
|
|
|
assert (mys.a == 1);
|
|
assert (mys.b == 1);
|
|
|
|
#pragma omp target map(mys.c)
|
|
{
|
|
mys.c++;
|
|
}
|
|
|
|
#pragma omp target map(mys.d)
|
|
{
|
|
mys.d++;
|
|
}
|
|
|
|
assert (mys.c == &c + 1);
|
|
assert (mys.d == &c + 1);
|
|
|
|
#pragma omp target map(mys.e)
|
|
{
|
|
mys.e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys.f)
|
|
{
|
|
mys.f[0]++;
|
|
}
|
|
|
|
assert (mys.e[0] == 2);
|
|
assert (mys.f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF_DECL_BASE
|
|
template<typename T>
|
|
void
|
|
ref_decl_base (void)
|
|
{
|
|
T a = 0, b = 0, c, *d = &c;
|
|
S<T> mys_orig(a, b, &c, d);
|
|
S<T> &mys = mys_orig;
|
|
|
|
#pragma omp target map(mys.a)
|
|
{
|
|
mys.a++;
|
|
}
|
|
|
|
#pragma omp target map(mys.b)
|
|
{
|
|
mys.b++;
|
|
}
|
|
|
|
assert (mys.a == 1);
|
|
assert (mys.b == 1);
|
|
|
|
#pragma omp target map(mys.c)
|
|
{
|
|
mys.c++;
|
|
}
|
|
|
|
#pragma omp target map(mys.d)
|
|
{
|
|
mys.d++;
|
|
}
|
|
|
|
assert (mys.c == &c + 1);
|
|
assert (mys.d == &c + 1);
|
|
|
|
#pragma omp target map(mys.e)
|
|
{
|
|
mys.e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys.f)
|
|
{
|
|
mys.f[0]++;
|
|
}
|
|
|
|
assert (mys.e[0] == 2);
|
|
assert (mys.f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_DECL_BASE
|
|
template<typename A>
|
|
void
|
|
ptr_decl_base (void)
|
|
{
|
|
A a = 0, b = 0, c, *d = &c;
|
|
S<A> mys_orig(a, b, &c, d);
|
|
S<A> *mys = &mys_orig;
|
|
|
|
#pragma omp target map(mys->a)
|
|
{
|
|
mys->a++;
|
|
}
|
|
|
|
#pragma omp target map(mys->b)
|
|
{
|
|
mys->b++;
|
|
}
|
|
|
|
assert (mys->a == 1);
|
|
assert (mys->b == 1);
|
|
|
|
#pragma omp target map(mys->c)
|
|
{
|
|
mys->c++;
|
|
}
|
|
|
|
#pragma omp target map(mys->d)
|
|
{
|
|
mys->d++;
|
|
}
|
|
|
|
assert (mys->c == &c + 1);
|
|
assert (mys->d == &c + 1);
|
|
|
|
#pragma omp target map(mys->e)
|
|
{
|
|
mys->e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys->f)
|
|
{
|
|
mys->f[0]++;
|
|
}
|
|
|
|
assert (mys->e[0] == 2);
|
|
assert (mys->f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_DECL_BASE
|
|
template<typename A>
|
|
void
|
|
ref2ptr_decl_base (void)
|
|
{
|
|
A a = 0, b = 0, c, *d = &c;
|
|
S<A> mys_orig(a, b, &c, d);
|
|
S<A> *mysp = &mys_orig;
|
|
S<A> *&mys = mysp;
|
|
|
|
#pragma omp target map(mys->a)
|
|
{
|
|
mys->a++;
|
|
}
|
|
|
|
#pragma omp target map(mys->b)
|
|
{
|
|
mys->b++;
|
|
}
|
|
|
|
assert (mys->a == 1);
|
|
assert (mys->b == 1);
|
|
|
|
#pragma omp target map(mys->c)
|
|
{
|
|
mys->c++;
|
|
}
|
|
|
|
#pragma omp target map(mys->d)
|
|
{
|
|
mys->d++;
|
|
}
|
|
|
|
assert (mys->c == &c + 1);
|
|
assert (mys->d == &c + 1);
|
|
|
|
#pragma omp target map(mys->e)
|
|
{
|
|
mys->e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys->f)
|
|
{
|
|
mys->f[0]++;
|
|
}
|
|
|
|
assert (mys->e[0] == 2);
|
|
assert (mys->f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef ARRAY_DECL_BASE
|
|
template<typename A>
|
|
void
|
|
array_decl_base (void)
|
|
{
|
|
A a = 0, b = 0, c, *d = &c;
|
|
S<A> mys[4] =
|
|
{
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d)
|
|
};
|
|
|
|
#pragma omp target map(mys[2].a)
|
|
{
|
|
mys[2].a++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].b)
|
|
{
|
|
mys[2].b++;
|
|
}
|
|
|
|
assert (mys[2].a == 1);
|
|
assert (mys[2].b == 1);
|
|
|
|
#pragma omp target map(mys[2].c)
|
|
{
|
|
mys[2].c++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].d)
|
|
{
|
|
mys[2].d++;
|
|
}
|
|
|
|
assert (mys[2].c == &c + 1);
|
|
assert (mys[2].d == &c + 1);
|
|
|
|
#pragma omp target map(mys[2].e)
|
|
{
|
|
mys[2].e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].f)
|
|
{
|
|
mys[2].f[0]++;
|
|
}
|
|
|
|
assert (mys[2].e[0] == 2);
|
|
assert (mys[2].f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2ARRAY_DECL_BASE
|
|
template<typename A>
|
|
void
|
|
ref2array_decl_base (void)
|
|
{
|
|
A a = 0, b = 0, c, *d = &c;
|
|
S<A> mys_orig[4] =
|
|
{
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d)
|
|
};
|
|
S<A> (&mys)[4] = mys_orig;
|
|
|
|
#pragma omp target map(mys[2].a)
|
|
{
|
|
mys[2].a++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].b)
|
|
{
|
|
mys[2].b++;
|
|
}
|
|
|
|
assert (mys[2].a == 1);
|
|
assert (mys[2].b == 1);
|
|
|
|
#pragma omp target map(mys[2].c)
|
|
{
|
|
mys[2].c++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].d)
|
|
{
|
|
mys[2].d++;
|
|
}
|
|
|
|
assert (mys[2].c == &c + 1);
|
|
assert (mys[2].d == &c + 1);
|
|
|
|
#pragma omp target map(mys[2].e)
|
|
{
|
|
mys[2].e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].f)
|
|
{
|
|
mys[2].f[0]++;
|
|
}
|
|
|
|
assert (mys[2].e[0] == 2);
|
|
assert (mys[2].f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_OFFSET_DECL_BASE
|
|
template<typename A>
|
|
void
|
|
ptr_offset_decl_base (void)
|
|
{
|
|
A a = 0, b = 0, c, *d = &c;
|
|
S<A> mys_orig[4] =
|
|
{
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d)
|
|
};
|
|
S<A> *mys = &mys_orig[0];
|
|
|
|
#pragma omp target map(mys[2].a)
|
|
{
|
|
mys[2].a++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].b)
|
|
{
|
|
mys[2].b++;
|
|
}
|
|
|
|
assert (mys[2].a == 1);
|
|
assert (mys[2].b == 1);
|
|
|
|
#pragma omp target map(mys[2].c)
|
|
{
|
|
mys[2].c++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].d)
|
|
{
|
|
mys[2].d++;
|
|
}
|
|
|
|
assert (mys[2].c == &c + 1);
|
|
assert (mys[2].d == &c + 1);
|
|
|
|
#pragma omp target map(mys[2].e)
|
|
{
|
|
mys[2].e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].f)
|
|
{
|
|
mys[2].f[0]++;
|
|
}
|
|
|
|
assert (mys[2].e[0] == 2);
|
|
assert (mys[2].f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_OFFSET_DECL_BASE
|
|
template<typename A>
|
|
void
|
|
ref2ptr_offset_decl_base (void)
|
|
{
|
|
A a = 0, b = 0, c, *d = &c;
|
|
S<A> mys_orig[4] =
|
|
{
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d),
|
|
S<A>(a, b, &c, d)
|
|
};
|
|
S<A> *mys_ptr = &mys_orig[0];
|
|
S<A> *&mys = mys_ptr;
|
|
|
|
#pragma omp target map(mys[2].a)
|
|
{
|
|
mys[2].a++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].b)
|
|
{
|
|
mys[2].b++;
|
|
}
|
|
|
|
assert (mys[2].a == 1);
|
|
assert (mys[2].b == 1);
|
|
|
|
#pragma omp target map(mys[2].c)
|
|
{
|
|
mys[2].c++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].d)
|
|
{
|
|
mys[2].d++;
|
|
}
|
|
|
|
assert (mys[2].c == &c + 1);
|
|
assert (mys[2].d == &c + 1);
|
|
|
|
#pragma omp target map(mys[2].e)
|
|
{
|
|
mys[2].e[0]++;
|
|
}
|
|
|
|
#pragma omp target map(mys[2].f)
|
|
{
|
|
mys[2].f[0]++;
|
|
}
|
|
|
|
assert (mys[2].e[0] == 2);
|
|
assert (mys[2].f[0] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef MAP_SECTIONS
|
|
template<typename A, int B>
|
|
void
|
|
map_sections (void)
|
|
{
|
|
A arr[B];
|
|
A *ptr;
|
|
A (&arrref)[B] = arr;
|
|
A *&ptrref = ptr;
|
|
|
|
ptr = new int[B];
|
|
memset (ptr, 0, sizeof (int) * B);
|
|
memset (arr, 0, sizeof (int) * B);
|
|
|
|
#pragma omp target map(arr[0:B])
|
|
{
|
|
arr[2]++;
|
|
}
|
|
|
|
#pragma omp target map(ptr[0:B])
|
|
{
|
|
ptr[2]++;
|
|
}
|
|
|
|
#pragma omp target map(arrref[0:B])
|
|
{
|
|
arrref[2]++;
|
|
}
|
|
|
|
#pragma omp target map(ptrref[0:B])
|
|
{
|
|
ptrref[2]++;
|
|
}
|
|
|
|
assert (arr[2] == 2);
|
|
assert (ptr[2] == 2);
|
|
|
|
delete ptr;
|
|
}
|
|
#endif
|
|
|
|
template<typename A>
|
|
struct T {
|
|
A a[10];
|
|
A (&b)[10];
|
|
A *c;
|
|
A *&d;
|
|
|
|
T(A (&b1)[10], A *c1, A *&d1) : b(b1), c(c1), d(d1)
|
|
{
|
|
memset (a, 0, sizeof a);
|
|
}
|
|
};
|
|
|
|
#ifdef NONREF_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
nonref_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt(c, &c[0], d);
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(myt.a[0:B])
|
|
{
|
|
myt.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt.b[0:B])
|
|
{
|
|
myt.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt.c)
|
|
|
|
#pragma omp target map(myt.c[0:B])
|
|
{
|
|
myt.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt.c)
|
|
|
|
#pragma omp target enter data map(to: myt.d)
|
|
|
|
#pragma omp target map(myt.d[0:B])
|
|
{
|
|
myt.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(from: myt.d)
|
|
|
|
assert (myt.a[2] == 1);
|
|
assert (myt.b[2] == 3);
|
|
assert (myt.c[2] == 3);
|
|
assert (myt.d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef NONREF_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
nonref_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt(c, &c[0], d);
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(to:myt.c) map(myt.c[0:B])
|
|
{
|
|
myt.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt.d) map(myt.d[0:B])
|
|
{
|
|
myt.d[2]++;
|
|
}
|
|
|
|
assert (myt.c[2] == 2);
|
|
assert (myt.d[2] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ref_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> &myt = myt_real;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(myt.a[0:B])
|
|
{
|
|
myt.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt.b[0:B])
|
|
{
|
|
myt.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt.c)
|
|
|
|
#pragma omp target map(myt.c[0:B])
|
|
{
|
|
myt.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt.c)
|
|
|
|
#pragma omp target enter data map(to: myt.d)
|
|
|
|
#pragma omp target map(myt.d[0:B])
|
|
{
|
|
myt.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt.d)
|
|
|
|
assert (myt.a[2] == 1);
|
|
assert (myt.b[2] == 3);
|
|
assert (myt.c[2] == 3);
|
|
assert (myt.d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ref_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> &myt = myt_real;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(to:myt.c) map(myt.c[0:B])
|
|
{
|
|
myt.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt.d) map(myt.d[0:B])
|
|
{
|
|
myt.d[2]++;
|
|
}
|
|
|
|
assert (myt.c[2] == 2);
|
|
assert (myt.d[2] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ptr_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt = &myt_real;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target enter data map(to: myt)
|
|
|
|
#pragma omp target map(myt->a[0:B])
|
|
{
|
|
myt->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt->b[0:B])
|
|
{
|
|
myt->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt->c)
|
|
|
|
#pragma omp target map(myt->c[0:B])
|
|
{
|
|
myt->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt->c)
|
|
|
|
#pragma omp target enter data map(to: myt->d)
|
|
|
|
#pragma omp target map(myt->d[0:B])
|
|
{
|
|
myt->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt, myt->d)
|
|
|
|
assert (myt->a[2] == 1);
|
|
assert (myt->b[2] == 3);
|
|
assert (myt->c[2] == 3);
|
|
assert (myt->d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ptr_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt = &myt_real;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
// These ones have an implicit firstprivate for 'myt'.
|
|
#pragma omp target map(to:myt->c) map(myt->c[0:B])
|
|
{
|
|
myt->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt->d) map(myt->d[0:B])
|
|
{
|
|
myt->d[2]++;
|
|
}
|
|
|
|
// These ones have an explicit "TO" mapping for 'myt'.
|
|
#pragma omp target map(to:myt) map(to:myt->c) map(myt->c[0:B])
|
|
{
|
|
myt->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt) map(to:myt->d) map(myt->d[0:B])
|
|
{
|
|
myt->d[2]++;
|
|
}
|
|
|
|
assert (myt->c[2] == 4);
|
|
assert (myt->d[2] == 4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptr_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptr = &myt_real;
|
|
T<A> *&myt = myt_ptr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target enter data map(to: myt)
|
|
|
|
#pragma omp target map(myt->a[0:B])
|
|
{
|
|
myt->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt->b[0:B])
|
|
{
|
|
myt->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt->c)
|
|
|
|
#pragma omp target map(myt->c[0:B])
|
|
{
|
|
myt->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt->c)
|
|
|
|
#pragma omp target enter data map(to: myt->d)
|
|
|
|
#pragma omp target map(myt->d[0:B])
|
|
{
|
|
myt->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(from: myt, myt->d)
|
|
|
|
assert (myt->a[2] == 1);
|
|
assert (myt->b[2] == 3);
|
|
assert (myt->c[2] == 3);
|
|
assert (myt->d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptr_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptr = &myt_real;
|
|
T<A> *&myt = myt_ptr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
// These ones have an implicit firstprivate for 'myt'.
|
|
#pragma omp target map(to:myt->c) map(myt->c[0:B])
|
|
{
|
|
myt->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt->d) map(myt->d[0:B])
|
|
{
|
|
myt->d[2]++;
|
|
}
|
|
|
|
// These ones have an explicit "TO" mapping for 'myt'.
|
|
#pragma omp target map(to:myt) map(to:myt->c) map(myt->c[0:B])
|
|
{
|
|
myt->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt) map(to:myt->d) map(myt->d[0:B])
|
|
{
|
|
myt->d[2]++;
|
|
}
|
|
|
|
assert (myt->c[2] == 4);
|
|
assert (myt->d[2] == 4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef ARRAY_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
array_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt[4] =
|
|
{
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d)
|
|
};
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(myt[2].a[0:B])
|
|
{
|
|
myt[2].a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2].b[0:B])
|
|
{
|
|
myt[2].b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt[2].c)
|
|
|
|
#pragma omp target map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].c)
|
|
|
|
#pragma omp target enter data map(to: myt[2].d)
|
|
|
|
#pragma omp target map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].d)
|
|
|
|
assert (myt[2].a[2] == 1);
|
|
assert (myt[2].b[2] == 3);
|
|
assert (myt[2].c[2] == 3);
|
|
assert (myt[2].d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef ARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
array_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[10];
|
|
A *d = &c[0];
|
|
T<A> myt[4] =
|
|
{
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d)
|
|
};
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(to:myt[2].c) map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
assert (myt[2].c[2] == 2);
|
|
assert (myt[2].d[2] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2ARRAY_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ref2array_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real[4] =
|
|
{
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d)
|
|
};
|
|
T<A> (&myt)[4] = myt_real;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(myt[2].a[0:B])
|
|
{
|
|
myt[2].a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2].b[0:B])
|
|
{
|
|
myt[2].b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt[2].c)
|
|
|
|
#pragma omp target map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].c)
|
|
|
|
#pragma omp target enter data map(to: myt[2].d)
|
|
|
|
#pragma omp target map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].d)
|
|
|
|
assert (myt[2].a[2] == 1);
|
|
assert (myt[2].b[2] == 3);
|
|
assert (myt[2].c[2] == 3);
|
|
assert (myt[2].d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2ARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ref2array_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real[4] =
|
|
{
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d)
|
|
};
|
|
T<A> (&myt)[4] = myt_real;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(to:myt[2].c) map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
assert (myt[2].c[2] == 2);
|
|
assert (myt[2].d[2] == 2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_OFFSET_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ptr_offset_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real[4] =
|
|
{
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d)
|
|
};
|
|
T<A> *myt = &myt_real[0];
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(myt[2].a[0:B])
|
|
{
|
|
myt[2].a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2].b[0:B])
|
|
{
|
|
myt[2].b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt[2].c)
|
|
|
|
#pragma omp target map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].c)
|
|
|
|
#pragma omp target enter data map(to: myt[2].d)
|
|
|
|
#pragma omp target map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].d)
|
|
|
|
assert (myt[2].a[2] == 1);
|
|
assert (myt[2].b[2] == 3);
|
|
assert (myt[2].c[2] == 3);
|
|
assert (myt[2].d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ptr_offset_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real[4] =
|
|
{
|
|
T (c, &c[0], d),
|
|
T (c, &c[0], d),
|
|
T (c, &c[0], d),
|
|
T (c, &c[0], d)
|
|
};
|
|
T<A> *myt = &myt_real[0];
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
/* Implicit 'myt'. */
|
|
#pragma omp target map(to:myt[2].c) map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
/* Explicit 'to'-mapped 'myt'. */
|
|
#pragma omp target map(to:myt) map(to:myt[2].c) map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt) map(to:myt[2].d) map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
assert (myt[2].c[2] == 4);
|
|
assert (myt[2].d[2] == 4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptr_offset_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real[4] =
|
|
{
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d)
|
|
};
|
|
T<A> *myt_ptr = &myt_real[0];
|
|
T<A> *&myt = myt_ptr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(myt[2].a[0:B])
|
|
{
|
|
myt[2].a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2].b[0:B])
|
|
{
|
|
myt[2].b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt[2].c)
|
|
|
|
#pragma omp target map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].c)
|
|
|
|
#pragma omp target enter data map(to: myt[2].d)
|
|
|
|
#pragma omp target map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2].d)
|
|
|
|
assert (myt[2].a[2] == 1);
|
|
assert (myt[2].b[2] == 3);
|
|
assert (myt[2].c[2] == 3);
|
|
assert (myt[2].d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptr_offset_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real[4] =
|
|
{
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d),
|
|
T<A> (c, &c[0], d)
|
|
};
|
|
T<A> *myt_ptr = &myt_real[0];
|
|
T<A> *&myt = myt_ptr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
/* Implicit 'myt'. */
|
|
#pragma omp target map(to:myt[2].c) map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
/* Explicit 'to'-mapped 'myt'. */
|
|
#pragma omp target map(to:myt) map(to:myt[2].c) map(myt[2].c[0:B])
|
|
{
|
|
myt[2].c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt) map(to:myt[2].d) map(myt[2].d[0:B])
|
|
{
|
|
myt[2].d[2]++;
|
|
}
|
|
|
|
assert (myt[2].c[2] == 4);
|
|
assert (myt[2].d[2] == 4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTRARRAY_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ptrarray_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt[4] =
|
|
{
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real
|
|
};
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target enter data map(to: myt[2])
|
|
|
|
#pragma omp target map(myt[2]->a[0:B])
|
|
{
|
|
myt[2]->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2]->b[0:B])
|
|
{
|
|
myt[2]->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt[2]->c)
|
|
|
|
#pragma omp target map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(from: myt[2]->c)
|
|
|
|
#pragma omp target enter data map(to: myt[2]->d)
|
|
|
|
#pragma omp target map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(from: myt[2]->d)
|
|
|
|
#pragma omp target exit data map(release: myt[2])
|
|
|
|
assert (myt[2]->a[2] == 1);
|
|
assert (myt[2]->b[2] == 3);
|
|
assert (myt[2]->c[2] == 3);
|
|
assert (myt[2]->d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ptrarray_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt[4] =
|
|
{
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real
|
|
};
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
// Implicit 'myt'
|
|
#pragma omp target map(to: myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
// One element of 'myt'
|
|
#pragma omp target map(to:myt[2], myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
// Explicit map of all of 'myt'
|
|
#pragma omp target map(to:myt, myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt, myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
// Explicit map slice of 'myt'
|
|
#pragma omp target map(to:myt[1:3], myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[1:3], myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
assert (myt[2]->c[2] == 8);
|
|
assert (myt[2]->d[2] == 8);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTRARRAY_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptrarray_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptrarr[4] =
|
|
{
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real
|
|
};
|
|
T<A> *(&myt)[4] = myt_ptrarr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target enter data map(to: myt[2])
|
|
|
|
#pragma omp target map(myt[2]->a[0:B])
|
|
{
|
|
myt[2]->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2]->b[0:B])
|
|
{
|
|
myt[2]->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt[2]->c)
|
|
|
|
#pragma omp target map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2]->c)
|
|
|
|
#pragma omp target enter data map(to: myt[2]->d)
|
|
|
|
#pragma omp target map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt[2]->d)
|
|
|
|
#pragma omp target exit data map(release: myt[2])
|
|
|
|
assert (myt[2]->a[2] == 1);
|
|
assert (myt[2]->b[2] == 3);
|
|
assert (myt[2]->c[2] == 3);
|
|
assert (myt[2]->d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptrarray_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptrarr[4] =
|
|
{
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real
|
|
};
|
|
T<A> *(&myt)[4] = myt_ptrarr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(to:myt[2], myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt, myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt, myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
assert (myt[2]->c[2] == 4);
|
|
assert (myt[2]->d[2] == 4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ptrptr_offset_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptrarr[4] =
|
|
{
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real,
|
|
&myt_real
|
|
};
|
|
T<A> **myt = &myt_ptrarr[0];
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target enter data map(to: myt[0:3])
|
|
|
|
/* NOTE: For the implicit firstprivate 'myt' to work, the zeroth element of
|
|
myt[] must be mapped above -- otherwise the zero-length array section
|
|
lookup fails. */
|
|
#pragma omp target map(myt[2]->a[0:B])
|
|
{
|
|
myt[2]->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2]->b[0:B])
|
|
{
|
|
myt[2]->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myt[2]->c)
|
|
|
|
#pragma omp target map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(from: myt[2]->c)
|
|
|
|
#pragma omp target enter data map(to: myt[2]->d)
|
|
|
|
#pragma omp target map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(from: myt[0:3], myt[2]->d)
|
|
|
|
assert (myt[2]->a[2] == 1);
|
|
assert (myt[2]->b[2] == 3);
|
|
assert (myt[2]->c[2] == 3);
|
|
assert (myt[2]->d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ptrptr_offset_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptrarr[4] =
|
|
{
|
|
0,
|
|
0,
|
|
0,
|
|
&myt_real
|
|
};
|
|
T<A> **myt = &myt_ptrarr[0];
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(to:myt[3], myt[3]->c) map(myt[3]->c[0:B])
|
|
{
|
|
myt[3]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[3], myt[3]->d) map(myt[3]->d[0:B])
|
|
{
|
|
myt[3]->d[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt, myt[3], myt[3]->c) map(myt[3]->c[0:B])
|
|
{
|
|
myt[3]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt, myt[3], myt[3]->d) map(myt[3]->d[0:B])
|
|
{
|
|
myt[3]->d[2]++;
|
|
}
|
|
|
|
assert (myt[3]->c[2] == 4);
|
|
assert (myt[3]->d[2] == 4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptrptr_offset_decl_member_slice (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptrarr[4] =
|
|
{
|
|
0,
|
|
0,
|
|
&myt_real,
|
|
0
|
|
};
|
|
T<A> **myt_ptrptr = &myt_ptrarr[0];
|
|
T<A> **&myt = myt_ptrptr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
/* See comment in baseptrs-4.C:ref2ptrptr_offset_decl_member_slice. */
|
|
#pragma omp target enter data map(to: myt, myt[0:3])
|
|
|
|
#pragma omp target map(myt[2]->a[0:B])
|
|
{
|
|
myt[2]->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myt[2]->b[0:B])
|
|
{
|
|
myt[2]->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to:myt[2]->c)
|
|
|
|
#pragma omp target map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release:myt[2]->c)
|
|
|
|
#pragma omp target enter data map(to:myt[2]->d)
|
|
|
|
#pragma omp target map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myt, myt[0:3], myt[2]->d)
|
|
|
|
assert (myt[2]->a[2] == 1);
|
|
assert (myt[2]->b[2] == 3);
|
|
assert (myt[2]->c[2] == 3);
|
|
assert (myt[2]->d[2] == 3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
template<typename A, int B>
|
|
void
|
|
ref2ptrptr_offset_decl_member_slice_baseptr (void)
|
|
{
|
|
A c[B];
|
|
A *d = &c[0];
|
|
T<A> myt_real(c, &c[0], d);
|
|
T<A> *myt_ptrarr[4] =
|
|
{
|
|
0,
|
|
0,
|
|
&myt_real,
|
|
0
|
|
};
|
|
T<A> **myt_ptrptr = &myt_ptrarr[0];
|
|
T<A> **&myt = myt_ptrptr;
|
|
|
|
memset (c, 0, sizeof c);
|
|
|
|
#pragma omp target map(to:myt[2], myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt, myt[2], myt[2]->c) map(myt[2]->c[0:B])
|
|
{
|
|
myt[2]->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to:myt, myt[2], myt[2]->d) map(myt[2]->d[0:B])
|
|
{
|
|
myt[2]->d[2]++;
|
|
}
|
|
|
|
assert (myt[2]->c[2] == 4);
|
|
assert (myt[2]->d[2] == 4);
|
|
}
|
|
#endif
|
|
|
|
template<typename A>
|
|
struct U
|
|
{
|
|
S<A> s1;
|
|
T<A> t1;
|
|
S<A> &s2;
|
|
T<A> &t2;
|
|
S<A> *s3;
|
|
T<A> *t3;
|
|
S<A> *&s4;
|
|
T<A> *&t4;
|
|
|
|
U(S<A> &sptr1, T<A> &tptr1, S<A> &sptr2, T<A> &tptr2,
|
|
S<A> *sptr3, T<A> *tptr3, S<A> *&sptr4, T<A> *&tptr4)
|
|
: s1(sptr1), t1(tptr1), s2(sptr2), t2(tptr2), s3(sptr3), t3(tptr3),
|
|
s4(sptr4), t4(tptr4)
|
|
{
|
|
}
|
|
};
|
|
|
|
#define INIT_S(N) \
|
|
A a##N = 0, b##N = 0, c##N = 0, d##N = 0; \
|
|
A *d##N##ptr = &d##N; \
|
|
S<A> s##N(a##N, b##N, &c##N, d##N##ptr)
|
|
|
|
#define INIT_T(N) \
|
|
A arr##N[10]; \
|
|
A *ptr##N = &arr##N[0]; \
|
|
T<A> t##N(arr##N, &arr##N[0], ptr##N); \
|
|
memset (arr##N, 0, sizeof arr##N)
|
|
|
|
#define INIT_ST \
|
|
INIT_S(1); \
|
|
INIT_T(1); \
|
|
INIT_S(2); \
|
|
INIT_T(2); \
|
|
INIT_S(3); \
|
|
INIT_T(3); \
|
|
A a4 = 0, b4 = 0, c4 = 0, d4 = 0; \
|
|
A *d4ptr = &d4; \
|
|
S<A> *s4 = new S<A>(a4, b4, &c4, d4ptr); \
|
|
A arr4[10]; \
|
|
A *ptr4 = &arr4[0]; \
|
|
T<A> *t4 = new T<A>(arr4, &arr4[0], ptr4); \
|
|
memset (arr4, 0, sizeof arr4)
|
|
|
|
#ifdef NONREF_COMPONENT_BASE
|
|
template<typename A>
|
|
void
|
|
nonref_component_base (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> myu(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
|
|
#pragma omp target map(myu.s1.a, myu.s1.b, myu.s1.c, myu.s1.d)
|
|
{
|
|
myu.s1.a++;
|
|
myu.s1.b++;
|
|
myu.s1.c++;
|
|
myu.s1.d++;
|
|
}
|
|
|
|
assert (myu.s1.a == 1);
|
|
assert (myu.s1.b == 1);
|
|
assert (myu.s1.c == &c1 + 1);
|
|
assert (myu.s1.d == &d1 + 1);
|
|
|
|
#pragma omp target map(myu.s2.a, myu.s2.b, myu.s2.c, myu.s2.d)
|
|
{
|
|
myu.s2.a++;
|
|
myu.s2.b++;
|
|
myu.s2.c++;
|
|
myu.s2.d++;
|
|
}
|
|
|
|
assert (myu.s2.a == 1);
|
|
assert (myu.s2.b == 1);
|
|
assert (myu.s2.c == &c2 + 1);
|
|
assert (myu.s2.d == &d2 + 1);
|
|
|
|
#pragma omp target map(to:myu.s3) \
|
|
map(myu.s3->a, myu.s3->b, myu.s3->c, myu.s3->d)
|
|
{
|
|
myu.s3->a++;
|
|
myu.s3->b++;
|
|
myu.s3->c++;
|
|
myu.s3->d++;
|
|
}
|
|
|
|
assert (myu.s3->a == 1);
|
|
assert (myu.s3->b == 1);
|
|
assert (myu.s3->c == &c3 + 1);
|
|
assert (myu.s3->d == &d3 + 1);
|
|
|
|
#pragma omp target map(to:myu.s4) \
|
|
map(myu.s4->a, myu.s4->b, myu.s4->c, myu.s4->d)
|
|
{
|
|
myu.s4->a++;
|
|
myu.s4->b++;
|
|
myu.s4->c++;
|
|
myu.s4->d++;
|
|
}
|
|
|
|
assert (myu.s4->a == 1);
|
|
assert (myu.s4->b == 1);
|
|
assert (myu.s4->c == &c4 + 1);
|
|
assert (myu.s4->d == &d4 + 1);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
}
|
|
#endif
|
|
|
|
#ifdef NONREF_COMPONENT_MEMBER_SLICE
|
|
template<typename A>
|
|
void
|
|
nonref_component_member_slice (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> myu(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
|
|
#pragma omp target map(myu.t1.a[2:5])
|
|
{
|
|
myu.t1.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t1.b[2:5])
|
|
{
|
|
myu.t1.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t1.c)
|
|
|
|
#pragma omp target map(myu.t1.c[2:5])
|
|
{
|
|
myu.t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t1.c)
|
|
|
|
#pragma omp target enter data map(to: myu.t1.d)
|
|
|
|
#pragma omp target map(myu.t1.d[2:5])
|
|
{
|
|
myu.t1.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(from: myu.t1.d)
|
|
|
|
assert (myu.t1.a[2] == 1);
|
|
assert (myu.t1.b[2] == 3);
|
|
assert (myu.t1.c[2] == 3);
|
|
assert (myu.t1.d[2] == 3);
|
|
|
|
#pragma omp target map(myu.t2.a[2:5])
|
|
{
|
|
myu.t2.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t2.b[2:5])
|
|
{
|
|
myu.t2.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t2.c)
|
|
|
|
#pragma omp target map(myu.t2.c[2:5])
|
|
{
|
|
myu.t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t2.c)
|
|
|
|
#pragma omp target enter data map(to: myu.t2.d)
|
|
|
|
#pragma omp target map(myu.t2.d[2:5])
|
|
{
|
|
myu.t2.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t2.d)
|
|
|
|
assert (myu.t2.a[2] == 1);
|
|
assert (myu.t2.b[2] == 3);
|
|
assert (myu.t2.c[2] == 3);
|
|
assert (myu.t2.d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu.t3)
|
|
|
|
#pragma omp target map(myu.t3->a[2:5])
|
|
{
|
|
myu.t3->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t3->b[2:5])
|
|
{
|
|
myu.t3->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t3->c)
|
|
|
|
#pragma omp target map(myu.t3->c[2:5])
|
|
{
|
|
myu.t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t3->c)
|
|
|
|
#pragma omp target enter data map(to: myu.t3->d)
|
|
|
|
#pragma omp target map(myu.t3->d[2:5])
|
|
{
|
|
myu.t3->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t3, myu.t3->d)
|
|
|
|
assert (myu.t3->a[2] == 1);
|
|
assert (myu.t3->b[2] == 3);
|
|
assert (myu.t3->c[2] == 3);
|
|
assert (myu.t3->d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu.t4)
|
|
|
|
#pragma omp target map(myu.t4->a[2:5])
|
|
{
|
|
myu.t4->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t4->b[2:5])
|
|
{
|
|
myu.t4->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t4->c)
|
|
|
|
#pragma omp target map(myu.t4->c[2:5])
|
|
{
|
|
myu.t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t4->c)
|
|
|
|
#pragma omp target enter data map(to: myu.t4->d)
|
|
|
|
#pragma omp target map(myu.t4->d[2:5])
|
|
{
|
|
myu.t4->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t4, myu.t4->d)
|
|
|
|
assert (myu.t4->a[2] == 1);
|
|
assert (myu.t4->b[2] == 3);
|
|
assert (myu.t4->c[2] == 3);
|
|
assert (myu.t4->d[2] == 3);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
}
|
|
#endif
|
|
|
|
#ifdef NONREF_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
template<typename A>
|
|
void
|
|
nonref_component_member_slice_baseptr (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> myu(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
|
|
#pragma omp target map(to: myu.t1.c) map(myu.t1.c[2:5])
|
|
{
|
|
myu.t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t1.d) map(myu.t1.d[2:5])
|
|
{
|
|
myu.t1.d[2]++;
|
|
}
|
|
|
|
assert (myu.t1.c[2] == 2);
|
|
assert (myu.t1.d[2] == 2);
|
|
|
|
#pragma omp target map(to: myu.t2.c) map(myu.t2.c[2:5])
|
|
{
|
|
myu.t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t2.d) map(myu.t2.d[2:5])
|
|
{
|
|
myu.t2.d[2]++;
|
|
}
|
|
|
|
assert (myu.t2.c[2] == 2);
|
|
assert (myu.t2.d[2] == 2);
|
|
|
|
#pragma omp target map(to: myu.t3, myu.t3->c) map(myu.t3->c[2:5])
|
|
{
|
|
myu.t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t3, myu.t3->d) map(myu.t3->d[2:5])
|
|
{
|
|
myu.t3->d[2]++;
|
|
}
|
|
|
|
assert (myu.t3->c[2] == 2);
|
|
assert (myu.t3->d[2] == 2);
|
|
|
|
#pragma omp target map(to: myu.t4, myu.t4->c) map(myu.t4->c[2:5])
|
|
{
|
|
myu.t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t4, myu.t4->d) map(myu.t4->d[2:5])
|
|
{
|
|
myu.t4->d[2]++;
|
|
}
|
|
|
|
assert (myu.t4->c[2] == 2);
|
|
assert (myu.t4->d[2] == 2);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF_COMPONENT_BASE
|
|
template<typename A>
|
|
void
|
|
ref_component_base (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> myu_real(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
U<A> &myu = myu_real;
|
|
|
|
#pragma omp target map(myu.s1.a, myu.s1.b, myu.s1.c, myu.s1.d)
|
|
{
|
|
myu.s1.a++;
|
|
myu.s1.b++;
|
|
myu.s1.c++;
|
|
myu.s1.d++;
|
|
}
|
|
|
|
assert (myu.s1.a == 1);
|
|
assert (myu.s1.b == 1);
|
|
assert (myu.s1.c == &c1 + 1);
|
|
assert (myu.s1.d == &d1 + 1);
|
|
|
|
#pragma omp target map(myu.s2.a, myu.s2.b, myu.s2.c, myu.s2.d)
|
|
{
|
|
myu.s2.a++;
|
|
myu.s2.b++;
|
|
myu.s2.c++;
|
|
myu.s2.d++;
|
|
}
|
|
|
|
assert (myu.s2.a == 1);
|
|
assert (myu.s2.b == 1);
|
|
assert (myu.s2.c == &c2 + 1);
|
|
assert (myu.s2.d == &d2 + 1);
|
|
|
|
#pragma omp target map(to:myu.s3) \
|
|
map(myu.s3->a, myu.s3->b, myu.s3->c, myu.s3->d)
|
|
{
|
|
myu.s3->a++;
|
|
myu.s3->b++;
|
|
myu.s3->c++;
|
|
myu.s3->d++;
|
|
}
|
|
|
|
assert (myu.s3->a == 1);
|
|
assert (myu.s3->b == 1);
|
|
assert (myu.s3->c == &c3 + 1);
|
|
assert (myu.s3->d == &d3 + 1);
|
|
|
|
#pragma omp target map(to:myu.s4) \
|
|
map(myu.s4->a, myu.s4->b, myu.s4->c, myu.s4->d)
|
|
{
|
|
myu.s4->a++;
|
|
myu.s4->b++;
|
|
myu.s4->c++;
|
|
myu.s4->d++;
|
|
}
|
|
|
|
assert (myu.s4->a == 1);
|
|
assert (myu.s4->b == 1);
|
|
assert (myu.s4->c == &c4 + 1);
|
|
assert (myu.s4->d == &d4 + 1);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF_COMPONENT_MEMBER_SLICE
|
|
template<typename A>
|
|
void
|
|
ref_component_member_slice (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> myu_real(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
U<A> &myu = myu_real;
|
|
|
|
#pragma omp target map(myu.t1.a[2:5])
|
|
{
|
|
myu.t1.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t1.b[2:5])
|
|
{
|
|
myu.t1.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t1.c)
|
|
|
|
#pragma omp target map(myu.t1.c[2:5])
|
|
{
|
|
myu.t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t1.c)
|
|
|
|
#pragma omp target enter data map(to: myu.t1.d)
|
|
|
|
#pragma omp target map(myu.t1.d[2:5])
|
|
{
|
|
myu.t1.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t1.d)
|
|
|
|
assert (myu.t1.a[2] == 1);
|
|
assert (myu.t1.b[2] == 3);
|
|
assert (myu.t1.c[2] == 3);
|
|
assert (myu.t1.d[2] == 3);
|
|
|
|
#pragma omp target map(myu.t2.a[2:5])
|
|
{
|
|
myu.t2.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t2.b[2:5])
|
|
{
|
|
myu.t2.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t2.c)
|
|
|
|
#pragma omp target map(myu.t2.c[2:5])
|
|
{
|
|
myu.t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t2.c)
|
|
|
|
#pragma omp target enter data map(to: myu.t2.d)
|
|
|
|
#pragma omp target map(myu.t2.d[2:5])
|
|
{
|
|
myu.t2.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t2.d)
|
|
|
|
assert (myu.t2.a[2] == 1);
|
|
assert (myu.t2.b[2] == 3);
|
|
assert (myu.t2.c[2] == 3);
|
|
assert (myu.t2.d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu.t3)
|
|
|
|
#pragma omp target map(myu.t3->a[2:5])
|
|
{
|
|
myu.t3->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t3->b[2:5])
|
|
{
|
|
myu.t3->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t3->c)
|
|
|
|
#pragma omp target map(myu.t3->c[2:5])
|
|
{
|
|
myu.t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t3->c)
|
|
|
|
#pragma omp target enter data map(to: myu.t3->d)
|
|
|
|
#pragma omp target map(myu.t3->d[2:5])
|
|
{
|
|
myu.t3->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t3, myu.t3->d)
|
|
|
|
assert (myu.t3->a[2] == 1);
|
|
assert (myu.t3->b[2] == 3);
|
|
assert (myu.t3->c[2] == 3);
|
|
assert (myu.t3->d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu.t4)
|
|
|
|
#pragma omp target map(myu.t4->a[2:5])
|
|
{
|
|
myu.t4->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu.t4->b[2:5])
|
|
{
|
|
myu.t4->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu.t4->c)
|
|
|
|
#pragma omp target map(myu.t4->c[2:5])
|
|
{
|
|
myu.t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t4->c)
|
|
|
|
#pragma omp target enter data map(to: myu.t4->d)
|
|
|
|
#pragma omp target map(myu.t4->d[2:5])
|
|
{
|
|
myu.t4->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu.t4, myu.t4->d)
|
|
|
|
assert (myu.t4->a[2] == 1);
|
|
assert (myu.t4->b[2] == 3);
|
|
assert (myu.t4->c[2] == 3);
|
|
assert (myu.t4->d[2] == 3);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
template<typename A>
|
|
void
|
|
ref_component_member_slice_baseptr (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> myu_real(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
U<A> &myu = myu_real;
|
|
|
|
#pragma omp target map(to: myu.t1.c) map(myu.t1.c[2:5])
|
|
{
|
|
myu.t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t1.d) map(myu.t1.d[2:5])
|
|
{
|
|
myu.t1.d[2]++;
|
|
}
|
|
|
|
assert (myu.t1.c[2] == 2);
|
|
assert (myu.t1.d[2] == 2);
|
|
|
|
#pragma omp target map(to: myu.t2.c) map(myu.t2.c[2:5])
|
|
{
|
|
myu.t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t2.d) map(myu.t2.d[2:5])
|
|
{
|
|
myu.t2.d[2]++;
|
|
}
|
|
|
|
assert (myu.t2.c[2] == 2);
|
|
assert (myu.t2.d[2] == 2);
|
|
|
|
#pragma omp target map(to: myu.t3, myu.t3->c) map(myu.t3->c[2:5])
|
|
{
|
|
myu.t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t3, myu.t3->d) map(myu.t3->d[2:5])
|
|
{
|
|
myu.t3->d[2]++;
|
|
}
|
|
|
|
assert (myu.t3->c[2] == 2);
|
|
assert (myu.t3->d[2] == 2);
|
|
|
|
#pragma omp target map(to: myu.t4, myu.t4->c) map(myu.t4->c[2:5])
|
|
{
|
|
myu.t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu.t4, myu.t4->d) map(myu.t4->d[2:5])
|
|
{
|
|
myu.t4->d[2]++;
|
|
}
|
|
|
|
assert (myu.t4->c[2] == 2);
|
|
assert (myu.t4->d[2] == 2);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_COMPONENT_BASE
|
|
template<typename A>
|
|
void
|
|
ptr_component_base (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> *myu = new U<A>(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
|
|
#pragma omp target map(myu->s1.a, myu->s1.b, myu->s1.c, myu->s1.d)
|
|
{
|
|
myu->s1.a++;
|
|
myu->s1.b++;
|
|
myu->s1.c++;
|
|
myu->s1.d++;
|
|
}
|
|
|
|
assert (myu->s1.a == 1);
|
|
assert (myu->s1.b == 1);
|
|
assert (myu->s1.c == &c1 + 1);
|
|
assert (myu->s1.d == &d1 + 1);
|
|
|
|
#pragma omp target map(myu->s2.a, myu->s2.b, myu->s2.c, myu->s2.d)
|
|
{
|
|
myu->s2.a++;
|
|
myu->s2.b++;
|
|
myu->s2.c++;
|
|
myu->s2.d++;
|
|
}
|
|
|
|
assert (myu->s2.a == 1);
|
|
assert (myu->s2.b == 1);
|
|
assert (myu->s2.c == &c2 + 1);
|
|
assert (myu->s2.d == &d2 + 1);
|
|
|
|
#pragma omp target map(to:myu->s3) \
|
|
map(myu->s3->a, myu->s3->b, myu->s3->c, myu->s3->d)
|
|
{
|
|
myu->s3->a++;
|
|
myu->s3->b++;
|
|
myu->s3->c++;
|
|
myu->s3->d++;
|
|
}
|
|
|
|
assert (myu->s3->a == 1);
|
|
assert (myu->s3->b == 1);
|
|
assert (myu->s3->c == &c3 + 1);
|
|
assert (myu->s3->d == &d3 + 1);
|
|
|
|
#pragma omp target map(to:myu->s4) \
|
|
map(myu->s4->a, myu->s4->b, myu->s4->c, myu->s4->d)
|
|
{
|
|
myu->s4->a++;
|
|
myu->s4->b++;
|
|
myu->s4->c++;
|
|
myu->s4->d++;
|
|
}
|
|
|
|
assert (myu->s4->a == 1);
|
|
assert (myu->s4->b == 1);
|
|
assert (myu->s4->c == &c4 + 1);
|
|
assert (myu->s4->d == &d4 + 1);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
delete myu;
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_COMPONENT_MEMBER_SLICE
|
|
template<typename A>
|
|
void
|
|
ptr_component_member_slice (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> *myu = new U<A>(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
|
|
#pragma omp target map(myu->t1.a[2:5])
|
|
{
|
|
myu->t1.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t1.b[2:5])
|
|
{
|
|
myu->t1.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t1.c)
|
|
|
|
#pragma omp target map(myu->t1.c[2:5])
|
|
{
|
|
myu->t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t1.c)
|
|
|
|
#pragma omp target enter data map(to: myu->t1.d)
|
|
|
|
#pragma omp target map(myu->t1.d[2:5])
|
|
{
|
|
myu->t1.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t1.d)
|
|
|
|
assert (myu->t1.a[2] == 1);
|
|
assert (myu->t1.b[2] == 3);
|
|
assert (myu->t1.c[2] == 3);
|
|
assert (myu->t1.d[2] == 3);
|
|
|
|
#pragma omp target map(myu->t2.a[2:5])
|
|
{
|
|
myu->t2.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t2.b[2:5])
|
|
{
|
|
myu->t2.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t2.c)
|
|
|
|
#pragma omp target map(myu->t2.c[2:5])
|
|
{
|
|
myu->t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t2.c)
|
|
|
|
#pragma omp target enter data map(to: myu->t2.d)
|
|
|
|
#pragma omp target map(myu->t2.d[2:5])
|
|
{
|
|
myu->t2.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t2.d)
|
|
|
|
assert (myu->t2.a[2] == 1);
|
|
assert (myu->t2.b[2] == 3);
|
|
assert (myu->t2.c[2] == 3);
|
|
assert (myu->t2.d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu->t3)
|
|
|
|
#pragma omp target map(myu->t3->a[2:5])
|
|
{
|
|
myu->t3->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t3->b[2:5])
|
|
{
|
|
myu->t3->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t3->c)
|
|
|
|
#pragma omp target map(myu->t3->c[2:5])
|
|
{
|
|
myu->t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t3->c)
|
|
|
|
#pragma omp target enter data map(to: myu->t3->d)
|
|
|
|
#pragma omp target map(myu->t3->d[2:5])
|
|
{
|
|
myu->t3->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t3, myu->t3->d)
|
|
|
|
assert (myu->t3->a[2] == 1);
|
|
assert (myu->t3->b[2] == 3);
|
|
assert (myu->t3->c[2] == 3);
|
|
assert (myu->t3->d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu->t4)
|
|
|
|
#pragma omp target map(myu->t4->a[2:5])
|
|
{
|
|
myu->t4->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t4->b[2:5])
|
|
{
|
|
myu->t4->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t4->c)
|
|
|
|
#pragma omp target map(myu->t4->c[2:5])
|
|
{
|
|
myu->t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t4->c)
|
|
|
|
#pragma omp target enter data map(to: myu->t4->d)
|
|
|
|
#pragma omp target map(myu->t4->d[2:5])
|
|
{
|
|
myu->t4->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t4, myu->t4->d)
|
|
|
|
assert (myu->t4->a[2] == 1);
|
|
assert (myu->t4->b[2] == 3);
|
|
assert (myu->t4->c[2] == 3);
|
|
assert (myu->t4->d[2] == 3);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
delete myu;
|
|
}
|
|
#endif
|
|
|
|
#ifdef PTR_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
template<typename A>
|
|
void
|
|
ptr_component_member_slice_baseptr (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> *myu = new U<A>(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t1.c) map(myu->t1.c[2:5])
|
|
{
|
|
myu->t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t1.d) map(myu->t1.d[2:5])
|
|
{
|
|
myu->t1.d[2]++;
|
|
}
|
|
|
|
assert (myu->t1.c[2] == 2);
|
|
assert (myu->t1.d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t1.c) map(myu->t1.c[2:5])
|
|
{
|
|
myu->t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t1.d) map(myu->t1.d[2:5])
|
|
{
|
|
myu->t1.d[2]++;
|
|
}
|
|
|
|
assert (myu->t1.c[2] == 4);
|
|
assert (myu->t1.d[2] == 4);
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t2.c) map(myu->t2.c[2:5])
|
|
{
|
|
myu->t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t2.d) map(myu->t2.d[2:5])
|
|
{
|
|
myu->t2.d[2]++;
|
|
}
|
|
|
|
assert (myu->t2.c[2] == 2);
|
|
assert (myu->t2.d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t2.c) map(myu->t2.c[2:5])
|
|
{
|
|
myu->t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t2.d) map(myu->t2.d[2:5])
|
|
{
|
|
myu->t2.d[2]++;
|
|
}
|
|
|
|
assert (myu->t2.c[2] == 4);
|
|
assert (myu->t2.d[2] == 4);
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t3, myu->t3->c) map(myu->t3->c[2:5])
|
|
{
|
|
myu->t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t3, myu->t3->d) map(myu->t3->d[2:5])
|
|
{
|
|
myu->t3->d[2]++;
|
|
}
|
|
|
|
assert (myu->t3->c[2] == 2);
|
|
assert (myu->t3->d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t3, myu->t3->c) map(myu->t3->c[2:5])
|
|
{
|
|
myu->t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t3, myu->t3->d) map(myu->t3->d[2:5])
|
|
{
|
|
myu->t3->d[2]++;
|
|
}
|
|
|
|
assert (myu->t3->c[2] == 4);
|
|
assert (myu->t3->d[2] == 4);
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t4, myu->t4->c) map(myu->t4->c[2:5])
|
|
{
|
|
myu->t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t4, myu->t4->d) map(myu->t4->d[2:5])
|
|
{
|
|
myu->t4->d[2]++;
|
|
}
|
|
|
|
assert (myu->t4->c[2] == 2);
|
|
assert (myu->t4->d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t4, myu->t4->c) map(myu->t4->c[2:5])
|
|
{
|
|
myu->t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t4, myu->t4->d) map(myu->t4->d[2:5])
|
|
{
|
|
myu->t4->d[2]++;
|
|
}
|
|
|
|
assert (myu->t4->c[2] == 4);
|
|
assert (myu->t4->d[2] == 4);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
delete myu;
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_COMPONENT_BASE
|
|
template<typename A>
|
|
void
|
|
ref2ptr_component_base (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> *myu_ptr = new U<A>(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
U<A> *&myu = myu_ptr;
|
|
|
|
#pragma omp target map(myu->s1.a, myu->s1.b, myu->s1.c, myu->s1.d)
|
|
{
|
|
myu->s1.a++;
|
|
myu->s1.b++;
|
|
myu->s1.c++;
|
|
myu->s1.d++;
|
|
}
|
|
|
|
assert (myu->s1.a == 1);
|
|
assert (myu->s1.b == 1);
|
|
assert (myu->s1.c == &c1 + 1);
|
|
assert (myu->s1.d == &d1 + 1);
|
|
|
|
#pragma omp target map(myu->s2.a, myu->s2.b, myu->s2.c, myu->s2.d)
|
|
{
|
|
myu->s2.a++;
|
|
myu->s2.b++;
|
|
myu->s2.c++;
|
|
myu->s2.d++;
|
|
}
|
|
|
|
assert (myu->s2.a == 1);
|
|
assert (myu->s2.b == 1);
|
|
assert (myu->s2.c == &c2 + 1);
|
|
assert (myu->s2.d == &d2 + 1);
|
|
|
|
#pragma omp target map(to:myu->s3) \
|
|
map(myu->s3->a, myu->s3->b, myu->s3->c, myu->s3->d)
|
|
{
|
|
myu->s3->a++;
|
|
myu->s3->b++;
|
|
myu->s3->c++;
|
|
myu->s3->d++;
|
|
}
|
|
|
|
assert (myu->s3->a == 1);
|
|
assert (myu->s3->b == 1);
|
|
assert (myu->s3->c == &c3 + 1);
|
|
assert (myu->s3->d == &d3 + 1);
|
|
|
|
#pragma omp target map(to:myu->s4) \
|
|
map(myu->s4->a, myu->s4->b, myu->s4->c, myu->s4->d)
|
|
{
|
|
myu->s4->a++;
|
|
myu->s4->b++;
|
|
myu->s4->c++;
|
|
myu->s4->d++;
|
|
}
|
|
|
|
assert (myu->s4->a == 1);
|
|
assert (myu->s4->b == 1);
|
|
assert (myu->s4->c == &c4 + 1);
|
|
assert (myu->s4->d == &d4 + 1);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
delete myu_ptr;
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_COMPONENT_MEMBER_SLICE
|
|
template<typename A>
|
|
void
|
|
ref2ptr_component_member_slice (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> *myu_ptr = new U<A>(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
U<A> *&myu = myu_ptr;
|
|
|
|
#pragma omp target map(myu->t1.a[2:5])
|
|
{
|
|
myu->t1.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t1.b[2:5])
|
|
{
|
|
myu->t1.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t1.c)
|
|
|
|
#pragma omp target map(myu->t1.c[2:5])
|
|
{
|
|
myu->t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t1.c)
|
|
|
|
#pragma omp target enter data map(to: myu->t1.d)
|
|
|
|
#pragma omp target map(myu->t1.d[2:5])
|
|
{
|
|
myu->t1.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t1.d)
|
|
|
|
assert (myu->t1.a[2] == 1);
|
|
assert (myu->t1.b[2] == 3);
|
|
assert (myu->t1.c[2] == 3);
|
|
assert (myu->t1.d[2] == 3);
|
|
|
|
#pragma omp target map(myu->t2.a[2:5])
|
|
{
|
|
myu->t2.a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t2.b[2:5])
|
|
{
|
|
myu->t2.b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t2.c)
|
|
|
|
#pragma omp target map(myu->t2.c[2:5])
|
|
{
|
|
myu->t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t2.c)
|
|
|
|
#pragma omp target enter data map(to: myu->t2.d)
|
|
|
|
#pragma omp target map(myu->t2.d[2:5])
|
|
{
|
|
myu->t2.d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t2.d)
|
|
|
|
assert (myu->t2.a[2] == 1);
|
|
assert (myu->t2.b[2] == 3);
|
|
assert (myu->t2.c[2] == 3);
|
|
assert (myu->t2.d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu->t3)
|
|
|
|
#pragma omp target map(myu->t3->a[2:5])
|
|
{
|
|
myu->t3->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t3->b[2:5])
|
|
{
|
|
myu->t3->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t3->c)
|
|
|
|
#pragma omp target map(myu->t3->c[2:5])
|
|
{
|
|
myu->t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t3->c)
|
|
|
|
#pragma omp target enter data map(to: myu->t3->d)
|
|
|
|
#pragma omp target map(myu->t3->d[2:5])
|
|
{
|
|
myu->t3->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t3, myu->t3->d)
|
|
|
|
assert (myu->t3->a[2] == 1);
|
|
assert (myu->t3->b[2] == 3);
|
|
assert (myu->t3->c[2] == 3);
|
|
assert (myu->t3->d[2] == 3);
|
|
|
|
#pragma omp target enter data map(to: myu->t4)
|
|
|
|
#pragma omp target map(myu->t4->a[2:5])
|
|
{
|
|
myu->t4->a[2]++;
|
|
}
|
|
|
|
#pragma omp target map(myu->t4->b[2:5])
|
|
{
|
|
myu->t4->b[2]++;
|
|
}
|
|
|
|
#pragma omp target enter data map(to: myu->t4->c)
|
|
|
|
#pragma omp target map(myu->t4->c[2:5])
|
|
{
|
|
myu->t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t4->c)
|
|
|
|
#pragma omp target enter data map(to: myu->t4->d)
|
|
|
|
#pragma omp target map(myu->t4->d[2:5])
|
|
{
|
|
myu->t4->d[2]++;
|
|
}
|
|
|
|
#pragma omp target exit data map(release: myu->t4, myu->t4->d)
|
|
|
|
assert (myu->t4->a[2] == 1);
|
|
assert (myu->t4->b[2] == 3);
|
|
assert (myu->t4->c[2] == 3);
|
|
assert (myu->t4->d[2] == 3);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
delete myu_ptr;
|
|
}
|
|
#endif
|
|
|
|
#ifdef REF2PTR_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
template<typename A>
|
|
void
|
|
ref2ptr_component_member_slice_baseptr (void)
|
|
{
|
|
INIT_ST;
|
|
U<A> *myu_ptr = new U<A>(s1, t1, s2, t2, &s3, &t3, s4, t4);
|
|
U<A> *&myu = myu_ptr;
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t1.c) map(myu->t1.c[2:5])
|
|
{
|
|
myu->t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t1.d) map(myu->t1.d[2:5])
|
|
{
|
|
myu->t1.d[2]++;
|
|
}
|
|
|
|
assert (myu->t1.c[2] == 2);
|
|
assert (myu->t1.d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t1.c) map(myu->t1.c[2:5])
|
|
{
|
|
myu->t1.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t1.d) map(myu->t1.d[2:5])
|
|
{
|
|
myu->t1.d[2]++;
|
|
}
|
|
|
|
assert (myu->t1.c[2] == 4);
|
|
assert (myu->t1.d[2] == 4);
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t2.c) map(myu->t2.c[2:5])
|
|
{
|
|
myu->t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t2.d) map(myu->t2.d[2:5])
|
|
{
|
|
myu->t2.d[2]++;
|
|
}
|
|
|
|
assert (myu->t2.c[2] == 2);
|
|
assert (myu->t2.d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t2.c) map(myu->t2.c[2:5])
|
|
{
|
|
myu->t2.c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t2.d) map(myu->t2.d[2:5])
|
|
{
|
|
myu->t2.d[2]++;
|
|
}
|
|
|
|
assert (myu->t2.c[2] == 4);
|
|
assert (myu->t2.d[2] == 4);
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t3, myu->t3->c) map(myu->t3->c[2:5])
|
|
{
|
|
myu->t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t3, myu->t3->d) map(myu->t3->d[2:5])
|
|
{
|
|
myu->t3->d[2]++;
|
|
}
|
|
|
|
assert (myu->t3->c[2] == 2);
|
|
assert (myu->t3->d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t3, myu->t3->c) map(myu->t3->c[2:5])
|
|
{
|
|
myu->t3->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t3, myu->t3->d) map(myu->t3->d[2:5])
|
|
{
|
|
myu->t3->d[2]++;
|
|
}
|
|
|
|
assert (myu->t3->c[2] == 4);
|
|
assert (myu->t3->d[2] == 4);
|
|
|
|
/* Implicit firstprivate 'myu'. */
|
|
#pragma omp target map(to: myu->t4, myu->t4->c) map(myu->t4->c[2:5])
|
|
{
|
|
myu->t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu->t4, myu->t4->d) map(myu->t4->d[2:5])
|
|
{
|
|
myu->t4->d[2]++;
|
|
}
|
|
|
|
assert (myu->t4->c[2] == 2);
|
|
assert (myu->t4->d[2] == 2);
|
|
|
|
/* Explicitly-mapped 'myu'. */
|
|
#pragma omp target map(to: myu, myu->t4, myu->t4->c) map(myu->t4->c[2:5])
|
|
{
|
|
myu->t4->c[2]++;
|
|
}
|
|
|
|
#pragma omp target map(to: myu, myu->t4, myu->t4->d) map(myu->t4->d[2:5])
|
|
{
|
|
myu->t4->d[2]++;
|
|
}
|
|
|
|
assert (myu->t4->c[2] == 4);
|
|
assert (myu->t4->d[2] == 4);
|
|
|
|
delete s4;
|
|
delete t4;
|
|
delete myu_ptr;
|
|
}
|
|
#endif
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
#ifdef MAP_DECLS
|
|
map_decls<4> ();
|
|
#endif
|
|
|
|
#ifdef NONREF_DECL_BASE
|
|
nonref_decl_base<int> ();
|
|
#endif
|
|
#ifdef REF_DECL_BASE
|
|
ref_decl_base<int> ();
|
|
#endif
|
|
#ifdef PTR_DECL_BASE
|
|
ptr_decl_base<int> ();
|
|
#endif
|
|
#ifdef REF2PTR_DECL_BASE
|
|
ref2ptr_decl_base<int> ();
|
|
#endif
|
|
|
|
#ifdef ARRAY_DECL_BASE
|
|
array_decl_base<int> ();
|
|
#endif
|
|
#ifdef REF2ARRAY_DECL_BASE
|
|
ref2array_decl_base<int> ();
|
|
#endif
|
|
#ifdef PTR_OFFSET_DECL_BASE
|
|
ptr_offset_decl_base<int> ();
|
|
#endif
|
|
#ifdef REF2PTR_OFFSET_DECL_BASE
|
|
ref2ptr_offset_decl_base<int> ();
|
|
#endif
|
|
|
|
#ifdef MAP_SECTIONS
|
|
map_sections<int, 10> ();
|
|
#endif
|
|
|
|
#ifdef NONREF_DECL_MEMBER_SLICE
|
|
nonref_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef NONREF_DECL_MEMBER_SLICE_BASEPTR
|
|
nonref_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef REF_DECL_MEMBER_SLICE
|
|
ref_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef REF_DECL_MEMBER_SLICE_BASEPTR
|
|
ref_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef PTR_DECL_MEMBER_SLICE
|
|
ptr_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef PTR_DECL_MEMBER_SLICE_BASEPTR
|
|
ptr_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTR_DECL_MEMBER_SLICE
|
|
ref2ptr_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTR_DECL_MEMBER_SLICE_BASEPTR
|
|
ref2ptr_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
|
|
#ifdef ARRAY_DECL_MEMBER_SLICE
|
|
array_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef ARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
array_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef REF2ARRAY_DECL_MEMBER_SLICE
|
|
ref2array_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef REF2ARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
ref2array_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef PTR_OFFSET_DECL_MEMBER_SLICE
|
|
ptr_offset_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
ptr_offset_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE
|
|
ref2ptr_offset_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
ref2ptr_offset_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
|
|
#ifdef PTRARRAY_DECL_MEMBER_SLICE
|
|
ptrarray_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
ptrarray_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTRARRAY_DECL_MEMBER_SLICE
|
|
ref2ptrarray_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
|
|
ref2ptrarray_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE
|
|
ptrptr_offset_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
ptrptr_offset_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE
|
|
ref2ptrptr_offset_decl_member_slice<int, 10> ();
|
|
#endif
|
|
#ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
|
|
ref2ptrptr_offset_decl_member_slice_baseptr<int, 10> ();
|
|
#endif
|
|
|
|
#ifdef NONREF_COMPONENT_BASE
|
|
nonref_component_base<int> ();
|
|
#endif
|
|
#ifdef NONREF_COMPONENT_MEMBER_SLICE
|
|
nonref_component_member_slice<int> ();
|
|
#endif
|
|
#ifdef NONREF_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
nonref_component_member_slice_baseptr<int> ();
|
|
#endif
|
|
|
|
#ifdef REF_COMPONENT_BASE
|
|
ref_component_base<int> ();
|
|
#endif
|
|
#ifdef REF_COMPONENT_MEMBER_SLICE
|
|
ref_component_member_slice<int> ();
|
|
#endif
|
|
#ifdef REF_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
ref_component_member_slice_baseptr<int> ();
|
|
#endif
|
|
|
|
#ifdef PTR_COMPONENT_BASE
|
|
ptr_component_base<int> ();
|
|
#endif
|
|
#ifdef PTR_COMPONENT_MEMBER_SLICE
|
|
ptr_component_member_slice<int> ();
|
|
#endif
|
|
#ifdef PTR_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
ptr_component_member_slice_baseptr<int> ();
|
|
#endif
|
|
|
|
#ifdef REF2PTR_COMPONENT_BASE
|
|
ref2ptr_component_base<int> ();
|
|
#endif
|
|
#ifdef REF2PTR_COMPONENT_MEMBER_SLICE
|
|
ref2ptr_component_member_slice<int> ();
|
|
#endif
|
|
#ifdef REF2PTR_COMPONENT_MEMBER_SLICE_BASEPTR
|
|
ref2ptr_component_member_slice_baseptr<int> ();
|
|
#endif
|
|
|
|
return 0;
|
|
}
|