1 /* CUDA API description.
2    Copyright (C) 2017-2020 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10 
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
19 
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 <http://www.gnu.org/licenses/>.
24 
25 This header provides the minimum amount of typedefs, enums and function
26 declarations to be able to compile plugin-nvptx.c if cuda.h and
27 libcuda.so.1 are not available.  */
28 
29 #ifndef GCC_CUDA_H
30 #define GCC_CUDA_H
31 
32 #include <stdlib.h>
33 
34 #define CUDA_VERSION 8000
35 
36 typedef void *CUcontext;
37 typedef int CUdevice;
38 #if defined(__LP64__) || defined(_WIN64)
39 typedef unsigned long long CUdeviceptr;
40 #else
41 typedef unsigned CUdeviceptr;
42 #endif
43 typedef void *CUevent;
44 typedef void *CUfunction;
45 typedef void *CUlinkState;
46 typedef void *CUmodule;
47 typedef size_t (*CUoccupancyB2DSize)(int);
48 typedef void *CUstream;
49 
50 typedef enum {
51   CUDA_SUCCESS = 0,
52   CUDA_ERROR_INVALID_VALUE = 1,
53   CUDA_ERROR_OUT_OF_MEMORY = 2,
54   CUDA_ERROR_INVALID_CONTEXT = 201,
55   CUDA_ERROR_NOT_FOUND = 500,
56   CUDA_ERROR_NOT_READY = 600,
57   CUDA_ERROR_LAUNCH_FAILED = 719,
58   CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE = 720,
59   CUDA_ERROR_NOT_PERMITTED = 800,
60   CUDA_ERROR_NOT_SUPPORTED = 801,
61   CUDA_ERROR_UNKNOWN = 999
62 } CUresult;
63 
64 typedef enum {
65   CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 1,
66   CU_DEVICE_ATTRIBUTE_WARP_SIZE = 10,
67   CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK = 12,
68   CU_DEVICE_ATTRIBUTE_CLOCK_RATE = 13,
69   CU_DEVICE_ATTRIBUTE_GPU_OVERLAP = 15,
70   CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT = 16,
71   CU_DEVICE_ATTRIBUTE_INTEGRATED = 18,
72   CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY = 19,
73   CU_DEVICE_ATTRIBUTE_COMPUTE_MODE = 20,
74   CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS = 31,
75   CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR = 39,
76   CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT = 40,
77   CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR = 82
78 } CUdevice_attribute;
79 
80 enum {
81   CU_EVENT_DEFAULT = 0,
82   CU_EVENT_DISABLE_TIMING = 2
83 };
84 
85 typedef enum {
86   CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 0,
87   CU_FUNC_ATTRIBUTE_NUM_REGS = 4
88 } CUfunction_attribute;
89 
90 typedef enum {
91   CU_JIT_WALL_TIME = 2,
92   CU_JIT_INFO_LOG_BUFFER = 3,
93   CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES = 4,
94   CU_JIT_ERROR_LOG_BUFFER = 5,
95   CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES = 6,
96   CU_JIT_OPTIMIZATION_LEVEL = 7,
97   CU_JIT_LOG_VERBOSE = 12
98 } CUjit_option;
99 
100 typedef enum {
101   CU_JIT_INPUT_PTX = 1
102 } CUjitInputType;
103 
104 enum {
105   CU_CTX_SCHED_AUTO = 0
106 };
107 
108 #define CU_LAUNCH_PARAM_END ((void *) 0)
109 #define CU_LAUNCH_PARAM_BUFFER_POINTER ((void *) 1)
110 #define CU_LAUNCH_PARAM_BUFFER_SIZE ((void *) 2)
111 
112 enum {
113   CU_STREAM_DEFAULT = 0,
114   CU_STREAM_NON_BLOCKING = 1
115 };
116 
117 #define cuCtxCreate cuCtxCreate_v2
118 CUresult cuCtxCreate (CUcontext *, unsigned, CUdevice);
119 #define cuCtxDestroy cuCtxDestroy_v2
120 CUresult cuCtxDestroy (CUcontext);
121 CUresult cuCtxGetCurrent (CUcontext *);
122 CUresult cuCtxGetDevice (CUdevice *);
123 #define cuCtxPopCurrent cuCtxPopCurrent_v2
124 CUresult cuCtxPopCurrent (CUcontext *);
125 #define cuCtxPushCurrent cuCtxPushCurrent_v2
126 CUresult cuCtxPushCurrent (CUcontext);
127 CUresult cuCtxSynchronize (void);
128 CUresult cuDeviceGet (CUdevice *, int);
129 #define cuDeviceTotalMem cuDeviceTotalMem_v2
130 CUresult cuDeviceTotalMem (size_t *, CUdevice);
131 CUresult cuDeviceGetAttribute (int *, CUdevice_attribute, CUdevice);
132 CUresult cuDeviceGetCount (int *);
133 CUresult cuDeviceGetName (char *, int, CUdevice);
134 CUresult cuEventCreate (CUevent *, unsigned);
135 #define cuEventDestroy cuEventDestroy_v2
136 CUresult cuEventDestroy (CUevent);
137 CUresult cuEventElapsedTime (float *, CUevent, CUevent);
138 CUresult cuEventQuery (CUevent);
139 CUresult cuEventRecord (CUevent, CUstream);
140 CUresult cuEventSynchronize (CUevent);
141 CUresult cuFuncGetAttribute (int *, CUfunction_attribute, CUfunction);
142 CUresult cuGetErrorString (CUresult, const char **);
143 CUresult cuInit (unsigned);
144 CUresult cuDriverGetVersion (int *);
145 CUresult cuLaunchKernel (CUfunction, unsigned, unsigned, unsigned, unsigned,
146 			 unsigned, unsigned, unsigned, CUstream, void **, void **);
147 #define cuLinkAddData cuLinkAddData_v2
148 CUresult cuLinkAddData (CUlinkState, CUjitInputType, void *, size_t, const char *,
149 			unsigned, CUjit_option *, void **);
150 CUresult cuLinkComplete (CUlinkState, void **, size_t *);
151 #define cuLinkCreate cuLinkCreate_v2
152 CUresult cuLinkCreate (unsigned, CUjit_option *, void **, CUlinkState *);
153 CUresult cuLinkDestroy (CUlinkState);
154 #define cuMemGetInfo cuMemGetInfo_v2
155 CUresult cuMemGetInfo (size_t *, size_t *);
156 #define cuMemAlloc cuMemAlloc_v2
157 CUresult cuMemAlloc (CUdeviceptr *, size_t);
158 #define cuMemAllocHost cuMemAllocHost_v2
159 CUresult cuMemAllocHost (void **, size_t);
160 CUresult cuMemcpy (CUdeviceptr, CUdeviceptr, size_t);
161 #define cuMemcpyDtoDAsync cuMemcpyDtoDAsync_v2
162 CUresult cuMemcpyDtoDAsync (CUdeviceptr, CUdeviceptr, size_t, CUstream);
163 #define cuMemcpyDtoH cuMemcpyDtoH_v2
164 CUresult cuMemcpyDtoH (void *, CUdeviceptr, size_t);
165 #define cuMemcpyDtoHAsync cuMemcpyDtoHAsync_v2
166 CUresult cuMemcpyDtoHAsync (void *, CUdeviceptr, size_t, CUstream);
167 #define cuMemcpyHtoD cuMemcpyHtoD_v2
168 CUresult cuMemcpyHtoD (CUdeviceptr, const void *, size_t);
169 #define cuMemcpyHtoDAsync cuMemcpyHtoDAsync_v2
170 CUresult cuMemcpyHtoDAsync (CUdeviceptr, const void *, size_t, CUstream);
171 #define cuMemFree cuMemFree_v2
172 CUresult cuMemFree (CUdeviceptr);
173 CUresult cuMemFreeHost (void *);
174 #define cuMemGetAddressRange cuMemGetAddressRange_v2
175 CUresult cuMemGetAddressRange (CUdeviceptr *, size_t *, CUdeviceptr);
176 #define cuMemHostGetDevicePointer cuMemHostGetDevicePointer_v2
177 CUresult cuMemHostGetDevicePointer (CUdeviceptr *, void *, unsigned);
178 CUresult cuModuleGetFunction (CUfunction *, CUmodule, const char *);
179 #define cuModuleGetGlobal cuModuleGetGlobal_v2
180 CUresult cuModuleGetGlobal (CUdeviceptr *, size_t *, CUmodule, const char *);
181 CUresult cuModuleLoad (CUmodule *, const char *);
182 CUresult cuModuleLoadData (CUmodule *, const void *);
183 CUresult cuModuleUnload (CUmodule);
184 CUresult cuOccupancyMaxPotentialBlockSize(int *, int *, CUfunction,
185 					  CUoccupancyB2DSize, size_t, int);
186 typedef void (*CUstreamCallback)(CUstream, CUresult, void *);
187 CUresult cuStreamAddCallback(CUstream, CUstreamCallback, void *, unsigned int);
188 CUresult cuStreamCreate (CUstream *, unsigned);
189 #define cuStreamDestroy cuStreamDestroy_v2
190 CUresult cuStreamDestroy (CUstream);
191 CUresult cuStreamQuery (CUstream);
192 CUresult cuStreamSynchronize (CUstream);
193 CUresult cuStreamWaitEvent (CUstream, CUevent, unsigned);
194 
195 #endif /* GCC_CUDA_H */
196