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