| [444] | 1 | /* Communication between GCC and libgomp. | 
|---|
|  | 2 |  | 
|---|
|  | 3 | Copyright (C) 2014-2015 Free Software Foundation, Inc. | 
|---|
|  | 4 |  | 
|---|
|  | 5 | Contributed by Mentor Embedded. | 
|---|
|  | 6 |  | 
|---|
|  | 7 | This file is part of the GNU Offloading and Multi Processing Library | 
|---|
|  | 8 | (libgomp). | 
|---|
|  | 9 |  | 
|---|
|  | 10 | Libgomp is free software; you can redistribute it and/or modify it | 
|---|
|  | 11 | under the terms of the GNU General Public License as published by | 
|---|
|  | 12 | the Free Software Foundation; either version 3, or (at your option) | 
|---|
|  | 13 | any later version. | 
|---|
|  | 14 |  | 
|---|
|  | 15 | Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY | 
|---|
|  | 16 | WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 
|---|
|  | 17 | FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|---|
|  | 18 | more details. | 
|---|
|  | 19 |  | 
|---|
|  | 20 | Under Section 7 of GPL version 3, you are granted additional | 
|---|
|  | 21 | permissions described in the GCC Runtime Library Exception, version | 
|---|
|  | 22 | 3.1, as published by the Free Software Foundation. | 
|---|
|  | 23 |  | 
|---|
|  | 24 | You should have received a copy of the GNU General Public License and | 
|---|
|  | 25 | a copy of the GCC Runtime Library Exception along with this program; | 
|---|
|  | 26 | see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see | 
|---|
|  | 27 | <http://www.gnu.org/licenses/>.  */ | 
|---|
|  | 28 |  | 
|---|
|  | 29 | #ifndef GOMP_CONSTANTS_H | 
|---|
|  | 30 | #define GOMP_CONSTANTS_H 1 | 
|---|
|  | 31 |  | 
|---|
|  | 32 | /* Memory mapping types.  */ | 
|---|
|  | 33 |  | 
|---|
|  | 34 | /* One byte.  */ | 
|---|
|  | 35 | #define GOMP_MAP_LAST                   (1 << 8) | 
|---|
|  | 36 |  | 
|---|
|  | 37 | #define GOMP_MAP_FLAG_TO                (1 << 0) | 
|---|
|  | 38 | #define GOMP_MAP_FLAG_FROM              (1 << 1) | 
|---|
|  | 39 | /* Special map kinds, enumerated starting here.  */ | 
|---|
|  | 40 | #define GOMP_MAP_FLAG_SPECIAL_0         (1 << 2) | 
|---|
|  | 41 | #define GOMP_MAP_FLAG_SPECIAL_1         (1 << 3) | 
|---|
|  | 42 | #define GOMP_MAP_FLAG_SPECIAL_2         (1 << 4) | 
|---|
|  | 43 | #define GOMP_MAP_FLAG_SPECIAL           (GOMP_MAP_FLAG_SPECIAL_1 \ | 
|---|
|  | 44 | | GOMP_MAP_FLAG_SPECIAL_0) | 
|---|
|  | 45 | /* Flag to force a specific behavior (or else, trigger a run-time error).  */ | 
|---|
|  | 46 | #define GOMP_MAP_FLAG_FORCE             (1 << 7) | 
|---|
|  | 47 |  | 
|---|
|  | 48 | enum gomp_map_kind | 
|---|
|  | 49 | { | 
|---|
|  | 50 | /* If not already present, allocate.  */ | 
|---|
|  | 51 | GOMP_MAP_ALLOC =                    0, | 
|---|
|  | 52 | /* ..., and copy to device.  */ | 
|---|
|  | 53 | GOMP_MAP_TO =                       (GOMP_MAP_ALLOC | GOMP_MAP_FLAG_TO), | 
|---|
|  | 54 | /* ..., and copy from device.  */ | 
|---|
|  | 55 | GOMP_MAP_FROM =                     (GOMP_MAP_ALLOC | GOMP_MAP_FLAG_FROM), | 
|---|
|  | 56 | /* ..., and copy to and from device.  */ | 
|---|
|  | 57 | GOMP_MAP_TOFROM =                   (GOMP_MAP_TO | GOMP_MAP_FROM), | 
|---|
|  | 58 | /* The following kind is an internal only map kind, used for pointer based | 
|---|
|  | 59 | array sections.  OMP_CLAUSE_SIZE for these is not the pointer size, | 
|---|
|  | 60 | which is implicitly POINTER_SIZE_UNITS, but the bias.  */ | 
|---|
|  | 61 | GOMP_MAP_POINTER =                  (GOMP_MAP_FLAG_SPECIAL_0 | 0), | 
|---|
|  | 62 | /* Also internal, behaves like GOMP_MAP_TO, but additionally any | 
|---|
|  | 63 | GOMP_MAP_POINTER records consecutive after it which have addresses | 
|---|
|  | 64 | falling into that range will not be ignored if GOMP_MAP_TO_PSET wasn't | 
|---|
|  | 65 | mapped already.  */ | 
|---|
|  | 66 | GOMP_MAP_TO_PSET =                  (GOMP_MAP_FLAG_SPECIAL_0 | 1), | 
|---|
|  | 67 | /* Must already be present.  */ | 
|---|
|  | 68 | GOMP_MAP_FORCE_PRESENT =            (GOMP_MAP_FLAG_SPECIAL_0 | 2), | 
|---|
|  | 69 | /* Deallocate a mapping, without copying from device.  */ | 
|---|
|  | 70 | GOMP_MAP_DELETE =                   (GOMP_MAP_FLAG_SPECIAL_0 | 3), | 
|---|
|  | 71 | /* Is a device pointer.  OMP_CLAUSE_SIZE for these is unused; is implicitly | 
|---|
|  | 72 | POINTER_SIZE_UNITS.  */ | 
|---|
|  | 73 | GOMP_MAP_FORCE_DEVICEPTR =          (GOMP_MAP_FLAG_SPECIAL_1 | 0), | 
|---|
|  | 74 | /* Do not map, copy bits for firstprivate instead.  */ | 
|---|
|  | 75 | /* OpenACC device_resident.  */ | 
|---|
|  | 76 | GOMP_MAP_DEVICE_RESIDENT =          (GOMP_MAP_FLAG_SPECIAL_1 | 1), | 
|---|
|  | 77 | /* OpenACC link.  */ | 
|---|
|  | 78 | GOMP_MAP_LINK =                     (GOMP_MAP_FLAG_SPECIAL_1 | 2), | 
|---|
|  | 79 | /* Allocate.  */ | 
|---|
|  | 80 | GOMP_MAP_FIRSTPRIVATE =             (GOMP_MAP_FLAG_SPECIAL | 0), | 
|---|
|  | 81 | /* Similarly, but store the value in the pointer rather than | 
|---|
|  | 82 | pointed by the pointer.  */ | 
|---|
|  | 83 | GOMP_MAP_FIRSTPRIVATE_INT =         (GOMP_MAP_FLAG_SPECIAL | 1), | 
|---|
|  | 84 | /* Pointer translate host address into device address and copy that | 
|---|
|  | 85 | back to host.  */ | 
|---|
|  | 86 | GOMP_MAP_USE_DEVICE_PTR =           (GOMP_MAP_FLAG_SPECIAL | 2), | 
|---|
|  | 87 | /* Allocate a zero length array section.  Prefer next non-zero length | 
|---|
|  | 88 | mapping over previous non-zero length mapping over zero length mapping | 
|---|
|  | 89 | at the address.  If not already mapped, do nothing (and pointer translate | 
|---|
|  | 90 | to NULL).  */ | 
|---|
|  | 91 | GOMP_MAP_ZERO_LEN_ARRAY_SECTION =   (GOMP_MAP_FLAG_SPECIAL | 3), | 
|---|
|  | 92 | /* Allocate.  */ | 
|---|
|  | 93 | GOMP_MAP_FORCE_ALLOC =              (GOMP_MAP_FLAG_FORCE | GOMP_MAP_ALLOC), | 
|---|
|  | 94 | /* ..., and copy to device.  */ | 
|---|
|  | 95 | GOMP_MAP_FORCE_TO =                 (GOMP_MAP_FLAG_FORCE | GOMP_MAP_TO), | 
|---|
|  | 96 | /* ..., and copy from device.  */ | 
|---|
|  | 97 | GOMP_MAP_FORCE_FROM =               (GOMP_MAP_FLAG_FORCE | GOMP_MAP_FROM), | 
|---|
|  | 98 | /* ..., and copy to and from device.  */ | 
|---|
|  | 99 | GOMP_MAP_FORCE_TOFROM =             (GOMP_MAP_FLAG_FORCE | GOMP_MAP_TOFROM), | 
|---|
|  | 100 | /* If not already present, allocate.  And unconditionally copy to | 
|---|
|  | 101 | device.  */ | 
|---|
|  | 102 | GOMP_MAP_ALWAYS_TO =                (GOMP_MAP_FLAG_SPECIAL_2 | GOMP_MAP_TO), | 
|---|
|  | 103 | /* If not already present, allocate.  And unconditionally copy from | 
|---|
|  | 104 | device.  */ | 
|---|
|  | 105 | GOMP_MAP_ALWAYS_FROM =              (GOMP_MAP_FLAG_SPECIAL_2 | 
|---|
|  | 106 | | GOMP_MAP_FROM), | 
|---|
|  | 107 | /* If not already present, allocate.  And unconditionally copy to and from | 
|---|
|  | 108 | device.  */ | 
|---|
|  | 109 | GOMP_MAP_ALWAYS_TOFROM =            (GOMP_MAP_FLAG_SPECIAL_2 | 
|---|
|  | 110 | | GOMP_MAP_TOFROM), | 
|---|
|  | 111 | /* Map a sparse struct; the address is the base of the structure, alignment | 
|---|
|  | 112 | it's required alignment, and size is the number of adjacent entries | 
|---|
|  | 113 | that belong to the struct.  The adjacent entries should be sorted by | 
|---|
|  | 114 | increasing address, so it is easy to determine lowest needed address | 
|---|
|  | 115 | (address of the first adjacent entry) and highest needed address | 
|---|
|  | 116 | (address of the last adjacent entry plus its size).  */ | 
|---|
|  | 117 | GOMP_MAP_STRUCT =                   (GOMP_MAP_FLAG_SPECIAL_2 | 
|---|
|  | 118 | | GOMP_MAP_FLAG_SPECIAL | 0), | 
|---|
|  | 119 | /* On a location of a pointer/reference that is assumed to be already mapped | 
|---|
|  | 120 | earlier, store the translated address of the preceeding mapping. | 
|---|
|  | 121 | No refcount is bumped by this, and the store is done unconditionally.  */ | 
|---|
|  | 122 | GOMP_MAP_ALWAYS_POINTER =           (GOMP_MAP_FLAG_SPECIAL_2 | 
|---|
|  | 123 | | GOMP_MAP_FLAG_SPECIAL | 1), | 
|---|
|  | 124 | /* Forced deallocation of zero length array section.  */ | 
|---|
|  | 125 | GOMP_MAP_DELETE_ZERO_LEN_ARRAY_SECTION | 
|---|
|  | 126 | =                                 (GOMP_MAP_FLAG_SPECIAL_2 | 
|---|
|  | 127 | | GOMP_MAP_FLAG_SPECIAL | 3), | 
|---|
|  | 128 | /* Decrement usage count and deallocate if zero.  */ | 
|---|
|  | 129 | GOMP_MAP_RELEASE =                  (GOMP_MAP_FLAG_SPECIAL_2 | 
|---|
|  | 130 | | GOMP_MAP_DELETE), | 
|---|
|  | 131 |  | 
|---|
|  | 132 | /* Internal to GCC, not used in libgomp.  */ | 
|---|
|  | 133 | /* Do not map, but pointer assign a pointer instead.  */ | 
|---|
|  | 134 | GOMP_MAP_FIRSTPRIVATE_POINTER =     (GOMP_MAP_LAST | 1), | 
|---|
|  | 135 | /* Do not map, but pointer assign a reference instead.  */ | 
|---|
|  | 136 | GOMP_MAP_FIRSTPRIVATE_REFERENCE =   (GOMP_MAP_LAST | 2) | 
|---|
|  | 137 | }; | 
|---|
|  | 138 |  | 
|---|
|  | 139 | #define GOMP_MAP_COPY_TO_P(X) \ | 
|---|
|  | 140 | (!((X) & GOMP_MAP_FLAG_SPECIAL) \ | 
|---|
|  | 141 | && ((X) & GOMP_MAP_FLAG_TO)) | 
|---|
|  | 142 |  | 
|---|
|  | 143 | #define GOMP_MAP_COPY_FROM_P(X) \ | 
|---|
|  | 144 | (!((X) & GOMP_MAP_FLAG_SPECIAL) \ | 
|---|
|  | 145 | && ((X) & GOMP_MAP_FLAG_FROM)) | 
|---|
|  | 146 |  | 
|---|
|  | 147 | #define GOMP_MAP_POINTER_P(X) \ | 
|---|
|  | 148 | ((X) == GOMP_MAP_POINTER) | 
|---|
|  | 149 |  | 
|---|
|  | 150 | #define GOMP_MAP_ALWAYS_TO_P(X) \ | 
|---|
|  | 151 | (((X) == GOMP_MAP_ALWAYS_TO) || ((X) == GOMP_MAP_ALWAYS_TOFROM)) | 
|---|
|  | 152 |  | 
|---|
|  | 153 | #define GOMP_MAP_ALWAYS_FROM_P(X) \ | 
|---|
|  | 154 | (((X) == GOMP_MAP_ALWAYS_FROM) || ((X) == GOMP_MAP_ALWAYS_TOFROM)) | 
|---|
|  | 155 |  | 
|---|
|  | 156 | #define GOMP_MAP_ALWAYS_P(X) \ | 
|---|
|  | 157 | (GOMP_MAP_ALWAYS_TO_P (X) || ((X) == GOMP_MAP_ALWAYS_FROM)) | 
|---|
|  | 158 |  | 
|---|
|  | 159 |  | 
|---|
|  | 160 | /* Asynchronous behavior.  Keep in sync with | 
|---|
|  | 161 | libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_async_t.  */ | 
|---|
|  | 162 |  | 
|---|
|  | 163 | #define GOMP_ASYNC_NOVAL                -1 | 
|---|
|  | 164 | #define GOMP_ASYNC_SYNC                 -2 | 
|---|
|  | 165 |  | 
|---|
|  | 166 |  | 
|---|
|  | 167 | /* Device codes.  Keep in sync with | 
|---|
|  | 168 | libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_device_t as well as | 
|---|
|  | 169 | libgomp/libgomp-plugin.h.  */ | 
|---|
|  | 170 | #define GOMP_DEVICE_NONE                0 | 
|---|
|  | 171 | #define GOMP_DEVICE_DEFAULT             1 | 
|---|
|  | 172 | #define GOMP_DEVICE_HOST                2 | 
|---|
|  | 173 | /* #define GOMP_DEVICE_HOST_NONSHM      3 removed.  */ | 
|---|
|  | 174 | #define GOMP_DEVICE_NOT_HOST            4 | 
|---|
|  | 175 | #define GOMP_DEVICE_NVIDIA_PTX          5 | 
|---|
|  | 176 | #define GOMP_DEVICE_INTEL_MIC           6 | 
|---|
|  | 177 | #define GOMP_DEVICE_HSA                 7 | 
|---|
|  | 178 |  | 
|---|
|  | 179 | #define GOMP_DEVICE_ICV                 -1 | 
|---|
|  | 180 | #define GOMP_DEVICE_HOST_FALLBACK       -2 | 
|---|
|  | 181 |  | 
|---|
|  | 182 | /* GOMP_task/GOMP_taskloop* flags argument.  */ | 
|---|
|  | 183 | #define GOMP_TASK_FLAG_UNTIED           (1 << 0) | 
|---|
|  | 184 | #define GOMP_TASK_FLAG_FINAL            (1 << 1) | 
|---|
|  | 185 | #define GOMP_TASK_FLAG_MERGEABLE        (1 << 2) | 
|---|
|  | 186 | #define GOMP_TASK_FLAG_DEPEND           (1 << 3) | 
|---|
|  | 187 | #define GOMP_TASK_FLAG_PRIORITY         (1 << 4) | 
|---|
|  | 188 | #define GOMP_TASK_FLAG_UP               (1 << 8) | 
|---|
|  | 189 | #define GOMP_TASK_FLAG_GRAINSIZE        (1 << 9) | 
|---|
|  | 190 | #define GOMP_TASK_FLAG_IF               (1 << 10) | 
|---|
|  | 191 | #define GOMP_TASK_FLAG_NOGROUP          (1 << 11) | 
|---|
|  | 192 |  | 
|---|
|  | 193 | /* GOMP_target{_ext,update_ext,enter_exit_data} flags argument.  */ | 
|---|
|  | 194 | #define GOMP_TARGET_FLAG_NOWAIT         (1 << 0) | 
|---|
|  | 195 | #define GOMP_TARGET_FLAG_EXIT_DATA      (1 << 1) | 
|---|
|  | 196 | /* Internal to libgomp.  */ | 
|---|
|  | 197 | #define GOMP_TARGET_FLAG_UPDATE         (1U << 31) | 
|---|
|  | 198 |  | 
|---|
|  | 199 | /* Versions of libgomp and device-specific plugins.  GOMP_VERSION | 
|---|
|  | 200 | should be incremented whenever an ABI-incompatible change is introduced | 
|---|
|  | 201 | to the plugin interface defined in libgomp/libgomp.h.  */ | 
|---|
|  | 202 | #define GOMP_VERSION    1 | 
|---|
|  | 203 | #define GOMP_VERSION_NVIDIA_PTX 1 | 
|---|
|  | 204 | #define GOMP_VERSION_INTEL_MIC 0 | 
|---|
|  | 205 | #define GOMP_VERSION_HSA 0 | 
|---|
|  | 206 |  | 
|---|
|  | 207 | #define GOMP_VERSION_PACK(LIB, DEV) (((LIB) << 16) | (DEV)) | 
|---|
|  | 208 | #define GOMP_VERSION_LIB(PACK) (((PACK) >> 16) & 0xffff) | 
|---|
|  | 209 | #define GOMP_VERSION_DEV(PACK) ((PACK) & 0xffff) | 
|---|
|  | 210 |  | 
|---|
|  | 211 | #define GOMP_DIM_GANG   0 | 
|---|
|  | 212 | #define GOMP_DIM_WORKER 1 | 
|---|
|  | 213 | #define GOMP_DIM_VECTOR 2 | 
|---|
|  | 214 | #define GOMP_DIM_MAX    3 | 
|---|
|  | 215 | #define GOMP_DIM_MASK(X) (1u << (X)) | 
|---|
|  | 216 |  | 
|---|
|  | 217 | /* Varadic launch arguments.  End of list is marked by a zero.  */ | 
|---|
|  | 218 | #define GOMP_LAUNCH_DIM         1  /* Launch dimensions, op = mask */ | 
|---|
|  | 219 | #define GOMP_LAUNCH_ASYNC       2  /* Async, op = cst val if not MAX  */ | 
|---|
|  | 220 | #define GOMP_LAUNCH_WAIT        3  /* Waits, op = num waits.  */ | 
|---|
|  | 221 | #define GOMP_LAUNCH_CODE_SHIFT  28 | 
|---|
|  | 222 | #define GOMP_LAUNCH_DEVICE_SHIFT 16 | 
|---|
|  | 223 | #define GOMP_LAUNCH_OP_SHIFT 0 | 
|---|
|  | 224 | #define GOMP_LAUNCH_PACK(CODE,DEVICE,OP)        \ | 
|---|
|  | 225 | (((CODE) << GOMP_LAUNCH_CODE_SHIFT)           \ | 
|---|
|  | 226 | | ((DEVICE) << GOMP_LAUNCH_DEVICE_SHIFT)     \ | 
|---|
|  | 227 | | ((OP) << GOMP_LAUNCH_OP_SHIFT)) | 
|---|
|  | 228 | #define GOMP_LAUNCH_CODE(X) (((X) >> GOMP_LAUNCH_CODE_SHIFT) & 0xf) | 
|---|
|  | 229 | #define GOMP_LAUNCH_DEVICE(X) (((X) >> GOMP_LAUNCH_DEVICE_SHIFT) & 0xfff) | 
|---|
|  | 230 | #define GOMP_LAUNCH_OP(X) (((X) >> GOMP_LAUNCH_OP_SHIFT) & 0xffff) | 
|---|
|  | 231 | #define GOMP_LAUNCH_OP_MAX 0xffff | 
|---|
|  | 232 |  | 
|---|
|  | 233 | /* Bitmask to apply in order to find out the intended device of a target | 
|---|
|  | 234 | argument.  */ | 
|---|
|  | 235 | #define GOMP_TARGET_ARG_DEVICE_MASK             ((1 << 7) - 1) | 
|---|
|  | 236 | /* The target argument is significant for all devices.  */ | 
|---|
|  | 237 | #define GOMP_TARGET_ARG_DEVICE_ALL              0 | 
|---|
|  | 238 |  | 
|---|
|  | 239 | /* Flag set when the subsequent element in the device-specific argument | 
|---|
|  | 240 | values.  */ | 
|---|
|  | 241 | #define GOMP_TARGET_ARG_SUBSEQUENT_PARAM        (1 << 7) | 
|---|
|  | 242 |  | 
|---|
|  | 243 | /* Bitmask to apply to a target argument to find out the value identifier.  */ | 
|---|
|  | 244 | #define GOMP_TARGET_ARG_ID_MASK                 (((1 << 8) - 1) << 8) | 
|---|
|  | 245 | /* Target argument index of NUM_TEAMS.  */ | 
|---|
|  | 246 | #define GOMP_TARGET_ARG_NUM_TEAMS               (1 << 8) | 
|---|
|  | 247 | /* Target argument index of THREAD_LIMIT.  */ | 
|---|
|  | 248 | #define GOMP_TARGET_ARG_THREAD_LIMIT            (2 << 8) | 
|---|
|  | 249 |  | 
|---|
|  | 250 | /* If the value is directly embeded in target argument, it should be a 16-bit | 
|---|
|  | 251 | at most and shifted by this many bits.  */ | 
|---|
|  | 252 | #define GOMP_TARGET_ARG_VALUE_SHIFT             16 | 
|---|
|  | 253 |  | 
|---|
|  | 254 | /* HSA specific data structures.  */ | 
|---|
|  | 255 |  | 
|---|
|  | 256 | /* Identifiers of device-specific target arguments.  */ | 
|---|
|  | 257 | #define GOMP_TARGET_ARG_HSA_KERNEL_ATTRIBUTES   (1 << 8) | 
|---|
|  | 258 |  | 
|---|
|  | 259 | #endif | 
|---|