| #include <stdlib.h> | |
| #include <assert.h> | |
| struct st { | |
| int *p; | |
| }; | |
| int main (void) | |
| { | |
| struct st s[2]; | |
| s[0].p = (int *) calloc (5, sizeof (int)); | |
| s[1].p = (int *) calloc (5, sizeof (int)); | |
| /* These mappings not supported by the OpenMP spec, and are currently | |
| implemented as an extension by GCC for legacy compatibility only. See | |
| e.g. OpenMP 5.2, "5.8.3 map Clause": | |
| "If multiple list items are explicitly mapped on the same construct and | |
| have the same containing array or have base pointers that share original | |
| storage, and if any of the list items do not have corresponding list | |
| items that are present in the device data environment prior to a task | |
| encountering the construct, then the list items must refer to the same | |
| array elements of either the containing array or the implicit array of | |
| the base pointers." | |
| */ | |
| #pragma omp target map(s[0].p, s[1].p, s[0].p[0:2], s[1].p[1:3]) | |
| { | |
| s[0].p[0] = 5; | |
| s[1].p[1] = 7; | |
| } | |
| #pragma omp target map(s, s[0].p[0:2], s[1].p[1:3]) | |
| { | |
| s[0].p[0]++; | |
| s[1].p[1]++; | |
| } | |
| #pragma omp target map(s[0:2], s[0].p[0:2], s[1].p[1:3]) | |
| { | |
| s[0].p[0]++; | |
| s[1].p[1]++; | |
| } | |
| assert (s[0].p[0] == 7); | |
| assert (s[1].p[1] == 9); | |
| free (s[0].p); | |
| free (s[1].p); | |
| return 0; | |
| } |