blob: f194e63b5b7f7101ff97fa6e7f2d75d4bb7c378b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
// { dg-do run }
#include <cstdlib>
#include <cassert>
struct S {
int *myarr;
};
#pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:20])
namespace A {
#pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:100])
}
namespace B {
#pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[100:100])
}
namespace A
{
void incr_a (S &my_s)
{
#pragma omp target
{
for (int i = 0; i < 100; i++)
my_s.myarr[i]++;
}
}
}
namespace B
{
void incr_b (S &my_s)
{
#pragma omp target
{
for (int i = 100; i < 200; i++)
my_s.myarr[i]++;
}
}
}
int main (int argc, char *argv[])
{
S my_s;
my_s.myarr = (int *) calloc (200, sizeof (int));
#pragma omp target
{
for (int i = 0; i < 20; i++)
my_s.myarr[i]++;
}
A::incr_a (my_s);
B::incr_b (my_s);
for (int i = 0; i < 200; i++)
assert (my_s.myarr[i] == (i < 20) ? 2 : 1);
return 0;
}
|