| #include <stdlib.h> | |
| /* Test multiple struct dereferences on one directive, and slices starting at | |
| non-zero. */ | |
| typedef struct { | |
| int *a; | |
| int *b; | |
| int *c; | |
| } mystruct; | |
| int main(int argc, char* argv[]) | |
| { | |
| const int N = 1024; | |
| mystruct *m = (mystruct *) malloc (sizeof (*m)); | |
| int i; | |
| m->a = (int *) malloc (N * sizeof (int)); | |
| m->b = (int *) malloc (N * sizeof (int)); | |
| m->c = (int *) malloc (N * sizeof (int)); | |
| for (i = 0; i < N; i++) | |
| { | |
| m->a[i] = 0; | |
| m->b[i] = 0; | |
| m->c[i] = 0; | |
| } | |
| #pragma acc enter data copyin(m[0:1]) | |
| for (int i = 0; i < 99; i++) | |
| { | |
| int j; | |
| #pragma acc parallel loop copy(m->a[0:N]) | |
| for (j = 0; j < N; j++) | |
| m->a[j]++; | |
| #pragma acc parallel loop copy(m->b[0:N], m->c[5:N-10]) | |
| for (j = 0; j < N; j++) | |
| { | |
| m->b[j]++; | |
| if (j > 5 && j < N - 5) | |
| m->c[j]++; | |
| } | |
| } | |
| #pragma acc exit data copyout(m[0:1]) | |
| for (i = 0; i < N; i++) | |
| { | |
| if (m->a[i] != 99) | |
| abort (); | |
| if (m->b[i] != 99) | |
| abort (); | |
| if (i > 5 && i < N-5) | |
| { | |
| if (m->c[i] != 99) | |
| abort (); | |
| } | |
| else | |
| { | |
| if (m->c[i] != 0) | |
| abort (); | |
| } | |
| } | |
| free (m->a); | |
| free (m->b); | |
| free (m->c); | |
| free (m); | |
| return 0; | |
| } |